diff --git a/fqnews2/.build.yml b/fqnews2/.build.yml
new file mode 100644
index 000000000..182ba0ab2
--- /dev/null
+++ b/fqnews2/.build.yml
@@ -0,0 +1,41 @@
+image: debian/stretch
+packages:
+ - git
+ - openjdk-8-jdk-headless
+ - wget
+ - tar
+ - unzip
+ - lib32stdc++6
+ - lib32z1
+ - file
+ - mesa-utils
+ - pciutils
+environment:
+ ANDROID_COMPILE_SDK: "28"
+ ANDROID_BUILD_TOOLS: "28.0.3"
+ ANDROID_EMULATOR_SDK: "28"
+ GRADLE_USER_HOME: "/home/build/.gradle"
+ ANDROID_HOME: "/home/build/.androidhome"
+sources:
+ - https://git.sr.ht/~cowboyprogrammer/feeder
+triggers:
+ - action: email
+ condition: failure
+ to: jonas.srht@cowboyprogrammer.org
+secrets:
+ - d9eb6ad0-7288-447a-954b-74e22ef4d054
+ - c492e32e-551e-42e8-b8d5-c252fc20b625
+ - 8a654fa4-6c85-480f-abee-d3b50d92d5f7
+tasks:
+ - setup: |
+ export PATH="${ANDROID_HOME}/emulator/:${ANDROID_HOME}/tools/bin/:${ANDROID_HOME}/tools/:${ANDROID_HOME}/platform-tools/:${PATH}"
+ env
+ cd feeder
+ echo 'org.gradle.jvmargs=-Xmx1g' >> gradle.properties
+ ci/before
+ - build: |
+ cd feeder
+ ./gradlew build
+ - deploy: |
+ cd feeder
+ ci/deploy_playstore
diff --git a/fqnews2/.editorconfig b/fqnews2/.editorconfig
new file mode 100644
index 000000000..c7141024a
--- /dev/null
+++ b/fqnews2/.editorconfig
@@ -0,0 +1,29 @@
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+tab_width = 4
+ij_continuation_indent_size = 8
+ij_formatter_off_tag = @formatter:off
+ij_formatter_on_tag = @formatter:on
+ij_formatter_tags_enabled = false
+ij_smart_tabs = false
+ij_visual_guides = none
+ij_wrap_on_typing = false
+
+[*.{kt,kts}]
+max_line_length = 200
+ktlint_code_style = ktlint_official
+ktlint_function_naming_ignore_when_annotated_with=Composable
+compose_allowed_composition_locals = LocalTypographySettings,LocalDI,LocalDimens,LocalWindowSizeMetrics,LocalWindowSize,LocalFoldableHinge
+compose_allowed_forwarding = .*Screen
+
+[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.opml,*.rng,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul,rss_kuketz,rss_morningpaper}]
+indent_size = 2
+tab_width = 2
+
+[{*.bash,*.sh,*.zsh}]
+indent_size = 2
+tab_width = 2
diff --git a/fqnews2/.gitignore b/fqnews2/.gitignore
new file mode 100644
index 000000000..08f042fd2
--- /dev/null
+++ b/fqnews2/.gitignore
@@ -0,0 +1,16 @@
+*.iml
+build
+.gradle
+.idea
+local.properties
+*.db
+*.substvars
+.pybuild
+*.debhelper
+captures
+creds.json
+report.xml
+app/creds.b64
+keystore.b64
+devenv.local
+keystore
diff --git a/fqnews2/.gitlab-ci.bak b/fqnews2/.gitlab-ci.bak
new file mode 100644
index 000000000..aa60c5b0f
--- /dev/null
+++ b/fqnews2/.gitlab-ci.bak
@@ -0,0 +1,80 @@
+stages:
+ - build
+ - validate_deploy
+ - deploy
+
+image: registry.gitlab.com/spacecowboy/feeder:builder
+
+variables:
+ GIT_SUBMODULE_STRATEGY: recursive
+
+cache:
+ key: "uber"
+ paths:
+ - .gradle/caches
+ - .gradle/wrapper
+
+lint:
+ stage: build
+ script:
+ - source devenv && ./gradlew :app:lint
+ needs: []
+
+test:
+ stage: build
+ script:
+ - source devenv && ./gradlew test :jsonfeed-parser:check
+ needs: []
+ artifacts:
+ paths:
+ - app/build/reports/
+
+compileTest:
+ stage: build
+ script:
+ - source devenv && ./gradlew packageDebugAndroidTest
+ needs: []
+ artifacts:
+ paths:
+ - app/build/outputs/
+ - build/logs/
+
+compilePlay:
+ stage: build
+ script:
+ - source devenv && ./gradlew assemblePlay
+ needs: []
+ artifacts:
+ paths:
+ - app/build/outputs/
+ - build/logs/
+
+compileRelease:
+ stage: build
+ script:
+ - source devenv && ./gradlew assembleRelease
+ needs: []
+ artifacts:
+ paths:
+ - app/build/outputs/
+ - build/logs/
+
+validate_deployment:
+ stage: validate_deploy
+ script:
+ - source devenv && ci/run-if-not-release ./deploy_playstore.sh --dry-run
+ needs: []
+ only:
+ - master
+ - tags
+
+deploy_playstore:
+ stage: deploy
+ script:
+ - source devenv && ./deploy_playstore.sh
+ needs: ["validate_deployment", "compilePlay", "compileRelease", "compileTest", "lint", "test"]
+ only:
+ - tags
+ environment:
+ name: Play
+ url: https://play.google.com/store/apps/details?id=jww.app.hwnews
diff --git a/fqnews2/.gitmodules b/fqnews2/.gitmodules
new file mode 100644
index 000000000..e69de29bb
diff --git a/fqnews2/CHANGELOG.md b/fqnews2/CHANGELOG.md
new file mode 100644
index 000000000..46b615b8b
--- /dev/null
+++ b/fqnews2/CHANGELOG.md
@@ -0,0 +1,4177 @@
+# 2.6.30
+439JBYL80IGQTF25UXNR0X1BG (1):
+ * [e07fe830] Updated Russian translation using Weblate
+
+Eduardo (1):
+ * [e27e0590] Updated Portuguese (Brazil) translation using Weblate
+
+Jonas Kalderstam (1):
+ * [e41f0736] Explicitly silenced notifications
+
+Matth78 (1):
+ * [371ba2fb] Updated French translation using Weblate
+
+Simona Iacob (1):
+ * [e544cfaa] Updated Romanian translation using Weblate
+
+Wiccio (1):
+ * [78dac594] Translated using Weblate (Italian)
+
+gallegonovato (1):
+ * [90dbe599] Updated Spanish translation using Weblate
+
+trunars (1):
+ * [d9f81898] Updated Bulgarian translation using Weblate
+
+zmni (1):
+ * [13b2fd65] Updated Indonesian translation using Weblate
+
+# 2.6.29
+Mattia Passeri (1):
+ * [2e709205e] Translated using Weblate (Italian)
+
+eevan78 (1):
+ * [b02523b6c] Updated Serbian translation using Weblate
+
+gallegonovato (1):
+ * [f6cb7f795] Updated Spanish translation using Weblate
+
+noSé (1):
+ * [59c675b30] Updated Spanish translation using Weblate
+
+Λευτέρης Τ (1):
+ * [6ce06cd04] Updated Greek translation using Weblate
+
+# 2.6.28
+Agnieszka C (1):
+ * [9fbe413d7] Updated Polish translation using Weblate
+
+Jonas Kalderstam (4):
+ * [0c2dfbcca] Fixed order of modifiers
+ * [98f3fa8a4] Fixed crash with table spans
+ * [d4a96558a] Fixed full text parsing sporadically showing error message
+ * [eabf243fc] Added support for RTL tables
+
+Matth78 (1):
+ * [825b37ea2] Updated French translation using Weblate
+
+Oğuz Ersen (1):
+ * [4c1323277] Updated Turkish translation using Weblate
+
+Scrambled777 (1):
+ * [57b2eedca] Updated Hindi translation using Weblate
+
+Sven Jacobs (1):
+ * [c04fdcba4] Fixed unread count in title for tags (#308)
+
+VfBFan (1):
+ * [6712f8c4b] Updated German translation using Weblate
+
+bittin1ddc447d824349b2 (1):
+ * [ca8d841c8] Updated Swedish translation using Weblate
+
+bowornsin (1):
+ * [257138d4e] Updated Thai translation using Weblate
+
+gallegonovato (1):
+ * [46f301b81] Updated Spanish translation using Weblate
+
+josé m (1):
+ * [e96270d63] Updated Galician translation using Weblate
+
+pchelium (1):
+ * [939960bba] Updated Czech translation using Weblate
+
+trunars (1):
+ * [0194e5452] Updated Bulgarian translation using Weblate
+
+محمد (1):
+ * [451b6b6e9] Updated Arabic translation using Weblate
+
+大王叫我来巡山 (1):
+ * [e8ddc8ea7] Updated Chinese (Simplified) translation using Weblate
+
+# 2.6.27
+Jonas Kalderstam (3):
+ * [f23390ed0] Fixed nested content inside blockquotes
+ * [5bdd17043] Fixed crash for some images
+ * [35004eee5] Added German translation
+
+Sven Jacobs (1):
+ * [a42529eab] Added option to show unread count in title (#300)
+
+ngocanhtve (1):
+ * [1e0fc0fae] Updated Vietnamese translation using Weblate
+
+# 2.6.26
+Agnieszka C (1):
+ * [7fd77f475] Updated Polish translation using Weblate
+
+Jonas Kalderstam (7):
+ * [769423012] Fixed email links not opening email client
+ * [4a96932ec] Added support for iframes inside figures
+ * [8ac5fa68f] Fixed parsed width/height of iframes
+ * [57490d923] Fixed some crashes related to article viewing
+ * [4bfe0f9f3] Fixed a crash in reader
+ * [0277df664] Fixed number of columns for tablets
+ * [4c09edb7c] Fixed too large images on tablets
+
+Matth78 (1):
+ * [554eaa5f8] Updated French translation using Weblate
+
+Oğuz Ersen (1):
+ * [f28fbf1ac] Updated Turkish translation using Weblate
+
+Scrambled777 (1):
+ * [4b89f1d48] Updated Hindi translation using Weblate
+
+bittin1ddc447d824349b2 (1):
+ * [c26f657f2] Updated Swedish translation using Weblate
+
+gallegonovato (1):
+ * [fb9541e5a] Updated Spanish translation using Weblate
+
+josé m (1):
+ * [87bd74dd5] Updated Galician translation using Weblate
+
+pchelium (1):
+ * [cf1ae0f52] Updated Czech translation using Weblate
+
+大王叫我来巡山 (1):
+ * [85001e889] Updated Chinese (Simplified) translation using Weblate
+
+# 2.6.25
+Jonas Kalderstam (6):
+ * [dea0a7092] Updated release pipeline to always publish APKs even if Play
+ store is dumb
+ * [26b71e8dd] Fixed release pipeline syntax
+ * [040255905] Added ktlint to gradle
+ * [ebb5ea81a] Ensured retry-after is respected, even when feeds share the
+ same host
+ * [42ce72343] Rewrote reader layout engine. Adds real table support.
+ * [e76526be9] Fixed test
+
+eevan78 (2):
+ * [1d306a759] Updated Serbian translation using Weblate
+ * [0b19e6d44] Translated using Weblate (Serbian)
+
+hugoalh (1):
+ * [eb7fc21d5] Updated Chinese (Traditional) translation using Weblate
+
+josé m (2):
+ * [2d1bfdb2f] Updated Galician translation using Weblate
+ * [596822c61] Updated Galician translation using Weblate
+
+v1s7 (1):
+ * [d7da5ad37] Updated Russian translation using Weblate
+
+Λευτέρης Τ (1):
+ * [817acf02f] Updated Greek translation using Weblate
+
+# 2.6.24
+Jonas Kalderstam (1):
+ * [8a86acbd] Fixed performance when many entries in blocklist
+
+# 2.6.23
+Aitor Salaberria (1):
+ * [d719ced2] Translated using Weblate (Basque)
+
+Belmar Begić (1):
+ * [42e567d5] Updated Bosnian translation using Weblate
+
+Jonas Kalderstam (7):
+ * [f2486f3c] Upgraded some dependency versions
+ * [e69ed180] Fixed sync indicator: should now stay on screen as long as
+ sync is running
+ * [10358f20] Fixed deprecation warnings
+ * [05e1066c] Removed unused proguard rule
+ * [8d87a2a1] Fixed broken navigation after version upgrade
+ * [cd1d3df0] Fixed foreground service changes in Android 14
+ * [7939495a] Fixed Saved Articles count only showing unread instead of
+ total
+
+Vitor Henrique (1):
+ * [67ab5429] Updated Portuguese (Brazil) translation using Weblate
+
+bowornsin (1):
+ * [e699f62a] Updated Thai translation using Weblate
+
+ngocanhtve (1):
+ * [fa7eb98a] Translated using Weblate (Vietnamese)
+
+zmni (1):
+ * [b56e987b] Updated Indonesian translation using Weblate
+
+# 2.6.22
+Jonas Kalderstam (4):
+ * [166390e5] Fixed so sync will never run when no network available
+ * [eac1b124] Fixed performance of NavDrawer. If you have many feeds you
+ will notice a big difference
+ * [178ea561] Fixed resource usage during sync. It might be slower now
+ though.
+ * [f02c3118] Fixed a resource leak with OkHTTP
+
+Pablo Wildson (1):
+ * [ea828a07] Translated using Weblate (Portuguese (Brazil))
+
+atilluF (1):
+ * [a5c25344] Updated Italian translation using Weblate
+
+lucasmz (1):
+ * [b62bf581] Updated Portuguese (Brazil) translation using Weblate
+
+# 2.6.21
+Jonas Kalderstam (2):
+ * [0d564b74] Fixed Settings preview
+ * [1090fcba] Tweaked Cache-Control headers to respect site headers even
+ more
+
+Naxvog (1):
+ * [0dec77a1] Updated German translation using Weblate
+
+Open Contribution (1):
+ * [84b03798] Updated Greek translation using Weblate
+
+Pablo Wildson (1):
+ * [7e7febbf] Updated Portuguese (Brazil) translation using Weblate
+
+Paulius Šukys (1):
+ * [0c2c3a8b] Updated Lithuanian translation using Weblate
+
+trunars (1):
+ * [b8eb2edd] Updated Bulgarian translation using Weblate
+
+Ács Zoltán (1):
+ * [2556b909] Updated Hungarian translation using Weblate
+
+Сергій (1):
+ * [f8961a42] Updated Ukrainian translation using Weblate
+
+# 2.6.20
+Agnieszka C (1):
+ * [f13c3c3f] Updated Polish translation using Weblate
+
+Alex Gavrishev (1):
+ * [80fd92f3] Added new article style: compact card layout (#243)
+
+Jonas Kalderstam (6):
+ * [3684b5d7] Changed "already read" label to "read" instead
+ * [233d6ce9] Fixed talkback for delete dialog
+ * [edc8966d] Fixed some timezone handling in publication dates
+ * [0845a3b4] Tried to make a test less flaky
+ * [e0219f24] Made feed parsing more lenient because I'm sick of bug
+ reports for sites with incorrect content-types
+ * [bec3f1eb] Updated Japanese translation using Weblate
+
+Kartikeya Hegde (1):
+ * [10437fa2] Added select all button to delete feed dialog (#234)
+
+Matth78 (1):
+ * [c4a15c31] Updated French translation using Weblate
+
+Mikachu (1):
+ * [d3f877f0] Translated using Weblate (Dutch)
+
+Muro (1):
+ * [95c0b910] Updated Turkish translation using Weblate
+
+Oğuz Ersen (1):
+ * [4df745ff] Updated Turkish translation using Weblate
+
+Scrambled777 (1):
+ * [75247321] Updated Hindi translation using Weblate
+
+bowornsin (1):
+ * [3d094c7d] Translated using Weblate (Thai)
+
+gallegonovato (1):
+ * [6e7caea3] Updated Spanish translation using Weblate
+
+josé m (1):
+ * [a83ad85f] Updated Galician translation using Weblate
+
+pchelium (1):
+ * [72fdcc0f] Updated Czech translation using Weblate
+
+Ács Zoltán (1):
+ * [2d57c635] Updated Hungarian translation using Weblate
+
+大王叫我来巡山 (1):
+ * [8dd7ee20] Updated Chinese (Simplified) translation using Weblate
+
+# 2.6.19
+Eduardo (1):
+ * [b128dfdc] Translated using Weblate (Portuguese (Brazil))
+
+Jonas Kalderstam (1):
+ * [ef92b203] Changed feed parsing library to Gofeed
+
+Matth78 (1):
+ * [4f6116ee] Updated French translation using Weblate
+
+Simona Iacob (1):
+ * [03b68324] Updated Romanian translation using Weblate
+
+ikanakova (1):
+ * [ac47c2b7] Translated using Weblate (Czech)
+
+trunars (1):
+ * [1823402c] Updated Bulgarian translation using Weblate
+
+Сергій (1):
+ * [c3ac47bd] Updated Ukrainian translation using Weblate
+
+# 2.6.18
+Agnieszka C (1):
+ * [2a4acaef] Updated Polish translation using Weblate
+
+H Tamás (2):
+ * [17053d16] Updated Hungarian translation using Weblate
+ * [aced2492] Translated using Weblate (Hungarian)
+
+Jonas Kalderstam (1):
+ * [c640f0c9] Added skip duplicates as option for feeds
+
+Kazushi Hayama (1):
+ * [abf942ea] Updated Japanese translation using Weblate
+
+Oğuz Ersen (1):
+ * [e9d7eee2] Updated Turkish translation using Weblate
+
+Scrambled777 (1):
+ * [386b3bc5] Updated Hindi translation using Weblate
+
+VfBFan (1):
+ * [3ae52e2b] Updated German translation using Weblate
+
+gallegonovato (1):
+ * [425fa2fe] Updated Spanish translation using Weblate
+
+josé m (1):
+ * [747dba1d] Updated Galician translation using Weblate
+
+pchelium (1):
+ * [ff73f6d9] Updated Czech translation using Weblate
+
+v1s7 (1):
+ * [0fa8c78e] Updated Russian translation using Weblate
+
+大王叫我来巡山 (1):
+ * [dc9417bb] Updated Chinese (Simplified) translation using Weblate
+
+# 2.6.17
+Agnieszka C (1):
+ * [735920e6] Translated using Weblate (Polish)
+
+Anonymous (1):
+ * [b65a7a11] Translated using Weblate (Basque)
+
+Jonas Kalderstam (3):
+ * [bcac30c7] Updated README and store descriptions
+ * [c6b79e3d] Changed so duplicate stories are ignored
+ * [d661f9b5] Fixed articles getting mixed with other articles sometimes
+
+Nitin Khalia (1):
+ * [aa584e20] Translated using Weblate (Hindi)
+
+Oğuz Ersen (1):
+ * [85ace16d] Translated using Weblate (Turkish)
+
+VfBFan (1):
+ * [22759475] Translated using Weblate (German)
+
+Vitor Henrique (1):
+ * [5a3b2222] Updated Portuguese (Brazil) translation using Weblate
+
+bittin1ddc447d824349b2 (1):
+ * [752755c4] Updated Swedish translation using Weblate
+
+gallegonovato (1):
+ * [4b412585] Translated using Weblate (Spanish)
+
+homocomputeris (1):
+ * [cac3ead4] Updated Russian translation using Weblate
+
+trunars (1):
+ * [a52a8f04] Translated using Weblate (Bulgarian)
+
+v1s7 (1):
+ * [49917664] Translated using Weblate (Russian)
+
+Ács Zoltán (1):
+ * [bc0f49cd] Updated Hungarian translation using Weblate
+
+Åzze (1):
+ * [7b6bc6b2] Updated Finnish translation using Weblate
+
+Сергій (1):
+ * [d7392440] Translated using Weblate (Ukrainian)
+
+# 2.6.16
+Jonas Kalderstam (1):
+ * [78919404] Added ability to export saved articles
+
+Adam Jermstad (1):
+ * [95d1979a] Update README screenshot references
+
+Agnieszka C (1):
+ * [832cfce5] Updated Polish translation using Weblate
+
+Eduardo (1):
+ * [9067ff5d] Updated Portuguese (Brazil) translation using Weblate
+
+Matth78 (1):
+ * [dd821aad] Updated French translation using Weblate
+
+Mattia (1):
+ * [e32b060d] Updated Italian translation using Weblate
+
+Oğuz Ersen (1):
+ * [4976c3ee] Updated Turkish translation using Weblate
+
+VfBFan (1):
+ * [54334b82] Updated German translation using Weblate
+
+gallegonovato (1):
+ * [304771ad] Updated Spanish translation using Weblate
+
+josé m (1):
+ * [3baf1030] Updated Galician translation using Weblate
+
+pchelium (1):
+ * [e971b340] Updated Czech translation using Weblate
+
+v1s7 (1):
+ * [1e571b0a] Updated Russian translation using Weblate
+
+Ács Zoltán (1):
+ * [02b01162] Updated Hungarian translation using Weblate
+
+Сергій (1):
+ * [117a61e9] Updated Ukrainian translation using Weblate
+
+大王叫我来巡山 (1):
+ * [01ccc9d2] Updated Chinese (Simplified) translation using Weblate
+
+# 2.6.15
+Agnieszka C (1):
+ * [d8d3b6e0] Updated Polish translation using Weblate
+
+ERYpTION (1):
+ * [9409eb87] Updated Danish translation using Weblate
+
+Jonas Kalderstam (5):
+ * [a2465ad4] Added Galician language component
+ * [d31d028d] Removed decorative icons from TalkBack
+ * [475abdc5] Added invisible close menu buttons for TalkBack to all
+ dropdown menus
+ * [d5a7234e] Added LeakCanary to debug builds
+ * [3f9d0507] Testing not deleting galician language
+
+Matth78 (1):
+ * [06d96170] Updated French translation using Weblate
+
+Oğuz Ersen (1):
+ * [5c039435] Updated Turkish translation using Weblate
+
+bittin1ddc447d824349b2 (1):
+ * [b56cbf6e] Updated Swedish translation using Weblate
+
+gallegonovato (1):
+ * [232d5099] Updated Spanish translation using Weblate
+
+josé m (1):
+ * [b0aa7a9c] Updated Galician translation using Weblate
+
+v1s7 (2):
+ * [39187233] Updated Russian translation using Weblate
+ * [8563c182] Updated Russian translation using Weblate
+
+zmni (1):
+ * [aa27c768] Updated Indonesian translation using Weblate
+
+Ács Zoltán (1):
+ * [286d2ac0] Updated Hungarian translation using Weblate
+
+Сергій (1):
+ * [1362067e] Updated Ukrainian translation using Weblate
+
+大王叫我来巡山 (1):
+ * [2fa7266b] Updated Chinese (Simplified) translation using Weblate
+
+# 2.6.14
+Jonas Kalderstam (1):
+ * [ff495c38] Fixed mark as read on scroll also marking items when opening
+ items
+
+trunars (1):
+ * [958df8ca] Updated Bulgarian translation using Weblate
+
+# 2.6.13
+Dritan Taulla (1):
+ * [39b9434c] Updated Albanian translation using Weblate
+
+Francesco Saltori (1):
+ * [0de8be38] Updated Italian translation using Weblate
+
+Jonas Kalderstam (4):
+ * [4e2791df] Fixed release pipeline
+ * [403133bf] Fixed mark as read on scroll
+ * [67b521a7] Fixed small thumbnails not being displayed in card style
+ * [c775fa74] Fixed crash for zero width images
+
+VfBFan (1):
+ * [2d737ef2] Updated German translation using Weblate
+
+YGXB_net (1):
+ * [384e2a22] Updated Chinese (Simplified) translation using Weblate
+
+bowornsin (1):
+ * [e5f41f6a] Updated Thai translation using Weblate
+
+Сергій (1):
+ * [b1c004f7] Updated Ukrainian translation using Weblate
+
+# 2.6.12
+Jonas Kalderstam (9):
+ * [0044d6b1] Fixed small images being rendered too large and flickering on
+ scroll
+ * [3ec908d8] Added caching on failed (4xx) network requests
+ * [aa2dfc69] Changed so tablets don't force images to be 16:9 anymore
+ * [e7484738] Added debugMini icon and app name
+ * [2fa239a4] Improved scroll performance
+ * [432d9ab0] Added support for data-img-url in images
+ * [e936b2bc] Removed debugMini configuration
+ * [4de81e11] Added emulator tests to release script
+ * [923df8ac] Removed Toki Pona Play store translation: it is not supported
+
+Agnieszka C (1):
+ * [a804a9eb] Updated Polish translation using Weblate
+
+Eric (1):
+ * [8df6f688] Updated Chinese (Simplified) translation using Weblate
+
+H Tamás (1):
+ * [707db914] Updated Hungarian translation using Weblate
+
+J. Lavoie (1):
+ * [b453bb59] Updated Italian translation using Weblate
+
+Matth78 (2):
+ * [a3b75696] Updated French translation using Weblate
+ * [86d56964] Updated French translation using Weblate
+
+Mæve Rey (1):
+ * [4a650925] Translated using Weblate (Toki Pona)
+
+Sergi Font (1):
+ * [ef850fa1] Updated Catalan translation using Weblate
+
+minh (1):
+ * [e87046b4] Updated Vietnamese translation using Weblate
+
+mm4c (1):
+ * [0ec498fc] Updated Dutch translation using Weblate
+
+zmni (1):
+ * [bcd36c36] Updated Indonesian translation using Weblate
+
+Сергій (1):
+ * [f7c2c9f7] Updated Ukrainian translation using Weblate
+
+# 2.6.11
+Aitor Salaberria (1):
+ * [a8431296] Translated using Weblate (Basque)
+
+Jonas Kalderstam (2):
+ * [5dcc336f] Fixed items getting stuck when swiping them away
+ * [784bcd34] Fixed missing files for eu-ES
+
+Mehdi Kurtcebe (1):
+ * [d230ff05] Updated Turkish translation using Weblate
+
+RT Redréovič (1):
+ * [b64609b5] Updated Esperanto translation using Weblate
+
+Retrial (1):
+ * [9f092435] Updated Greek translation using Weblate
+
+Vitor Henrique (1):
+ * [807a339a] Updated Portuguese (Brazil) translation using Weblate
+
+bittin1ddc447d824349b2 (1):
+ * [0658b474] Updated Swedish translation using Weblate
+
+# 2.6.10
+Agnieszka C (1):
+ * [1bedec87] Updated Polish translation using Weblate
+
+Belmar Begić (1):
+ * [0c4e4ca9] Updated Bosnian translation using Weblate
+
+Eric (1):
+ * [8f3b03f5] Updated Chinese (Simplified) translation using Weblate
+
+Jonas Kalderstam (12):
+ * [e89df3ba] Fixed crash when a resource string was not styled as expected
+ * [510a38ac] Added reading time/word count for languages which use spaces
+ * [d1d7b1a5] Added kurdish language file
+ * [8433be8d] Changed word/minutes to plural strings
+ * [63e5e584] Updated to ktlint 1.0.1
+ * [de62e7d8] Formatted according to latest ktlint
+ * [12bd7ccf] Added leading zero to seconds formatting
+ * [46dc5926] Fixed elements hidden by CSS being displayed
+ * [4efc9d70] Added display of article image inside reader
+ * [42533b32] Fixed image captions appearing twice in full text articles
+ * [833c51fa] Fixed ktlint triggering on compose function names
+ * [639eb889] Fixed some cover images appearing twice in reader if full
+ text
+
+Kazushi Hayama (1):
+ * [694ad69c] Updated Japanese translation using Weblate
+
+Matth78 (2):
+ * [55d2a796] Updated French translation using Weblate
+ * [d06e83e1] Updated French translation using Weblate
+
+Miraficus (1):
+ * [1760fe94] Updated Czech translation using Weblate
+
+RT Redréovič (1):
+ * [3bb9665c] Updated Esperanto translation using Weblate
+
+Simona Iacob (1):
+ * [bf39f0af] Updated Romanian translation using Weblate
+
+VfBFan (1):
+ * [b4c15b92] Updated German translation using Weblate
+
+berhat gergin (1):
+ * [78ddcc5c] Updated Kurdish translation using Weblate
+
+gallegonovato (1):
+ * [c7a535c6] Updated Spanish translation using Weblate
+
+# 2.6.9
+Jonas Kalderstam (11):
+ * [2bdade90] Fixed crash when table had no columns
+ * [03924c15] Fixed crash when trying to TTS play a missing file
+ * [cda338b7] Fixed another crash in table rendering
+ * [ccabb499] Fixed crash if trying to notify for too many items
+ * [f1a3a237] Changed so image enclosures are shown in the Reader
+ * [015f0766] Fixed so list items are not immediately given newlines if
+ followed by paragraph
+ * [020c31e7] Moved all dependencies into bundles
+ * [ce8461c1] Changed to ksp and upped kotlin and compose compile
+ * [042daa3a] Bumped android plugin version
+ * [0bcea035] Bumped bunch of versions
+ * [89775af8] Removed bad language
+
+Kazushi Hayama (1):
+ * [b5f4ca49] Updated Japanese translation using Weblate
+
+Vitor Henrique (1):
+ * [28063c3d] Translated using Weblate (Portuguese)
+
+# 2.6.8
+Agnieszka C (1):
+ * [2ffda1a6] Updated Polish translation using Weblate
+
+Eric (1):
+ * [b70dd049] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [730ecf80] Updated Italian translation using Weblate
+
+Matth78 (1):
+ * [6ca6ba6b] Updated French translation using Weblate
+
+Oğuz Ersen (1):
+ * [ce281b46] Updated Turkish translation using Weblate
+
+Retrial (1):
+ * [091dbaa4] Updated Greek translation using Weblate
+
+VfBFan (1):
+ * [7ddadba4] Updated German translation using Weblate
+
+gallegonovato (1):
+ * [c48624de] Updated Spanish translation using Weblate
+
+ikanakova (1):
+ * [d71d728b] Updated Czech translation using Weblate
+
+mm4c (1):
+ * [4a08a92c] Updated Dutch translation using Weblate
+
+ngocanhtve (1):
+ * [5d76fbeb] Updated Vietnamese translation using Weblate
+
+zmni (1):
+ * [6bdfaad2] Updated Indonesian translation using Weblate
+
+# 2.6.7-1
+Harsha0431 (1):
+ * [b23fd0b6] Updated Telugu translation using Weblate
+
+Jonas Kalderstam (11):
+ * [6d136434] Added option to open links in an adjacent window on large
+ screens
+ * [78678111] Added max age of cached responses with at most 15 mins unless
+ manual sync
+
+Mozart Michael (1):
+ * [df81e402] Updated Romanian translation using Weblate
+
+derdilla (1):
+ * [69682160] Fixed notifications not following settings for item opening
+ (#108)
+
+ngocanhtve (1):
+ * [f9109ce4] Updated Vietnamese translation using Weblate
+
+trunars (1):
+ * [010a2f96] Translated using Weblate (Bulgarian)
+
+# 2.6.7
+Cleydison Nascimento (1):
+ * [e736f383] Updated Portuguese (Brazil) translation using Weblate
+
+Harsha0431 (1):
+ * [b23fd0b6] Updated Telugu translation using Weblate
+
+Jonas Kalderstam (11):
+ * [6d136434] Added option to open links in an adjacent window on large
+ screens
+ * [78678111] Added max age of cached responses with at most 15 mins unless
+ manual sync
+
+Mozart Michael (1):
+ * [df81e402] Updated Romanian translation using Weblate
+
+derdilla (1):
+ * [69682160] Fixed notifications not following settings for item opening
+ (#108)
+
+ngocanhtve (1):
+ * [f9109ce4] Updated Vietnamese translation using Weblate
+
+trunars (1):
+ * [010a2f96] Translated using Weblate (Bulgarian)
+
+# 2.6.6
+bowornsin (1):
+ * [cac00ff3] Updated Thai translation using Weblate
+
+# 2.6.5
+Agnieszka C (1):
+ * [5fa3ac9e] Updated Polish translation using Weblate
+
+ERYpTION (1):
+ * [1f7ede07] Updated Danish translation using Weblate
+
+El Pirujo (1):
+ * [634379b0] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [9c6fe4a1] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [5a4c5c7b] Updated Italian translation using Weblate
+
+Jonas Kalderstam (1):
+ * [341310e6] Added ability to force add a feed despite network errors
+
+Oğuz Ersen (1):
+ * [88fa51db] Updated Turkish translation using Weblate
+
+Retrial (1):
+ * [5cde4618] Updated Greek translation using Weblate
+
+eevan78 (1):
+ * [1c5976d4] Updated Serbian translation using Weblate
+
+# 2.6.4
+Jonas Kalderstam (7):
+ * [ef1a65b0] Improved OPML import when files are incorrect
+ * [2f564e62] Some gradle housekeeping
+ * [369a17d4] Fixed crash: Parcel: unable to marshal value HttpError
+ * [434ecae8] Fixed crash: URLDecoder: Illegal hex characters in escape
+ * [f258c45e] Fixed crash: gzip finished without exhausting source
+ * [477e3b32] Fixed crash: file:/// exposed beyond app through
+ ClipData.Item.getUri()
+ * [724d0b60] Fixed crash: No Activity found to handle Intent {
+ act=android.intent.action.CREATE_DOCUMENT
+
+Belmar Begić (1):
+ * [994c9904] Updated Bosnian translation using Weblate
+
+zmni (1):
+ * [b70c5274] Updated Indonesian translation using Weblate
+
+# 2.6.3
+Jonas Kalderstam (2):
+ * [77ec797b] Changed so sync will try to fetch the favicon of a site if no
+ feed image (one time only)
+ * [57d86668] Made builds reproducible
+
+YGXB_net (1):
+ * [278355d1] Updated Chinese (Simplified) translation using Weblate
+
+# 2.6.2
+Axus Wizix (1):
+ * [ec5281aa] Updated Russian translation using Weblate
+
+Jonas Kalderstam (6):
+ * [1195f0cc] Changed so sync uses only a single CPU-core
+ * [49a7f653] Improved some error handling
+ * [ce759df2] Fixed crash in edit feed text related to focus
+ * [91c0627e] Made the OPML importer tolerant of ill-formed XML (bad files)
+ * [272a898f] Fixed text in list possibly getting out of date with data
+ * [10d071e3] Added support for more types of feed icons
+
+YGXB_net (1):
+ * [1824a3cf] Updated Chinese (Simplified) translation using Weblate
+
+# 2.6.1
+Jonas Kalderstam (6):
+ * [08295427] Fixed a crash if device was removed from sync chain
+ * [7f4ec4f6] Implemented Either from Arrow
+ * [efe67fee] Added more descriptive error messages when feeds can not be
+ found or parsed
+ * [424007c2] Added a new theme specifically for E Ink screens
+ * [acb40347] Updated Swedish translation using Weblate
+ * [171477fa] Added some extra crash handling
+
+Agnieszka C (3):
+ * [49505e90] Updated Polish translation using Weblate
+ * [f7274779] Updated Polish translation using Weblate
+ * [f7fce9d1] Updated Polish translation using Weblate
+
+Alessandro Melillo (1):
+ * [1e488ec8] Updated Italian translation using Weblate
+
+Dan (1):
+ * [eb6eebd9] Updated Ukrainian translation using Weblate
+
+ERYpTION (1):
+ * [1db118d5] Updated Danish translation using Weblate
+
+Eduardo (1):
+ * [07dadfa5] Updated Portuguese (Brazil) translation using Weblate
+
+El Pirujo (1):
+ * [e75a810d] Updated Spanish translation using Weblate
+
+Eric (2):
+ * [7ad678a3] Updated Chinese (Simplified) translation using Weblate
+ * [ec8094fc] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [75b785a1] Updated Slovak translation using Weblate
+
+Jani Kinnunen (1):
+ * [968c9748] Updated Finnish translation using Weblate
+
+Kingproone (1):
+ * [3ef9e526] Updated Hungarian translation using Weblate
+
+Lu Xu (1):
+ * [6392e1b5] Updated Chinese (Simplified) translation using Weblate
+
+Matth78 (2):
+ * [14284127] Updated French translation using Weblate
+ * [c4361314] Updated French translation using Weblate
+
+Nicholas La Roux (1):
+ * [5be51a61] Updated Japanese translation using Weblate
+
+Nicolas Van Damme (1):
+ * [42feb9e1] Updated Dutch translation using Weblate
+
+Oğuz Ersen (1):
+ * [93aae004] Updated Turkish translation using Weblate
+
+Retrial (1):
+ * [e51efd27] Updated Greek translation using Weblate
+
+Threat-Watch (1):
+ * [b4d0c81e] Updated Greek translation using Weblate
+
+VfBFan (1):
+ * [5e817c63] Updated German translation using Weblate
+
+WB (1):
+ * [9caae62d] Updated Galician translation using Weblate
+
+bowornsin (1):
+ * [ef1222dd] Updated Thai translation using Weblate
+
+eevan78 (1):
+ * [f1b65560] Updated Serbian translation using Weblate
+
+pchelium (1):
+ * [a0bd0cc6] Updated Czech translation using Weblate
+
+zmni (1):
+ * [a7cb24d2] Updated Indonesian translation using Weblate
+
+Ícar N. S (1):
+ * [1695a4b7] Updated Catalan translation using Weblate
+
+عمار (1):
+ * [8def65df] Updated Arabic translation using Weblate
+
+# 2.6.0
+Agnieszka C (1):
+ * [3ae0d2ab] Updated Polish translation using Weblate
+
+Dan (1):
+ * [c736b141] Updated Ukrainian translation using Weblate
+
+ERYpTION (1):
+ * [651c9ad5] Updated Danish translation using Weblate
+
+El Pirujo (1):
+ * [437f5af8] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [a0d92681] Updated Chinese (Simplified) translation using Weblate
+
+Francesco Saltori (1):
+ * [9422a197] Updated Italian translation using Weblate
+
+Jonas Kalderstam (13):
+ * [1bbaa426] Changed so navigation drawer now remembers scroll position
+ * [7454a239] Fixed deleting current feed will switch to All Feeds view
+ * [80f209e1] Changed so the Mark All as Read button (FAB) will also
+ immediately hide all items
+ * [61b79f4b] Added new option to configure max lines for items in list
+ * [4800309f] Changed Compact article style to match other styles and take
+ advantage of configurable max lines
+ * [4472d2c9] Improved image loading in reader
+ * [468d953a] Added new filter options
+ * [98c2a504] Increased icon size in SuperCompact style
+ * [9f177538] Renamed some string names to make it clear if they are
+ adjectives or nouns during translation
+ * [c426488c] Fixed talkback on new filter menu
+ * [3c6c63b6] Added new setting for limiting list items to only title or
+ not
+ * [22b5a4f8] Fixed crash with device sync (#84)
+ * [052c6e48] Updated Swedish translation using Weblate
+
+Matth78 (1):
+ * [1c4d1d71] Updated French translation using Weblate
+
+Weblate (bot) (1):
+ * [6fb87310] Updated Czech translation using Weblate (#80)
+
+# 2.5.0
+Agnieszka C (1):
+ * [0818b4a7] Updated Polish translation using Weblate
+
+Axus Wizix (1):
+ * [fee820a7] Updated Russian translation using Weblate
+
+Bahasnyldz (1):
+ * [e2828a30] Updated Turkish translation using Weblate
+
+Dan (1):
+ * [2f1271fe] Updated Ukrainian translation using Weblate
+
+ERYpTION (1):
+ * [4fa7e6d0] Updated Danish translation using Weblate
+
+El Pirujo (1):
+ * [2778cf14] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [e7b81bb9] Updated Chinese (Simplified) translation using Weblate
+
+Francesco Saltori (1):
+ * [a03f8fdb] Updated Italian translation using Weblate
+
+J. Lavoie (2):
+ * [3f0a9cb4] Updated French translation using Weblate
+ * [a66281a7] Updated Italian translation using Weblate
+
+Jonas Kalderstam (19):
+ * [272b6765] Added handler for crashes: will open a pre-formatted email to
+ report the crash
+ * [ae95be09] Added automatic releases on GitHub with easily downloadable
+ APK-files
+ * [3e3b93f0] Fixed bug where you could get stuck in Couldn't Fetch Full
+ Article Text
+ * [b0734769] Fixed so fetch full text will only try to read HTML links.
+ PDFs and similar will result in an error text
+ * [a4b86988] Fixed possible crash if OMPL import failed
+ * [7f78acbe] Ensured non-html links are not downloaded in vain when
+ parsing full articles
+ * [b4a11ebd] Updated Swedish translation using Weblate
+ * [2a11651a] Upgraded dependency versions
+ * [6e629e1b] Changed so articles don't disappear immediately when they are
+ read
+ * [fbb37288] Changed so articles published today show time instead of date
+ * [9dd52cd2] Updated article styles: increased difference between
+ read/unread, improved usabilty in phone landscape orientation,
+ added feed icon to card
+ * [b0565a36] Re-enabled mark as read on scroll for grid; Card style is now
+ the only option for the grid layout
+ * [253d1539] Changed ContentProvider to build type specific values
+ * [50e924e9] Changed so swiping will hide article immediately if only
+ showing unread items
+ * [72782af9] Added Feeder specific settings to OPML
+ * [e456f243] Added a shared key for debug builds
+ * [8249d95c] Upgraded from threeten.bp to core library desugaring for
+ java.time
+ * [78f0cea0] Fixed tests to run on Android 23
+ * [32fe6403] Fixed Hungarian name in Fastlane metadata
+
+Kingproone (1):
+ * [d4856de4] Updated Hungarian translation using Weblate
+
+Luna Jernberg (1):
+ * [34f3afd3] Updated Swedish translation using Weblate
+
+Meiru (1):
+ * [7c0247f4] Updated Japanese translation using Weblate
+
+Retrial (1):
+ * [dbbe60f1] Updated Greek translation using Weblate
+
+Reza Almanda (1):
+ * [6de1e084] Updated Indonesian translation using Weblate
+
+VfBFan (1):
+ * [dfc70bd3] Updated German translation using Weblate
+
+Vitor Henrique (1):
+ * [22acf1f1] Updated Portuguese (Brazil) translation using Weblate
+
+WB (1):
+ * [c16773af] Updated Galician translation using Weblate
+
+atilluF (2):
+ * [f5594a93] Updated Italian translation using Weblate
+ * [f2666d2a] Updated Italian translation using Weblate
+
+bruh (1):
+ * [85503868] Updated Vietnamese translation using Weblate
+
+mm4c (1):
+ * [a2835463] Updated Dutch translation using Weblate
+
+ssantos (1):
+ * [f8e72164] Updated Portuguese (Portugal) translation using Weblate
+
+# 2.4.20
+J. Lavoie (1):
+ * [7c9ea4d7] Updated Italian translation using Weblate
+
+Jonas Kalderstam (2):
+ * [643f4ba7] Added global text actions to text selection menu
+ * [cbf04689] Fixed bug where 1x1 tracking pixels could be selected as
+ cover images
+
+Meiru (1):
+ * [ce99c460] Updated Japanese translation using Weblate
+
+Nicola Masarone (1):
+ * [f2ad8249] Updated Italian translation using Weblate
+
+Vitor Henrique (1):
+ * [9ab7037e] Updated Portuguese (Brazil) translation using Weblate
+
+zmni (1):
+ * [30e88bc1] Updated Indonesian translation using Weblate
+
+# 2.4.19
+Alexthegib (1):
+ * [9a6ec389] Updated Portuguese (Portugal) translation using Weblate
+
+Jonas Kalderstam (4):
+ * [794e0928] Fixed article ending up in a mixture of full article and
+ regular
+ * [4350b21d] Fixed full text download worker to be slightly more optimal
+ * [9cad034f] Tweaked requests' Cache Control headers
+ * [aaf9a9c6] Fixed sites getting fetched on every sync if they didn't
+ specify an icon
+
+Retrial (1):
+ * [0c626ff8] Updated Greek translation using Weblate
+
+VfBFan (1):
+ * [29affd7e] Updated German translation using Weblate
+
+atilluF (1):
+ * [05dd33b7] Updated Italian translation using Weblate
+
+bowornsin (1):
+ * [55418c06] Updated Thai translation using Weblate
+
+pchelium (1):
+ * [491e0545] Updated Czech translation using Weblate
+
+# 2.4.18
+Agnieszka C (1):
+ * [565de63c] Updated Polish translation using Weblate
+
+Aitor Salaberria (1):
+ * [72cd7fab] Updated Basque translation using Weblate
+
+Dan (1):
+ * [4d7b2ac6] Updated Ukrainian translation using Weblate
+
+ERYpTION (1):
+ * [d81a686b] Updated Danish translation using Weblate
+
+El Pirujo (1):
+ * [f203fdaa] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [31a7aee8] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [0b71640c] Updated French translation using Weblate
+
+Jonas Kalderstam (4):
+ * [dff22b65] Added ability to open OPML files
+ * [2b0dd5d1] Updated Swedish translation using Weblate
+ * [8a3340d1] Added Feeder News feed for all users. So sorry for modifying
+ everyone's subscriptions! It only happens once for each user. Feel
+ free to delete it if you don't want it.
+ * [06e27ca6] Fixed possible crash when inserting duplicate feeds
+
+WB (1):
+ * [d4ad5623] Updated Galician translation using Weblate
+
+Wolfgang (1):
+ * [4fcf1af2] Updated German translation using Weblate
+
+# 2.4.17
+Jonas Kalderstam (10):
+ * [71835f81] Fixed possible crash during article parsing
+ * [36f08f92] Fixed charset detection for sites not using UTF-8
+ * [4b2c4bd3] Fixed lineheight not scaling with text size
+ * [f3d1b0f5] Improved keyboard navigation through the app
+ * [dbd9af16] Added suitable dimensions for TVs
+ * [b7501f87] Changed how number of columns in grid layout is calculated
+ * [032b77ae] Added some special UI handling for Foldable devices
+ * [c0578304] Adjusted width of reader on large screens
+ * [967797dd] Fixed some code deprecations and such
+ * [7103a0fc] Temporarily disabled mark as read on scroll in Grid because
+ it just doesn't work well enough
+
+Patrik Daniel (1):
+ * [bbd66edc] Updated Finnish translation using Weblate
+
+S3aBreeze (1):
+ * [ea412aa2] Updated Russian translation using Weblate
+
+mm4c (1):
+ * [16ce2cb1] Updated Dutch translation using Weblate
+
+# 2.4.16
+Jonas Kalderstam (11):
+ * [3493e09b] Added global notifications setting as an alternative way to
+ toggle feed notifications
+ * [6d11e165] Changed block list setting to have dynamic size
+ * [7d4e275e] Cleaned up some code
+ * [cce0be9b] Added an entry in the nav drawer to easily access bookmarked
+ articles
+ * [fd0577d4] Fixed mark as read after/before
+ * [502c16cd] Removed ability to pin articles
+ * [a3630e7a] Renamed "bookmark" to "save article"
+ * [b903a8f5] Ensured old pinned articles becomes saved articles when
+ upgrading
+ * [e390d229] Changed so Feeder will try and parse responses from sites
+ even if the mimetype is wrong
+ * [06179eab] Added option to mark as read while scrolling
+ * [835329dc] Changed mark as read on scroll delay to 800ms down from
+ 1000ms
+
+Agnieszka C (2):
+ * [0368c1ed] Updated Polish translation using Weblate
+ * [cec966ba] Updated Polish translation using Weblate
+
+Alexthegib (1):
+ * [052eeb59] Updated Portuguese (Portugal) translation using Weblate
+
+Dan (2):
+ * [8ac1d5f0] Updated Ukrainian translation using Weblate
+ * [810d0766] Updated Ukrainian translation using Weblate
+
+ERYpTION (2):
+ * [4910290a] Updated Danish translation using Weblate
+ * [50490d02] Updated Danish translation using Weblate
+
+El Pirujo (2):
+ * [b62198f8] Updated Spanish translation using Weblate
+ * [ae153e5b] Updated Spanish translation using Weblate
+
+Eric (2):
+ * [f4bee166] Updated Chinese (Simplified) translation using Weblate
+ * [b660084f] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [5fa9186e] Updated Italian translation using Weblate
+
+Nicola Masarone (1):
+ * [7807be16] Updated Italian translation using Weblate
+
+Oğuz Ersen (1):
+ * [81db851a] Updated Turkish translation using Weblate
+
+ROCK TAKEY (1):
+ * [fd41e07c] Updated Japanese translation using Weblate
+
+Retrial (1):
+ * [a533ebf8] Updated Greek translation using Weblate
+
+VfBFan (2):
+ * [18901a75] Updated German translation using Weblate
+ * [c56fb097] Updated German translation using Weblate
+
+eevan78 (1):
+ * [37648ec4] Translated using Weblate (Serbian)
+
+pchelium (3):
+ * [e64914ef] Updated Czech translation using Weblate
+ * [6dafba63] Updated Czech translation using Weblate
+ * [546751ab] Updated Czech translation using Weblate
+
+zmni (2):
+ * [936ee470] Updated Indonesian translation using Weblate
+ * [647040b6] Updated Indonesian translation using Weblate
+
+# 2.4.15
+Jonas Kalderstam (15):
+ * [6838e46a] Updated versions
+ * [8cd2453a] Changed to official upsert
+ * [aa4c7362] Changed to new and safer flow collection with lifecycle
+ awareness
+ * [233afed4] Updated so text should appear more balanced with line breaks
+ and hyphenation
+ * [5077ad25] Added tooltips to all icon buttons on long-press
+ * [4c7ab111] Changed so zeros aren't shown in nav drawer
+ * [ab30b452] Changed so New-indicator is only shown if read items would be
+ shown
+ * [48c8b1e0] Changed so pressing Back will close the nav drawer if it is
+ open
+ * [792bdd93] Changed placeholder images to be easier on the eyes
+ * [3c83228e] Fixed too many image captions when image was wrapped in
+ figure
+ * [586d6735] Changed so image captions are not included in TextToSpeech
+ * [6c4f6f14] Improved article layout with spacing and image captions
+ * [5fd8c853] Improved table rendering in article view
+ * [e23ecb47] Improved reader screen performance
+ * [6bf00a09] Fixed display of nested figures in reader
+
+# 2.4.14
+Jonas Kalderstam (4):
+ * [9251378d] Added TW title
+ * [f6bd778e] Updated UserAgent to explain what the app is for server
+ owners
+ * [d13def0e] Fixed crash when searching for strange URLs
+ * [63c0da7a] Fixed rare crash in reader
+
+Subham Jena (1):
+ * [5e89dfc2] Updated Odia translation using Weblate
+
+yangyangdaji (1):
+ * [f86db9ca] Translated using Weblate (Chinese (Traditional))
+
+# 2.4.13
+Hotarun (1):
+ * [a25e1cbb] Updated Russian translation using Weblate
+
+Jonas Kalderstam (9):
+ * [9f8dd7e4] Updated versions and enabled gradle configuration cache
+ * [34843b8e] Syncing will now scroll list to top so new items are
+ immediately visible
+ * [3016f72c] Fixed send bug report to open email client instead of GitLab
+ * [10c661ad] Added check for notification permission before trying to
+ notify
+ * [d58e2955] Improved build performance
+ * [bca3f845] Fixed screen getting offset when increasing display size on
+ device
+ * [cf81e5e5] Fixed so release script can generate config locales
+ * [2854679f] Tweaked release script
+
+# 2.4.12
+Belmar Begić (1):
+ * [9157af8f] Updated Bosnian translation using Weblate
+
+Jonas Kalderstam (4):
+ * [43518971] Fixed couldn't add a feed with unknown protocols in links
+ * [c83e7054] Improved link handling
+ * [ca3a977b] Some cleanup
+
+Raman (1):
+ * [043f5da1] Updated Malayalam translation using Weblate
+
+Zayed Al-Saidi (1):
+ * [95e0e8c0] Translated using Weblate (Arabic)
+
+fincent (1):
+ * [b502d1ff] Updated Dutch translation using Weblate
+
+# 2.4.11
+Juraj Liso (1):
+ * [61a263f3] Added Slovak translation using Weblate
+
+Parsa (1):
+ * [1f07f778] Translated using Weblate (Persian)
+
+Zayed Al-Saidi (1):
+ * [3b48b9b8] Translated using Weblate (Arabic)
+
+# 2.4.10
+Jonas Kalderstam (3):
+ * [c2010a4f] Disabled emulator tests on github
+ * [24a024f5] Upgraded kotlin, compose compiler and compose BOM
+
+S-H-Y-A (1):
+ * [6a786c1f] Translated using Weblate (Japanese)
+
+# 2.4.9
+Aitor Salaberria (1):
+ * [3d295d48] Updated Basque translation using Weblate
+
+Jonas Kalderstam (8):
+ * [cfe0511a] Fixed all lint errors
+
+VfBFan (1):
+ * [dbfa1c90] Translated using Weblate (German)
+
+jc (1):
+ * [76b24997] Translated using Weblate (Portuguese (Portugal))
+
+zmni (1):
+ * [6a822bb8] Updated Indonesian translation using Weblate
+
+# 2.4.8
+Carles Muñoz Gorriz (1):
+ * [be63937d] Updated Catalan translation using Weblate
+
+Felix Otto (1):
+ * [b14eb758] adjust URLs of screenshots
+
+Gabriel Camargo (1):
+ * [da170316] Updated Portuguese (Brazil) translation using Weblate
+
+Jonas Kalderstam (2):
+ * [736935e5] Fixed articles marking themselves as unread when toggling
+ view unread
+ * [cac7d5e8] Fixed trailing commas
+
+bowornsin (1):
+ * [d070511f] Updated Thai translation using Weblate
+
+gallegonovato (1):
+ * [a3211c77] Updated Galician translation using Weblate
+
+mm4c (1):
+ * [c45efb88] Updated Dutch translation using Weblate
+
+# 2.4.7
+Agnieszka C (1):
+ * [173a35ca] Updated Polish translation using Weblate
+
+Dan (1):
+ * [4c60bc5a] Updated Ukrainian translation using Weblate
+
+ERYpTION (2):
+ * [0bbf5ef0] Updated Danish translation using Weblate
+ * [0881c3d0] Updated Danish translation using Weblate
+
+El Pirujo (1):
+ * [f0865ca1] Updated Spanish translation using Weblate
+
+Eric (2):
+ * [8e4583c0] Updated Chinese (Simplified) translation using Weblate
+ * [3fe875ef] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [50a1550c] Updated Italian translation using Weblate
+
+Jonas Kalderstam (13):
+ * [01cce9a0] Tweaked release script
+ * [5fdb22d9] Added stricter ContentType restrictions on responses
+ * [2a3e3df1] Changed so full text articles are are not retried
+ automatically
+ * [2caa0032] Moved all article data to cacheDir instead of some in
+ filesDir
+ * [b69b4a0e] Fixed some issues related to block list
+ * [c4aa6f97] Fixed english translation
+ * [08408ca0] Fixed english translation
+ * [84d781db] Fixed bug where backstack would get stacked with multiple
+ feeds
+ * [8de0b6f2] Fixed feed navigation
+ * [c24a2c77] Really fixed feed navigation
+ * [d0cfbb42] Refactored to follow guidelines. Top to bottom reached empty
+ * [ee3c027d] Fixed navigation properly
+ * [fbd47e77] Updated Swedish translation using Weblate
+
+Oğuz Ersen (2):
+ * [5c04dc46] Updated Turkish translation using Weblate
+ * [510a76aa] Updated Turkish translation using Weblate
+
+Retrial (2):
+ * [5b1b6ad4] Updated Greek translation using Weblate
+ * [598cc6a3] Updated Greek translation using Weblate
+
+Simona Iacob (1):
+ * [ecdfb3f3] Updated Romanian translation using Weblate
+
+Skrripy (1):
+ * [db0fa1b2] Updated Ukrainian translation using Weblate
+
+Space Cowboy (5):
+ * [7a5074b4] Merge branch 'weblate-feeder-android-strings' into 'master'
+ * [3e92bc4a] Merge branch 'fix-data-consumption' into 'master'
+ * [d8c81995] Merge branch 'fix-glob-insert' into 'master'
+ * [5b0ae748] Merge branch 'weblate-feeder-android-strings' into 'master'
+ * [2464acaa] Merge branch 'guideliens' into 'master'
+
+VfBFan (2):
+ * [d3e91290] Updated German translation using Weblate
+ * [c73a4c2a] Updated German translation using Weblate
+
+gallegonovato (1):
+ * [c16eac5a] Updated Galician translation using Weblate
+
+zmni (1):
+ * [163f27ae] Updated Indonesian translation using Weblate
+
+# 2.4.6
+Aitor (2):
+ * [69989627] Translated using Weblate (Basque)
+ * [21629a41] Updated Basque translation using Weblate
+
+Hur Ezeiza Zaldua (1):
+ * [af3ff07b] Updated Basque translation using Weblate
+
+Jonas Kalderstam (2):
+ * [a87da794] Try to ignore if conscrypt insertion fails
+ * [8adb4114] Updated UserAgent to avoid some issues with anti-spam
+ * [9ddc1a14] Fixed unit test
+
+Retrial (1):
+ * [e176df4d] Translated using Weblate (Greek)
+
+Skrripy (1):
+ * [05f2f077] Translated using Weblate
+
+
+# 2.4.6
+Aitor (2):
+ * [69989627] Translated using Weblate (Basque)
+ * [21629a41] Updated Basque translation using Weblate
+
+Hur Ezeiza Zaldua (1):
+ * [af3ff07b] Updated Basque translation using Weblate
+
+Jonas Kalderstam (2):
+ * [a87da794] Try to ignore if conscrypt insertion fails
+ * [8adb4114] Updated UserAgent to avoid some issues with anti-spam
+ * [9ddc1a14] Fixed unit test
+
+Retrial (1):
+ * [e176df4d] Translated using Weblate (Greek)
+
+Skrripy (1):
+ * [05f2f077] Translated using Weblate (Ukrainian)
+
+# 2.4.6
+Aitor (2):
+ * [69989627] Translated using Weblate (Basque)
+ * [21629a41] Updated Basque translation using Weblate
+
+Hur Ezeiza Zaldua (1):
+ * [af3ff07b] Updated Basque translation using Weblate
+
+Jonas Kalderstam (2):
+ * [a87da794] Try to ignore if conscrypt insertion fails
+ * [8adb4114] Updated UserAgent to avoid some issues with anti-spam
+
+Retrial (1):
+ * [e176df4d] Translated using Weblate (Greek)
+
+Skrripy (1):
+ * [05f2f077] Translated using Weblate (Ukrainian)
+
+VfBFan (1):
+ * [2b1382df] Translated using Weblate (German)
+
+Vitor Henrique (1):
+ * [b34335b1] Updated Portuguese (Brazil) translation using Weblate
+
+slothtown (1):
+ * [5e000306] Fixed typo
+
+wackbyte (1):
+ * [1e4572c7] Translated using Weblate (Toki Pona)
+
+Ícar N. S (1):
+ * [dabcdbd2] Updated Catalan translation using Weblate
+
+# 2.4.5
+Jonas Kalderstam (3):
+ * [7a26e00d] Fixed crash when sharing link to Feeder
+ * [1ce1f6b0] Upgraded some versions
+ * [3ef1871a] Removed Large Top App Bar because of crash when rotating
+ device
+
+José Cabeda (1):
+ * [30455aba] Updated Portuguese (Portugal) translation using Weblate
+
+bowornsin (1):
+ * [d9b58d61] Updated Thai translation using Weblate
+
+# 2.4.4
+Jonas Kalderstam (5):
+ * [22996d2b] Removed all static functions with DI in them
+ * [3dbb26b5] Fixed crash on startup if "Sync upon app start" was enabled
+ * [8109a298] Consolidated all compose providers
+ * [202dd81d] Fixed wrong colors for small top app bar
+ * [d45711ea] Fixed new item count not respecting block list
+
+Retrial (1):
+ * [9518e7e8] Translated using Weblate (Greek)
+
+# 2.4.3
+Belmar Begić (1):
+ * [b230216a] Updated Bosnian translation using Weblate
+
+Jonas Kalderstam (4):
+ * [0657fd32] Fixed crash when sharing link to app
+ * [27a04033] Fixed a recursion bug with DI and some cleanup
+ * [ccf438c7] Fixed crash on database upgrade
+ * [855fe6d5] Show diff on release
+
+bowornsin (1):
+ * [69e93779] Updated Thai translation using Weblate
+
+mm4c (1):
+ * [591c92cf] Translated using Weblate (Dutch)
+
+# 2.4.2
+Agnieszka C (1):
+ * [f4bb4abf] Updated Polish translation using Weblate
+
+Axus Wizix (1):
+ * [b4351577] Updated Russian translation using Weblate
+
+Dan (2):
+ * [d0dd8fa2] Translated using Weblate (Ukrainian)
+ * [e9349b64] Updated Ukrainian translation using Weblate
+
+ERYpTION (1):
+ * [d1ea9ca3] Updated Danish translation using Weblate
+
+Eric (1):
+ * [bf17b3e0] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [d7609fb2] Updated French translation using Weblate
+
+Jonas Kalderstam (6):
+ * [eaf28eff] Fixed spacing issue in settings
+ * [d172d658] Changed so block list now works immediately instead of after
+ sync
+ * [f224bca4] Changed so more devices will won't use large top app bars
+
+Oğuz Ersen (1):
+ * [17d2f848] Updated Turkish translation using Weblate
+
+Simone Dotto (1):
+ * [b50bc9ad] Updated Italian translation using Weblate
+
+gallegonovato (1):
+ * [a0f49a1a] Updated Galician translation using Weblate
+
+haidarah esmander (1):
+ * [8bd20a6d] Added Arabic translation using Weblate
+
+zmni (1):
+ * [9c13bc84] Updated Indonesian translation using Weblate
+
+# 2.4.1
+Agnieszka C (1):
+ * [86b33eb1] Updated Polish translation using Weblate
+
+Andrij Mizyk (1):
+ * [f5557397] Updated Ukrainian translation using Weblate
+
+Dritan Taulla (1):
+ * [301cdff5] Updated Albanian translation using Weblate
+
+ERYpTION (1):
+ * [4b2c8749] Updated Danish translation using Weblate
+
+El Pirujo (1):
+ * [7fff2056] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [6e75150b] Updated Chinese (Simplified) translation using Weblate
+
+Gediminas Murauskas (1):
+ * [6e2d9edd] Updated Lithuanian translation using Weblate
+
+J. Lavoie (1):
+ * [72c5bca5] Updated Italian translation using Weblate
+
+Jonas Kalderstam (6):
+ * [2dd030b7] Fixed some text not scaling according to settings
+ * [b83c5d38] Fixed bug where swiping was not possible in list because of
+ grid
+ * [807722c7] Added SwipeToDismiss to GridView
+ * [5d0103a4] Fixed SwipeToDismiss so it works even with disabled
+ animations
+
+Oğuz Ersen (1):
+ * [872e93e2] Updated Turkish translation using Weblate
+
+VfBFan (1):
+ * [17a8a29c] Updated German translation using Weblate
+
+zmni (1):
+ * [4aaaa296] Updated Indonesian translation using Weblate
+
+# 2.4.0
+Dritan Taulla (1):
+ * [fa0a128e] Updated Albanian translation using Weblate
+
+Jonas Kalderstam (18):
+ * [e5ff3dab] Made TopAppBar larger on tall screens to make it easier for
+ one-handed use
+ * [582c7088] Fixed color of status bar and top app bar in Black theme
+ * [f56169ee] Added setting for Font Size
+ * [84648be4] Added support for app specific locale
+ * [faa0e234] Changed animations from slide to fade
+
+Minh P (1):
+ * [0999d81e] Updated Vietnamese translation using Weblate
+
+Nikita Epifanov (1):
+ * [a39c4175] Updated Russian translation using Weblate
+
+WB (1):
+ * [e91fb923] Updated Galician translation using Weblate
+
+bowornsin (1):
+ * [b027d0c8] Updated Thai translation using Weblate
+
+# 2.3.9
+Aitor Salaberria (1):
+ * [c7c6c271] Updated Basque translation using Weblate
+
+ERYpTION (1):
+ * [bce0dae3] Updated Danish translation using Weblate
+
+Gediminas Murauskas (1):
+ * [e52e814a] Updated Lithuanian translation using Weblate
+
+Jonas Kalderstam (5):
+ * [ae04fa71] Implemented StaggeredGrid for tablets
+ * [866363b1] Improved reliability of device sync
+ * [8ead3242] Implemented predictive back
+
+Mehmet (1):
+ * [4a56f294] Updated Turkish translation using Weblate
+
+bowornsin (1):
+ * [cfe4f559] Updated Thai translation using Weblate
+
+ssantos (1):
+ * [cfedc4d4] Updated Portuguese (Portugal) translation using Weblate
+
+# 2.3.8
+ERYpTION (1):
+ * [9e04ef88] Updated Danish translation using Weblate
+
+Francesco Saltori (1):
+ * [2106104e] Translated using Weblate (Italian)
+
+J. Lavoie (1):
+ * [d9af5801] Translated using Weblate (Italian)
+
+Jonas Kalderstam (2):
+ * [2f281017] Removed new-indicator from Compact and SuperCompact view
+ styles
+ * [5a43aaa0] Added app title for Thai
+
+Mehmet (1):
+ * [8a4304e4] Updated Turkish translation using Weblate
+
+Sergi Font (1):
+ * [26b07252] Updated Catalan translation using Weblate
+
+Simona Iacob (1):
+ * [45e30113] Updated Romanian translation using Weblate
+
+bowornsin (1):
+ * [8aa363b7] Translated using Weblate (Thai)
+
+# 2.3.7
+Ady (1):
+ * [30fab5dd] Updated French translation using Weblate
+
+Agnieszka C (1):
+ * [65a039ef] Updated Polish translation using Weblate
+
+Allan Nordhøy (1):
+ * [ee6fe99d] Updated Norwegian Bokmål translation using Weblate
+
+Andrij Mizyk (1):
+ * [d457772f] Updated Ukrainian translation using Weblate
+
+Dhruv Sangvikar (1):
+ * [81e46e5b] Add support for showing favicons in nav drawer
+
+ERYpTION (1):
+ * [f057e3fb] Updated Danish translation using Weblate
+
+El Pirujo (1):
+ * [11bc8b68] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [d8882a29] Updated Chinese (Simplified) translation using Weblate
+
+Gediminas Murauskas (1):
+ * [9328f4c8] Updated Lithuanian translation using Weblate
+
+Jacob Highfield (2):
+ * [f88ba589] Bold text on unread items
+ * [dd6dbcdb] Don't bold the snippet
+
+Jiri Grönroos (1):
+ * [267a1d83] Translated using Weblate (Finnish)
+
+Jonas Kalderstam (4):
+ * [a0b960c1] Reduced title font weight to Bold from ExtraBold
+ * [2020a70b] Removed unused parameter
+ * [63b8cb53] Fixed text alignment in navdrawer after feed icons added
+ * [3a93eb6b] Added divider in navdrawer so text can be aligned even with
+ icons
+
+Nikita Epifanov (1):
+ * [2863af80] Updated Russian translation using Weblate
+
+Oğuz Ersen (1):
+ * [e8df291a] Updated Turkish translation using Weblate
+
+VfBFan (1):
+ * [c29b1c08] Updated German translation using Weblate
+
+Zacharias Efraimidis (1):
+ * [22fc67c0] Updated Greek translation using Weblate
+
+bruh (1):
+ * [671d7af7] Translated using Weblate (Vietnamese)
+
+zmni (1):
+ * [1dc28299] Updated Indonesian translation using Weblate
+
+# 2.3.6
+Belmar Begić (1):
+ * [9b6b5a66] Updated Bosnian translation using Weblate
+
+Jonas Kalderstam (1):
+ * [8e662118] Fixed parsing of srcset images in Politico's feed
+
+Miraficus (1):
+ * [37a170df] Translated using Weblate (Czech)
+
+Simona Iacob (1):
+ * [db9b825d] Updated Romanian translation using Weblate
+
+# 2.3.5
+Ady (1):
+ * [4cdc88ba] Translated using Weblate (French)
+
+Jonas Kalderstam (2):
+ * [ff23128b] Changed user-agent to match Chrome's
+ * [6002d91d] Fixed user-agent test
+
+Vitor Henrique (1):
+ * [073ccb1d] Updated Portuguese (Brazil) translation using Weblate
+
+liimee (1):
+ * [e4090e15] Updated Indonesian translation using Weblate
+
+zmni (1):
+ * [9c1acc5b] Translated using Weblate (Indonesian)
+
+# 2.3.4
+Jonas Kalderstam (5):
+ * [7036d422] Fixed parsing of additional types of thumbnails
+ * [a22aa525] Further improved thumbnail parsing
+ * [943695c5] Fixed decoding where smileys would not get rendered correctly
+
+# 2.3.3
+Agnieszka C (1):
+ * [6145fb2a] Updated Polish translation using Weblate
+
+Andrij Mizyk (1):
+ * [9d72357f] Updated Ukrainian translation using Weblate
+
+ERYpTION (1):
+ * [38f8e2fd] Updated Danish translation using Weblate
+
+El Pirujo (1):
+ * [88b815b0] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [4039f577] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [819789ec] Updated French translation using Weblate
+
+Jonas Kalderstam (3):
+ * [88391f35] Added monochrome app icon
+ * [52a2e030] Added a debug-only app icon
+ * [b003d5ec] Fixed crash when sync on when charging was true
+
+Oğuz Ersen (1):
+ * [2d229786] Updated Turkish translation using Weblate
+
+atilluF (1):
+ * [e5b6191e] Updated Italian translation using Weblate
+
+zmni (1):
+ * [1a9efa68] Updated Indonesian translation using Weblate
+
+# 2.3.2
+Allan Nordhøy (1):
+ * [9c947b4c] Updated Norwegian Bokmål translation using Weblate
+
+Andrij Mizyk (1):
+ * [e50de95c] Updated Ukrainian translation using Weblate
+
+ERYpTION (1):
+ * [6162c9e7] Translated using Weblate (Danish)
+
+Jonas Kalderstam (14):
+ * [4ee8790e] Fixed padding in tag list
+ * [8cce8c0d] Fixed images rendering too large causing crashes
+ * [c660a688] Added fallback to feed icon in compact views
+ * [2b91e13f] Added blacklist for twitter icon as article icon
+ * [d4817632] Added dividers in list for compact and superCompact styles
+ * [605f9be2] Fixed so list stays at top when updating if already at top
+ * [a7b032a1] Added padding in list so FAB doesn't cover last article
+ * [54a1168f] Adjusted TopAppBar scroll behavior
+ * [3613b758] Fixed syncclient re-initializing unnecessarily
+ * [a20f65e6] Fixed reliability of read status sync
+ * [5a45015d] Fixed image size in Compact item layouts
+ * [7ba2253b] Fixed HTML not getting stripped from alt texts
+ * [738495a2] Increased text size of block quotes in reader view
+ * [925824de] Upgraded dependency versions and insets handling
+
+Meiru (1):
+ * [383bd23c] Updated Japanese translation using Weblate
+
+MkQtS (1):
+ * [1d6ea396] Updated Chinese (Simplified) translation using Weblate
+
+Vitor Henrique (1):
+ * [863c8327] Updated Portuguese (Brazil) translation using Weblate
+
+WB (1):
+ * [257dfed6] Translated using Weblate (Galician)
+
+kak mi (1):
+ * [89cb8b85] Updated Chinese (Simplified) translation using Weblate
+
+Егор Ермаков (1):
+ * [11505e3b] Updated Russian translation using Weblate
+
+# 2.3.1
+Ady (1):
+ * [65b669ec] Updated French translation using Weblate
+
+Jonas Kalderstam (5):
+ * [130c2319] Fix Right to Left languages in headers
+ * [35eb7660] Changed back to single screen on tablets in portrait mode
+ * [2ccf7d00] Fixed content alignment in search screen
+ * [8a68f2a5] Added parsing support for additional thumbnails
+ * [fd46ece5] Fixed list not centered in landscape on phones
+
+linsui (1):
+ * [c07e95ce] Fix feed indicator localization
+
+zmni (1):
+ * [e37aba0c] Updated Indonesian translation using Weblate
+
+# 2.3.0
+
+* Upgraded to follow Material3 guidelines including dynamic colors
+* Big improvements to TTS with the help of Kevin Jiang
+* App is now tablet friendly on all screens
+
+Kevin Jiang (7):
+ * [65eb5d73] feat(settings): added detect language to settings
+ * [0444b16a] feat(readaloud): detect language of the article for readaloud
+ * [7295d5c7] test: test newly added detect language setting
+ * [a4a3f843] Use separate description if language detect feature is not
+ available
+ * [45a63db4] Minor formatting change
+ * [c047a0dd] Fix typo
+ * [b8b73ab1] Updating test
+
+Agnieszka C (2):
+ * [0ec50961] Updated Polish translation using Weblate
+
+Andrij Mizyk (2):
+ * [464661bf] Updated Ukrainian translation using Weblate
+
+D221 (1):
+ * [13777023] Updated Lithuanian translation using Weblate
+
+ERYpTION (2):
+ * [8d2291d2] Updated Danish translation using Weblate
+
+El Pirujo (3):
+ * [addd743a] Updated Spanish translation using Weblate
+
+Eric (2):
+ * [ca0895a4] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [7dbc8c85] Updated French translation using Weblate
+
+Meiru (1):
+ * [f6c5e8e7] Updated Japanese translation using Weblate
+
+Oğuz Ersen (2):
+ * [fd60a78e] Updated Turkish translation using Weblate
+
+Simona Iacob (1):
+ * [a664e174] Translated using Weblate (Romanian)
+
+Tadeáš Erban (1):
+ * [ace40142] Updated Czech translation using Weblate
+
+VfBFan (2):
+ * [1105f0da] Updated German translation using Weblate
+
+atilluF (4):
+ * [37e9840b] Translated using Weblate (Italian)
+
+bruh (1):
+ * [2a89025b] Updated Vietnamese translation using Weblate
+
+zmni (1):
+ * [991fce3e] Updated Indonesian translation using Weblate
+
+Егор Ермаков (1):
+ * [4f4d9a4c] Updated Russian translation using Weblate
+
+Jonas Kalderstam (74):
+ * [bb2f8226] Fixed all restartable but not skippable functions
+ * [517efd70] Fixed some code formatting
+ * [d2828981] Modified strings to be shorter
+ * [fca6176f] Changed detect language settings to default to true
+ * [942c3dd0] Created new read aloud settings group
+ * [b892765e] Made detectLanguage slightly more robust for TTS failures
+ * [bc36a663] Bumped some dependencies
+ * [a442e159] Upgraded Android Gradle Plugin and such
+ * [c343a4b7] Builds tools version doesn't need to be specified anymore
+ * [28022f25] Bump rome version
+ * [360b1d12] Fixed deprecation warnings and api changes
+ * [eff41771] Removed accompanist insets - no longer needed
+ * [e7c9af4f] Implemented runtime permission for notifications
+ * [25d649fe] Some test fixes
+ * [0677cf1c] Fixed regression in edit feed view
+ * [5ab974b7] Removed all uses of live data since it seems buggy
+ * [f49cf9c6] Bumped rome version
+ * [361617d5] Theme
+ * [ada5c099] Upgraded to Material3 - seems to work even
+ * [9860a501] Implemented dynamic color scheme
+ * [a10b77e1] Theme respects black again
+ * [aaee2b64] Fixed color of status bar and padding
+ * [5799cc1a] More sensible size
+ * [f07a65a3] Fixed nav bar coloring on all versions
+ * [7dbf7f26] Handle navigation bar padding in horizontal
+ * [8598f2cd] Try giving foldables more usable space
+ * [a9392955] NavBar button becomes toggleable now on tablets
+ * [497c387c] Fixed more menu icons
+ * [5a7c7850] More foldable use
+ * [7aba6892] Forgot an activity
+ * [ef0958d1] Pre split
+ * [b3067123] Edit feed is dual now
+ * [9f9dc5e1] Search feed is dual now
+ * [8c7e8dee] Fixed color of cards and spec says image should be rounded
+ * [1a0f6c93] Fixed link color to something more pleasing
+ * [89f7cdf2] Updated indicators on feed items
+ * [92339e7d] Removed unused overload and fixed FeedListScrollbehavior
+ * [3ee4296f] Some animated navigation
+ * [3f875378] Fixed animated transitions in sync screens
+ * [73b71df2] Fixed scroll behavior for sync screens
+ * [d1d4761b] Fixed a bug in animation
+ * [75fe24b0] All screens animated and bottom bar fixed
+ * [12c1468e] Fixed lint check
+ * [5b87b130] Fixed bottom bar padding for navigation bar
+ * [6000b1f6] Fix text lines in app bar
+ * [365e902c] Fixed actions in top app bar to follow guidelines number
+ * [feed23d4] Fixed incorrect default value in edit feed screen
+ * [9b489168] Removed buggy sync indicators in navigation drawer
+ * [489f3bde] Updated fastlane metadata with new screenshots
+ * [4ad56535] Fixed color of indicator
+ * [a6419890] Changed to canonical text to speech icon
+ * [bbf0104b] Cleaned up custom icons
+ * [2adfbac7] Changed to original done all icon for FAB
+ * [af4a2dd1] Adjusted middle margin on tablets
+ * [405d680b] Updated to official URL annotation
+ * [a81a1b3c] Text given to TTS engine now has annotations
+ * [433a8bb1] Fixed device list screen not showing devices
+ * [87a068a5] Added a skip next button for TTS
+ * [4b461392] TTS now detect language for each paragraph
+ * [25449bb3] Moved stop icon to start
+ * [85d7ddf3] Added ability to force Locale on TTS
+ * [2458d2f5] Respect user locale order if set
+ * [2ecad20d] Revert "Updated to official URL annotation"
+ * [61486f13] Changed FAB to scaleIn animation as per guidelines
+ * [fb431fa2] Added string for Text to speech
+ * [2e67ac5b] Ignore RT tags in Ruby tags for now
+ * [9a391a1b] Improved handling of RTL text
+ * [2666f294] Improved RTL support in title bar
+ * [1f0e2da9] Translated using Weblate (Swedish)
+ * [8ae209c3] Further RTL improvements - now don't strip ZWNJ chars
+ * [5a9ab235] Split pipeline so timeout is not hit
+ * [e6b9aba6] Updated screenshots in README
+ * [af05221c] Fixed pipeline deps
+ * [38401846] Moved Mark All As Read to top of the menu
+
+# 2.2.7
+Jonas Kalderstam (1):
+ * [c333c453] Fixed mark above/below as read with pinned items
+
+Luna Jernberg (1):
+ * [27173e02] Updated Swedish translation using Weblate
+
+MkQtS (1):
+ * [379c4329] Updated Chinese (Simplified) translation using Weblate
+
+Simona Iacob (1):
+ * [60817d7b] Updated Romanian translation using Weblate
+
+мачко (1):
+ * [317bdcd5] Added Bulgarian translation using Weblate
+
+# 2.2.6
+D221 (1):
+ * [f6445c30] Updated Lithuanian translation using Weblate
+
+Freddy Morán Jr (1):
+ * [272e4800] Updated Spanish translation using Weblate
+
+H Tamás (1):
+ * [b39803b6] Updated Hungarian translation using Weblate
+
+Vitor Henrique (1):
+ * [00e0ae07] Updated Portuguese (Brazil) translation using Weblate
+
+WB (1):
+ * [62efdde3] Updated Galician translation using Weblate
+
+zmni (1):
+ * [b9c15802] Updated Indonesian translation using Weblate
+
+# 2.2.5
+Agnieszka C (1):
+ * [59c9f5d9] Updated Polish translation using Weblate
+
+Andrij Mizyk (1):
+ * [c51289a7] Updated Ukrainian translation using Weblate
+
+ERYpTION (1):
+ * [bf971897] Updated Danish translation using Weblate
+
+El Pirujo (1):
+ * [2b5a0bc7] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [c410021f] Updated Chinese (Simplified) translation using Weblate
+
+H Tamás (1):
+ * [3b2a72d9] Added Hungarian translation using Weblate
+
+J. Lavoie (1):
+ * [2161a18a] Updated Italian translation using Weblate
+
+Meiru (1):
+ * [9a3f100a] Updated Japanese translation using Weblate
+
+Oğuz Ersen (1):
+ * [648e9d5d] Updated Turkish translation using Weblate
+
+VfBFan (1):
+ * [14c66874] Updated German translation using Weblate
+
+mm4c (1):
+ * [48862b19] Updated Dutch translation using Weblate
+
+Егор Ермаков (1):
+ * [7dbee822] Translated using Weblate (Russian)
+
+# 2.2.4-1
+Jonas Kalderstam (2):
+ * [b8f4f64e] Fixed content provider preventing installs
+
+# 2.2.4
+Artem (1):
+ * [3f1e94b0] Translated using Weblate (Ukrainian)
+
+Belmar Begić (1):
+ * [62f9c28f] Updated Bosnian translation using Weblate
+
+Jonas Kalderstam (1):
+ * [1ae8eb07] Improved speed and reliability of swipe
+ * [dea765b9] Implemented content provider so other apps can access data
+ with permission
+
+# 2.2.3
+Athanasios Plastiras (1):
+ * [d3ea05e1] Updated Greek translation using Weblate
+
+Jonas Kalderstam (3):
+ * [57528ef1] Releasing 2.2.3
+ * [4889a5dc] Removed duplicate portugese language
+ * [6ca4df09] Removed duplicate portugese play store translation
+
+Simona Iacob (1):
+ * [b7cce278] Updated Romanian translation using Weblate
+
+Vítor Fernandes Almado (1):
+ * [8c81a0ed] Updated Portuguese translation using Weblate
+
+WB (1):
+ * [4c03fe85] Translated using Weblate (Galician)
+
+Weblate (1):
+ * [6c49bc96] Added Portuguese translation using Weblate
+
+# 2.2.3
+Athanasios Plastiras (1):
+ * [d3ea05e1] Updated Greek translation using Weblate
+
+Vítor Fernandes Almado (1):
+ * [8c81a0ed] Updated Portuguese translation using Weblate
+
+WB (1):
+ * [4c03fe85] Translated using Weblate (Galician)
+
+Weblate (1):
+ * [6c49bc96] Added Portuguese translation using Weblate
+
+# 2.2.2
+Andrij Mizyk (1):
+ * [5f9dfafd] Updated Ukrainian translation using Weblate
+
+Jonas Kalderstam (1):
+ * [2bf95ec2] Fixed list incorrectly scrolling up when marking as read
+
+Meiru (1):
+ * [7e74a6d9] Updated Japanese translation using Weblate
+
+VfBFan (1):
+ * [1d9c7dcd] Updated German translation using Weblate
+
+zmni (1):
+ * [40ec8315] Updated Indonesian translation using Weblate
+
+# 2.2.1
+Ady (1):
+ * [41c33ece] Updated French translation using Weblate
+
+Agnieszka C (1):
+ * [76baedde] Updated Polish translation using Weblate
+
+Andrij Mizyk (1):
+ * [88ebe3cd] Updated Ukrainian translation using Weblate
+
+ERYpTION (1):
+ * [f99360d4] Updated Danish translation using Weblate
+
+El Pirujo (1):
+ * [8355e4b1] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [7247ce08] Updated Chinese (Simplified) translation using Weblate
+
+Jonas Kalderstam (1):
+ * [ed0f3c33] Fixed crash when feeds have items with bad links
+
+Nikita Epifanov (1):
+ * [575fc3b3] Updated Russian translation using Weblate
+
+Oğuz Ersen (1):
+ * [5b1c4f60] Updated Turkish translation using Weblate
+
+Vitor Henrique (1):
+ * [576be0f3] Updated Portuguese (Brazil) translation using Weblate
+
+mm4c (1):
+ * [7980253d] Updated Dutch translation using Weblate
+
+# 2.2.0
+Ady (6):
+ * [6f4bcab2] Update schema to add bookmarked status
+ * [0ab5b1bb] Toggle bookmarks
+ * [a90b04ce] Allow to filter lists per bookmarks
+ * [2ad907ef] Align bookmark icon to the right
+ * [a610cfab] Remove unnecessary code for bookmark's alignement
+ * [132ced2a] Handle bookmarks sorting by date, feed and tag
+
+Jonas Kalderstam (4):
+ * [b8b414a6] Fixed DB test 21->22
+ * [6e79da27] Added DB migration test 22->23
+ * [3ffe84f1] Removed Galician language when deploying to play store; not
+ supported by Google
+ * [fba8c0db] Removed Galician from App; not supported by Android
+
+Simone Dotto (1):
+ * [35eac7c8] Updated Italian translation using Weblate
+
+antonpaidoslalin (1):
+ * [356d1c26] Translated using Weblate (Galician)
+
+# 2.1.8
+Ben Beaver (2):
+ * [e0d24b91] Added Toki Pona translation using Weblate
+ * [5be9e915] Translated using Weblate (Toki Pona)
+
+ERYpTION (1):
+ * [72d5b3fb] Translated using Weblate (Danish)
+
+Jonas Kalderstam (2):
+ * [bc4c314c] Toki Pona is not supported by Play Store
+ * [5b46fa0a] Toki Pona not supported by Android
+
+Vitor Henrique (1):
+ * [bef7d13c] Updated Portuguese (Brazil) translation using Weblate
+
+# 2.1.7
+Alan (1):
+ * [93606b38] Updated Portuguese (Brazil) translation using Weblate
+
+ERYpTION (1):
+ * [40bb39a8] Updated Danish translation using Weblate
+
+Meiru (1):
+ * [26e075aa] Updated Japanese translation using Weblate
+
+Nikita Epifanov (1):
+ * [aab536a0] Updated Russian translation using Weblate
+
+WB (1):
+ * [09af6ab5] Updated Galician translation using Weblate
+
+bruh (1):
+ * [10e8db60] Updated Vietnamese translation using Weblate
+
+zmni (1):
+ * [3ff53b65] Updated Indonesian translation using Weblate
+
+# 2.1.6
+Agnieszka C (1):
+ * [0864c9f5] Updated Polish translation using Weblate
+
+Andrij Mizyk (1):
+ * [b2a24f8a] Updated Ukrainian translation using Weblate
+
+ERYpTION (1):
+ * [a045d6bd] Updated Danish translation using Weblate
+
+El Pirujo (1):
+ * [bcaeb600] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [377e36c4] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [53c9a700] Updated Italian translation using Weblate
+
+Jonas Kalderstam (1):
+ * [afa77107] Updated Swedish translation using Weblate
+
+Manapart (1):
+ * [e0288297] Create Block List that filters out feed items with a blocked
+ word
+
+Oğuz Ersen (1):
+ * [47fc2a0a] Updated Turkish translation using Weblate
+
+VfBFan (1):
+ * [ca5e5fce] Updated German translation using Weblate
+
+Vitor Henrique (1):
+ * [17dfc130] Updated Portuguese (Brazil) translation using Weblate
+
+eevan78 (1):
+ * [760e6da0] Updated Serbian translation using Weblate
+
+mm4c (1):
+ * [9376ad3c] Updated Dutch translation using Weblate
+
+zmni (1):
+ * [ce5d1a0d] Updated Indonesian translation using Weblate
+
+# 2.1.5
+Andrij Mizyk (1):
+ * [a3a24eb2] Updated Ukrainian translation using Weblate
+
+Belmar Begić (1):
+ * [1f14b005] Updated Bosnian translation using Weblate
+
+El Pirujo (1):
+ * [abb2ed1c] Updated Spanish translation using Weblate
+
+J. Lavoie (1):
+ * [106499ed] Updated Italian translation using Weblate
+
+Jonas Kalderstam (8):
+ * [0692737a] Disabled Sync API request when not configured
+ * [559c5e50] Fixed crash when removing already removed device
+ * [78791758] Moved all syncing of read status to regular sync job
+
+Meiru (1):
+ * [a87e1b91] Updated Japanese translation using Weblate
+
+Oğuz Ersen (1):
+ * [8f5c9838] Updated Turkish translation using Weblate
+
+mm4c (1):
+ * [99518473] Updated Dutch translation using Weblate
+
+# 2.1.4
+Agnieszka C (1):
+ * [066ab713] Updated Polish translation using Weblate
+
+ERYpTION (1):
+ * [a7c0746b] Updated Danish translation using Weblate
+
+Eric (1):
+ * [369136d5] Updated Chinese (Simplified) translation using Weblate
+
+Jonas Kalderstam (2):
+ * [ce2f7648] Ktlint format
+ * [b218326e] Fixed a crash introduced in 2.1.3
+
+# 2.1.3
+Andrij Mizyk (1):
+ * [059041bc] Updated Ukrainian translation using Weblate
+
+J. Lavoie (1):
+ * [474462cb] Updated French translation using Weblate
+
+Jonas Kalderstam (1):
+ * [4bc528b7] Added ability to pin an article to top of the feed
+
+Julian Chu (1):
+ * [d69a0490] Updated Chinese (Traditional) translation using Weblate
+
+mm4c (1):
+ * [9a91d313] Updated Dutch translation using Weblate
+
+# 2.1.2
+Jonas Kalderstam (1):
+ * [d06407a5] Fixed broken test
+
+mm4c (1):
+ * [c7a09365] Updated Dutch translation using Weblate
+
+# 2.1.1
+Julian Chu (1):
+ * [95ea703a] Updated Chinese (Traditional) translation using Weblate
+
+Meiru (1):
+ * [69437712] Updated Japanese translation using Weblate
+
+Simona Iacob (1):
+ * [99636a46] Updated Romanian translation using Weblate
+
+Vitor Henrique (1):
+ * [9a14699f] Updated Portuguese (Brazil) translation using Weblate
+
+bruh (1):
+ * [f2c70991] Updated Vietnamese translation using Weblate
+
+mm4c (1):
+ * [6fe26dc0] Updated Dutch translation using Weblate
+
+# 2.1.0-1
+Jonas Kalderstam (19):
+ * [24c0c8fd] Implemented multi device sync
+ * [211b1281] Fixed spaces getting replaced by + in feed titles
+ * [4cfd9e2e] Fixed incorrect bundling of notifications and sync
+ notification
+ * [96cd9754] Added setting for swiping to mark as read
+ * [154ad356] Fixed summary notification not getting cleared
+ * [416bb580] Changed all header sizes inside articles to be the same size
+ * [16ef3dc5] Fixed OPML export file lacking .opml suffix
+ * [211bcf43] Fixed Play store locale code for Danish
+ * [231293f4] Updated Swedish translation using Weblate
+ * [1f6a35cc] Added confirmation dialog for leaving sync chain
+ * [b084f454] Added message if barcode scanner could not be opened
+ * [c7e01269] Updated Swedish translation using Weblate
+ * [6364a49b] Fixed navigation bar obscuring UI in landscape
+ * [be6f312d] Improved read aloud by splitting text on more punctuation
+ * [f2f5fcfe] Fixed crash in case Play button in Read Aloud was double
+ clicked
+ * [cbe64e8b] Updated sync code to match server side updates
+
+Agnieszka C (3):
+ * [c68321b8] Updated Polish translation using Weblate
+
+Andrij Mizyk (3):
+ * [c32113b2] Updated Ukrainian translation using Weblate
+
+ERYpTION (3):
+ * [06039102] Updated Danish translation using Weblate
+
+El Pirujo (3):
+ * [2f615a19] Updated Spanish translation using Weblate
+
+Eric (3):
+ * [a5277f50] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (3):
+ * [81011919] Updated Italian translation using Weblate
+
+Meiru (3):
+ * [c3a00180] Updated Japanese translation using Weblate
+
+Nikita Epifanov (2):
+ * [f0fb62af] Updated Russian translation using Weblate
+
+Oğuz Ersen (3):
+ * [84a47963] Updated Turkish translation using Weblate
+
+Simona Iacob (2):
+ * [9b00f1d3] Updated Romanian translation using Weblate
+
+THANOS SIOURDAKIS (1):
+ * [004c6444] Updated Greek translation using Weblate
+
+Tadeáš Erban (2):
+ * [dc307594] Updated Czech translation using Weblate
+
+VfBFan (4):
+ * [6541d7c1] Updated German translation using Weblate
+
+Vitor Henrique (2):
+ * [5aca1d6e] Updated Portuguese (Brazil) translation using Weblate
+
+mm4c (3):
+ * [292e58fa] Updated Dutch translation using Weblate
+
+zmni (1):
+ * [496f8abc] Updated Indonesian translation using Weblate
+
+Éfrit (1):
+ * [5959c512] Updated French translation using Weblate
+
+# 2.1.0
+Agnieszka C (3):
+ * [c68321b8] Updated Polish translation using Weblate
+
+Andrij Mizyk (3):
+ * [c32113b2] Updated Ukrainian translation using Weblate
+
+ERYpTION (3):
+ * [06039102] Updated Danish translation using Weblate
+
+El Pirujo (3):
+ * [2f615a19] Updated Spanish translation using Weblate
+
+Eric (3):
+ * [a5277f50] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (3):
+ * [81011919] Updated Italian translation using Weblate
+
+Jonas Kalderstam (19):
+ * [24c0c8fd] Implemented multi device sync
+ * [211b1281] Fixed spaces getting replaced by + in feed titles
+ * [4cfd9e2e] Fixed incorrect bundling of notifications and sync
+ notification
+ * [96cd9754] Added setting for swiping to mark as read
+ * [154ad356] Fixed summary notification not getting cleared
+ * [416bb580] Changed all header sizes inside articles to be the same size
+ * [16ef3dc5] Fixed OPML export file lacking .opml suffix
+ * [211bcf43] Fixed Play store locale code for Danish
+ * [231293f4] Updated Swedish translation using Weblate
+ * [1f6a35cc] Added confirmation dialog for leaving sync chain
+ * [b084f454] Added message if barcode scanner could not be opened
+ * [c7e01269] Updated Swedish translation using Weblate
+ * [6364a49b] Fixed navigation bar obscuring UI in landscape
+ * [be6f312d] Improved read aloud by splitting text on more punctuation
+ * [f2f5fcfe] Fixed crash in case Play button in Read Aloud was double
+ clicked
+ * [cbe64e8b] Updated sync code to match server side updates
+
+Meiru (3):
+ * [c3a00180] Updated Japanese translation using Weblate
+
+Nikita Epifanov (2):
+ * [f0fb62af] Updated Russian translation using Weblate
+
+Oğuz Ersen (3):
+ * [84a47963] Updated Turkish translation using Weblate
+
+Simona Iacob (2):
+ * [9b00f1d3] Updated Romanian translation using Weblate
+
+THANOS SIOURDAKIS (1):
+ * [004c6444] Updated Greek translation using Weblate
+
+Tadeáš Erban (2):
+ * [dc307594] Updated Czech translation using Weblate
+
+VfBFan (4):
+ * [6541d7c1] Updated German translation using Weblate
+
+Vitor Henrique (2):
+ * [5aca1d6e] Updated Portuguese (Brazil) translation using Weblate
+
+mm4c (3):
+ * [292e58fa] Updated Dutch translation using Weblate
+
+zmni (1):
+ * [496f8abc] Updated Indonesian translation using Weblate
+
+Éfrit (1):
+ * [5959c512] Updated French translation using Weblate
+
+# 2.0.14
+Jonas Kalderstam (1):
+ * [90e8048c] Fixed spaces getting replaced by + in feed titles
+
+# 2.0.13
+Anne Onyme 017 (1):
+ * [896b575f] Updated French translation using Weblate
+
+Jonas Kalderstam (4):
+ * [6ee7f869] Fixed open notification not marking it as read or notified
+ * [683da3e0] Fixed images using srcset but no src not showing
+
+Luna Jernberg (1):
+ * [7dd75f18] Updated Swedish translation using Weblate
+
+Nikita Epifanov (1):
+ * [3b4d66fa] Updated Russian translation using Weblate
+
+Simona Iacob (1):
+ * [a69440bd] Updated Romanian translation using Weblate
+
+Tadeáš Erban (1):
+ * [9e4460b1] Translated using Weblate (Czech)
+
+Vitor Henrique (1):
+ * [11630420] Updated Portuguese (Brazil) translation using Weblate
+
+bruh (1):
+ * [60c71749] Updated Vietnamese translation using Weblate
+
+mm4c (1):
+ * [9c1befbd] Updated Dutch translation using Weblate
+
+# 2.0.12
+Agnieszka C (1):
+ * [7daeddf9] Updated Polish translation using Weblate
+
+Allan Nordhøy (1):
+ * [ce11cb59] Updated Norwegian Bokmål translation using Weblate
+
+Andrij Mizyk (1):
+ * [750a0665] Updated Ukrainian translation using Weblate
+
+El Pirujo (1):
+ * [00a98173] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [38dcf806] Updated Chinese (Simplified) translation using Weblate
+
+I. Musthafa (1):
+ * [a08922ba] Updated Indonesian translation using Weblate
+
+J. Lavoie (1):
+ * [3cba889d] Updated Italian translation using Weblate
+
+Jonas Kalderstam (3):
+ * [54d33a4f] Changed sync notification icon to a different icon than
+ regular notifications
+ * [72a3d842] Fixed clicking on notifications not opening article
+ * [504d0339] Fixed feed responses being mangled sometimes
+
+Oğuz Ersen (1):
+ * [bbe1a9c0] Updated Turkish translation using Weblate
+
+VfBFan (1):
+ * [f768b9eb] Updated German translation using Weblate
+
+Vitor Henrique (1):
+ * [7d6eb347] Updated Portuguese (Brazil) translation using Weblate
+
+mm4c (1):
+ * [71228fb7] Updated Dutch translation using Weblate
+
+# 2.0.11
+Jonas Kalderstam (5):
+ * [1e4ecf09] Fixed crash when opening app
+ * [64b0c705] Fixed a reported crash (rare edge case)
+ * [735190fd] Fixed rare crash in case no TextToSpeech engine was installed
+ * [cedbb7ea] Fixed UI getting stuck in a weird empty state
+ * [8a11ce87] Added some handling in case an open article is deleted
+
+Nikita Epifanov (1):
+ * [494e7a56] Updated Russian translation using Weblate
+
+Vitor Henrique (1):
+ * [0d968db5] Updated Portuguese (Brazil) translation using Weblate
+
+gutierri (1):
+ * [9ec9cf6a] Updated Portuguese (Brazil) translation using Weblate
+
+mm4c (1):
+ * [2f4ed127] Updated Dutch translation using Weblate
+
+# 2.0.10
+Jonas Kalderstam (2):
+ * [6bbabe68] Fixed open in browser opening wrong link
+ * [696203ea] Renamed folder to match Play store restrictions
+
+Simona Iacob (1):
+ * [b10efbc5] Updated Romanian translation using Weblate
+
+mm4c (1):
+ * [1ac2b331] Translated using Weblate (Dutch)
+
+# 2.0.9
+Jonas Kalderstam (2):
+ * [5c9259cc] Fixed app not respecting what to open articles with
+ * [28618bc9] Fixed notifications not dismissing when reading articles
+
+mm4c (1):
+ * [b85fd95c] Updated Dutch translation using Weblate
+
+zmni (1):
+ * [1600cb79] Updated Indonesian translation using Weblate
+
+# 2.0.8
+Agnieszka C (2):
+ * [b8857312] Updated Polish translation using Weblate
+
+Andrij Mizyk (2):
+ * [7bbed7f1] Updated Ukrainian translation using Weblate
+
+El Pirujo (2):
+ * [3bbb9216] Updated Spanish translation using Weblate
+
+Eric (2):
+ * [e3a59bbe] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (2):
+ * [993a07b8] Updated Italian translation using Weblate
+
+Jonas Kalderstam (7):
+ * [f976af75] Fixed sync indicator getting stuck sometimes
+ * [3d3da496] Added sync progress indicators on individual feeds in nav
+ drawer
+ * [bb505183] Reduced minimum feed age for sync to 5 minutes instead of 15
+ * [c4228d47] Fixed hardware keyboard support: ENTER now works as expected
+ * [df92ffab] Upgraded and added some dependencies
+ * [50aa5e47] Improved error message when OPML import/export fails
+ * [c993b876] Implemented Tablet only interface
+
+Naveen (1):
+ * [2dfed712] Updated Tamil translation using Weblate
+
+Nikita Epifanov (1):
+ * [818745b8] Updated Russian translation using Weblate
+
+Oğuz Ersen (2):
+ * [23354741] Updated Turkish translation using Weblate
+
+Simona Iacob (1):
+ * [1793a4a4] Updated Romanian translation using Weblate
+
+VfBFan (1):
+ * [55006182] Updated German translation using Weblate
+
+bruh (2):
+ * [200be0ce] Updated Vietnamese translation using Weblate
+
+g (1):
+ * [faf4d7d3] Updated Lithuanian translation using Weblate
+
+# 2.0.7
+Agnieszka C (1):
+ * [eccc086f] Updated Polish translation using Weblate
+
+Andrij Mizyk (1):
+ * [5c30def8] Updated Ukrainian translation using Weblate
+
+El Pirujo (1):
+ * [17ae3a97] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [0449b989] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [87cf87f4] Updated Italian translation using Weblate
+
+Jonas Kalderstam (1):
+ * [1001815d] Fixed crash introduced in 2.0.5
+
+Oğuz Ersen (1):
+ * [450919e5] Updated Turkish translation using Weblate
+
+VfBFan (1):
+ * [4b67ae83] Updated German translation using Weblate
+
+Vitor Henrique (1):
+ * [a00177be] Updated Portuguese (Brazil) translation using Weblate
+
+g (1):
+ * [0e94edb6] Updated Lithuanian translation using Weblate
+
+zmni (1):
+ * [9eb6273d] Updated Indonesian translation using Weblate
+
+# 2.0.6
+I. Musthafa (1):
+ * [f4801944] Translated using Weblate (Indonesian)
+
+Jonas Kalderstam (10):
+ * [60416443] Fixed scroll in Feed being cleared when going back from
+ Reader
+ * [bf7de231] Fixed translucent navigation bar on Android 23-26
+ * [de683726] Fixed reconfiguration of sync when changing sync settings
+ * [5af7f79b] Stopped requiring high battery for sync
+ * [e7a2f364] Added code to ensure sync is configured on app start
+ * [be5d7540] Improved support for background restrictions in Android 12
+ * [4193fd74] Improved reliability of notifications
+ * [5014172b] Fixed a possible collision with article IDs
+
+Nikita Epifanov (1):
+ * [0881dc4a] Updated Russian translation using Weblate
+
+Simona Iacob (1):
+ * [289553fa] Updated Romanian translation using Weblate
+
+VfBFan (1):
+ * [5b073871] Updated German translation using Weblate
+
+# 2.0.5
+Agnieszka C (1):
+ * [7bc1efe6] Updated Polish translation using Weblate
+
+Allan Nordhøy (1):
+ * [9ce82f0e] Updated Norwegian Bokmål translation using Weblate
+
+Andrij Mizyk (1):
+ * [dfb5c4b6] Updated Ukrainian translation using Weblate
+
+El Pirujo (1):
+ * [97fde55f] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [9bd20bd3] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [2d4e241b] Updated Italian translation using Weblate
+
+Jonas Kalderstam (2):
+ * [e83489e2] Added missing string resource
+ * [6fcd11d9] Updated Swedish translation using Weblate
+
+Nikita Epifanov (1):
+ * [68defb93] Updated Russian translation using Weblate
+
+Oğuz Ersen (1):
+ * [fb3b4b82] Updated Turkish translation using Weblate
+
+VfBFan (1):
+ * [5f7ae0c7] Updated German translation using Weblate
+
+g (1):
+ * [9bfaa162] Updated Lithuanian translation using Weblate
+
+zmni (1):
+ * [12554068] Updated Indonesian translation using Weblate
+
+# 2.0.4
+Agnieszka C (1):
+ * [625596b8] Updated Polish translation using Weblate
+
+Andrij Mizyk (1):
+ * [d46b883b] Updated Ukrainian translation using Weblate
+
+El Pirujo (1):
+ * [cc83e248] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [b83579fa] Updated Chinese (Simplified) translation using Weblate
+
+Gediminas Murauskas (1):
+ * [9d469462] Updated Lithuanian translation using Weblate
+
+J. Lavoie (1):
+ * [214dff39] Updated Italian translation using Weblate
+
+Jonas Kalderstam (1):
+ * [d0486040] Fixed crash with certain tag names
+
+Oğuz Ersen (1):
+ * [4bed2875] Updated Turkish translation using Weblate
+
+VfBFan (1):
+ * [481dbcd5] Updated German translation using Weblate
+
+# 2.0.3
+Allan Nordhøy (4):
+ * [6f5418e3] Crowdin integration removed
+ * [826a18df] Correct locale for Norwegian Bokmål
+ * [871143e8] Reworded some strings
+ * [1612b7c2] Updated Norwegian Bokmål translation using Weblate
+
+Jonas Kalderstam (1):
+ * [c4048f9f] Added a new feed option to fix feeds with bad ids
+
+Simona Iacob (1):
+ * [eaddfe7e] Updated Romanian translation using Weblate
+
+THANOS SIOURDAKIS (1):
+ * [99f8e333] Updated Greek translation using Weblate
+
+harisai (1):
+ * [28fcb903] Added Telugu translation using Weblate
+
+# 2.0.2
+Agnieszka C (1):
+ * [2530f074] Updated Polish translation using Weblate
+
+Andrij Mizyk (1):
+ * [dc7b2c8f] Translated using Weblate (Ukrainian)
+
+Eric (1):
+ * [99457a1a] Updated Chinese (Simplified) translation using Weblate
+
+Felipe Alvarez (2):
+ * [aed89f36] Hide FAB when feed is empty
+ * [3154cf7a] Swap booleans order
+
+Gediminas Murauskas (1):
+ * [0bd119ca] Updated Lithuanian translation using Weblate
+
+J. Lavoie (1):
+ * [02c90a84] Updated Italian translation using Weblate
+
+Jonas Kalderstam (11):
+ * [0dce0373] Fixed back button not exiting app
+ * [47e48e54] Added Compose test for back button exiting the app
+ * [bb113d33] Fixed some broken tests
+ * [20517a02] Disabled broken sync test
+ * [4b3e83f9] Fixed scrolling in Reader not working close to screen edges
+ * [7eb2d0f8] Fixed crash if loading very large (50MB+) images
+ * [941b3341] Fixed black theme not having true black as background
+ * [31851c94] Fixed crash when adding feed with empty title
+ * [96d13aef] Fixed Open Items By Default not defauling to system default
+ * [a74c8664] Change RSS ID generation again to avoid some duplicates
+ * [dca107a1] Fixed links always opening in custom tab
+
+Nikita Epifanov (1):
+ * [972a4a75] Updated Russian translation using Weblate
+
+Oğuz Ersen (1):
+ * [6b8ec48f] Updated Turkish translation using Weblate
+
+bruh (1):
+ * [02d0b027] Updated Vietnamese translation using Weblate
+
+zmni (1):
+ * [83b12cb6] Updated Indonesian translation using Weblate
+
+# 2.0.1
+Felipe Alvarez (7):
+ * [656a276a] Added new dark theme
+
+Jonas Kalderstam (16):
+ * [204f854d] Fixed some reported crashes
+ * [7324a25c] Fixed possible crashes in semantics
+ * [3d21a700] Fixed possible crash reported in play store
+ * [81b81aa1] Fixed tags with certain characters not working correctly
+ * [63fa3b54] Added a search button to the search screen
+ * [c896bba0] Fixed handling of ids in RSS feeds where guid is not unique
+ * [8b860ae9] Added share action to long press menu in FeedScreen
+ * [c95053ef] Updated swedish translation
+
+Nuno Araújo (1):
+ * [d4a8d9ff] Updated Portuguese (Portugal) translation using Weblate
+
+THANOS SIOURDAKIS (1):
+ * [e688797f] Updated Greek translation using Weblate
+
+VfBFan (1):
+ * [25966dc2] Updated German translation using Weblate
+
+zmni (1):
+ * [18fcb357] Updated Indonesian translation using Weblate
+
+# 2.0.0
+
+* UI layer of Feeder has been rewritten in Jetpack Compose
+* Improved accessibility
+* Added choice of style for articles in list
+* Added a playback interface for TextToSpeech
+* Translation updates by the community
+
+# 2.0.0-rc.4
+Agnieszka C (1):
+ * [89ba5aef] Updated Polish translation using Weblate
+
+Andrij Mizyk (1):
+ * [38b0167b] Updated Ukrainian translation using Weblate
+
+El Pirujo (1):
+ * [34edcbc3] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [97085761] Updated Chinese (Simplified) translation using Weblate
+
+Gediminas Murauskas (1):
+ * [12b100a1] Updated Lithuanian translation using Weblate
+
+J. Lavoie (2):
+ * [f4e87145] Updated German translation using Weblate
+ * [a032ba03] Updated Italian translation using Weblate
+
+Jim (1):
+ * [8a252911] Updated Chinese (Traditional) translation using Weblate
+
+Jonas Kalderstam (9):
+ * [b9a627d4] Use BoxWithConstraints instead of onLayout Callback
+ * [f59c5dc5] Increased swipable thresholds to mitigate mistaken swipes
+ * [d4138a7a] Suppress some warnings
+ * [d0498ff0] Fixed so list scrolls to top after mark above as read
+ * [bcfa2e7b] Updated Swedish translation using Weblate
+ * [6c96cdc2] Fixed sharing article link
+ * [777be597] Fixed customtab/browser not marking articles as read
+ * [980af280] Moved SearchFeed to own package
+ * [4e87becf] Made UI not so wide on tablets
+
+Nikita Epifanov (1):
+ * [9b3e4bbd] Updated Russian translation using Weblate
+
+Oğuz Ersen (1):
+ * [3157b54c] Updated Turkish translation using Weblate
+
+Simona Iacob (1):
+ * [991f1204] Updated Romanian translation using Weblate
+
+bruh (1):
+ * [1e442a3c] Updated Vietnamese translation using Weblate
+
+Éfrit (1):
+ * [8780fab4] Translated using Weblate (French)
+
+# 2.0.0-rc.3
+Andrij Mizyk (2):
+ * [4615622f] Updated Ukrainian translation using Weblate
+
+Jam Jam (2):
+ * [e2cd1132] Translated using Weblate (Ukrainian)
+
+Jonas Kalderstam (15):
+ * [5b0892ff] Fixed infinite loop issue if for example a notification was
+ clicked then back
+ * [0b35343c] Fixed app shortcuts not being cleared after delete
+ * [5b0badf8] Fixed TTS (and rest of app) not working on Android S
+ * [afdca651] Fixed image placeholders
+ * [95118fa6] Fixed images in reader view
+ * [4669d4d3] Added a new setting: style of articles in list
+
+Mixter (2):
+ * [12ce17fd] Updated Chinese (Traditional) translation using Weblate
+
+Simona Iacob (1):
+ * [16520c88] Updated Romanian translation using Weblate
+
+VfBFan (1):
+ * [575e1dc0] Updated German translation using Weblate
+
+# 2.0.0-rc.2
+Agnieszka C (1):
+ * [b36db45a] Updated Polish translation using Weblate
+
+El Pirujo (1):
+ * [5c5a3c91] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [76e9eba5] Updated Chinese (Simplified) translation using Weblate
+
+Gediminas Murauskas (1):
+ * [0d802855] Updated Lithuanian translation using Weblate
+
+J. Lavoie (1):
+ * [0aa39250] Updated Italian translation using Weblate
+
+Jonas Kalderstam (7):
+ * [d94de6a7] Fixed so TextToSpeech is not initialized as part of App
+ startup
+ * [e717ab31] Added plural forms for n_unread_articles string
+ * [fe8faac4] Changed so CI pipeline builds APK with R8 optimizations
+ * [d4792743] Slightly increased size of title in list
+ * [3e00725f] Fixed so read aloud player is not behind navigation bars
+ * [302da01a] Fixed inconsistent behavior with different sort options
+ * [214e6660] Updated Swedish translation using Weblate
+
+Oğuz Ersen (1):
+ * [03f2be20] Updated Turkish translation using Weblate
+
+bruh (1):
+ * [5d3998ec] Updated Vietnamese translation using Weblate
+
+# 2.0.0-rc.1
+Jonas Kalderstam (10):
+ * [f0e87b8a] Fixed accessibility descriptions
+ * [fa632512] Changed to Readability4JExtended for full text parsing
+ * [908efc98] Made Feeder very TalkBack compatible
+ * [3fda9092] Fixed so Feeder handles rotation gracefully
+
+# 2.0.0-beta.6
+Jonas Kalderstam (5):
+ * [08760e63] Fixed sync indicator being rendered behind top app bar
+ * [92e802b0] Added ability to toggle between full text and included
+ article text
+ * [e46f91ff] Fixed so scroll to refresh works on the empty screen again
+ * [47c40796] Adding some fade in/out animations to empty screen
+ * [d1275492] Tweaked some padding in list
+
+# 2.0.0-beta.5
+Jonas Kalderstam (6):
+ * [0ad40b9e] Fixed incorrect decoding during parsing for some feeds
+ * [d0b6ca47] Fixed color of icon in floating action bar to be white
+ (again)
+ * [fe52639e] Made 'Mark as read' from notification less interuptive
+ * [7c24c763] Fixed broken test
+ * [78da415a] Feeds are now sorted alphabetically in dialogs
+ * [1e2fe647] Added dialog for editing feed when viewing a tag (like for
+ delete)
+
+# 2.0.0-beta.4
+Jonas Kalderstam (10):
+ * [fdb700fa] Reversed expansion icons in navigation drawer to match
+ material design
+ * [3e6ce929] Fixed youtube thumbnails and made images clickable
+ * [56a6e464] Sync on startup if set
+ * [b7e74a11] Feed Title clickable in Reader again
+ * [f5ecd777] Fixed color of status bar and navigation bar
+ * [f975fda2] Fixed toolbar color in custom tab
+
+# 2.0.0-beta.3
+Jonas Kalderstam (2):
+ * [a97a0257] Fixed some notifications not being cleared when opened
+ * [3f8240f3] Fixed feeds not being possible to add after enabling R8
+
+# 2.0.0-beta.2
+Jonas Kalderstam (5):
+ * [60694836] Renamed Norwegian play store metadata
+ * [9c8f5e07] Validate fastlane deployment on 2.0.0 branch
+ * [aea58578] Enabled R8 - compose relies heavily on it for performance
+ * [3d2aa645] Fixed mapping directive in Fastlane
+ * [93b8f4c8] Added beta support to fastlane
+
+# 2.0.0-beta.1
+
+Complete rewrite of the UI in Jetpack Compose
+
+Expect bugs, but all features should be present.
+
+# 1.13.5
+Jonas Kalderstam (2):
+ * [b9c97797] Changed so Feeder no longer changes the URL of feeds to
+ canonical selflink
+ * [a01dafc7] Updated Swedish translation using Weblate
+
+Luna Jernberg (1):
+ * [850f411d] Updated Swedish translation using Weblate
+
+# 1.13.4
+Agnieszka C (2):
+ * [098172c1] Updated Polish translation using Weblate
+ * [d8455440] Updated Polish translation using Weblate
+
+Gediminas Murauskas (1):
+ * [8a3df04f] Translated using Weblate (Lithuanian)
+
+Jonas Kalderstam (1):
+ * [b164dece] Added missing title for language lt
+
+PPNplus (1):
+ * [18a39e63] Added Thai translation using Weblate
+
+Thien Bui (1):
+ * [3d4cd189] Updated Vietnamese translation using Weblate
+
+VfBFan (2):
+ * [2ae60832] Translated using Weblate (German)
+ * [368fa8ac] Updated German translation using Weblate
+
+Weblate (1):
+ * [35327cea] Added Slovenian translation using Weblate
+
+daywalk3r666 (2):
+ * [7a22bd67] Updated German translation using Weblate
+ * [1ba9b59f] Updated German translation using Weblate
+
+# 1.13.3
+Agnieszka C (1):
+ * [029f7af4] Updated Polish translation using Weblate
+
+Jonas Kalderstam (5):
+ * [199e8bf6] Improved formatting - should be less empty space and newlines
+
+Naveen (1):
+ * [eaae183b] Translated using Weblate (Tamil)
+
+Nikhil Kadiyan (1):
+ * [7bed6c84] Translated using Weblate (Hindi)
+
+# 1.13.2
+Drhaal (1):
+ * [c4545c2b] Use different colors when swiping to mark article as
+ read/unread
+
+J. Lavoie (1):
+ * [9d750135] Updated German translation using Weblate
+
+Jonas Kalderstam (8):
+ * [cadaef03] Raised minimum supported version of Android to M (6.0 -
+ API23)
+ * [df11985f] Added support for TLSv1.3 on older versions of Android
+ * [40549eea] Update README.md with ko-fi link
+
+Naveen (1):
+ * [b2422d25] Added Tamil translation using Weblate
+
+gutierri (1):
+ * [7426f9d0] Updated Portuguese (Brazil) translation using Weblate
+
+# 1.13.1
+Axus Wizix (1):
+ * [2f4d770f] Updated Russian translation using Weblate
+
+Belmar Begić (1):
+ * [c8af81d8] Updated Bosnian translation using Weblate
+
+Jonas Kalderstam (4):
+ * [533e92d4] Specified the region of bare Portuguese to Portugal
+ * [73e6cddb] Translated using Weblate (Romanian)
+ * [2d173196] Fixed dc:creator not showing up as author in RSS feeds
+ * [0a2452c5] Updated Czech translation using Weblate
+
+Simona Iacob (1):
+ * [ec364392] Updated Romanian translation using Weblate
+
+bruh (1):
+ * [8652f087] Translated using Weblate (Vietnamese)
+
+zmni (1):
+ * [2b3e17bb] Updated Indonesian translation using Weblate
+
+# 1.13.0
+Drhaal (1):
+ * [64512d3a] Added option to set article reader on a per feed basis
+
+El Pirujo (1):
+ * [966376eb] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [fd48664d] Updated Chinese (Simplified) translation using Weblate
+
+J. Lavoie (1):
+ * [4995ea75] Updated Italian translation using Weblate
+
+Oğuz Ersen (1):
+ * [add0ef71] Updated Turkish translation using Weblate
+
+Simona Iacob (1):
+ * [47baaad1] Added Romanian translation using Weblate
+
+VfBFan (1):
+ * [e03eabb2] Updated German translation using Weblate
+
+WaldiS (1):
+ * [a375332b] Updated Polish translation using Weblate
+
+phlostically (1):
+ * [0293dec5] Updated Esperanto translation using Weblate
+
+ssantos (1):
+ * [46890329] Translated using Weblate (Portuguese)
+
+zmni (1):
+ * [b351658f] Updated Indonesian translation using Weblate
+
+# 1.12.1
+Belmar Begić (1):
+ * [666f0e3c] Updated Bosnian translation using Weblate
+
+J. Lavoie (1):
+ * [cccbf8a7] Updated German translation using Weblate
+
+Jonas Kalderstam (1):
+ * [67f53ebc] Prevent fastlane from conflicting on releases
+
+Tomáš Tihlařík (1):
+ * [40adb64f] Updated czech strings
+
+VfBFan (1):
+ * [92e2a263] Updated German translation using Weblate
+
+cld4h (1):
+ * [95e8f6df] Translated using Weblate (Chinese (Simplified))
+
+# 1.12.0
+El Pirujo (1):
+ * [ddf06c3a] Updated Spanish translation using Weblate
+
+Eric (1):
+ * [34e65ed7] Updated Chinese (Simplified) translation using Weblate
+
+Francesco Bonazzi (2):
+ * [6d51fd8c] Add support for reading feeds aloud with Android's
+ TextToSpeech engine
+ * [770ce381] moved text-to-speech code to model-view class
+
+Hierax Swiftwing (1):
+ * [c1e336fe] Translated using Weblate (Serbian)
+
+J. Lavoie (1):
+ * [d491cd62] Updated Italian translation using Weblate
+
+Jonas Kalderstam (5):
+ * [65a1d9b4] Handle dynamic shortcuts for deleted feeds
+ * [dccdfa02] Cleaned up TextToSpeech slightly
+ * [187d22de] Removed unused imports
+ * [af708e46] Updated Swedish translation using Weblate
+ * [f67bb187] Added esperanto to list of languages unsupported by play
+ store
+
+Nikita Epifanov (1):
+ * [e2ffcab3] Updated Russian translation using Weblate
+
+Oğuz Ersen (1):
+ * [01d03869] Updated Turkish translation using Weblate
+
+gnu-ewm (2):
+ * [1bb598ce] Updated Polish translation using Weblate
+ * [94b80f52] Updated Polish translation using Weblate
+
+phlostically (1):
+ * [a3302d9f] Updated Esperanto translation using Weblate
+
+vachan-maker (1):
+ * [8260c442] Updated Malayalam translation using Weblate
+
+zmni (1):
+ * [ddf53f41] Updated Indonesian translation using Weblate
+
+# 1.11.3
+Eric (1):
+ * [b5a50dfb] Updated Chinese (Simplified) translation using Weblate
+
+Jonas Kalderstam (9):
+ * [aa9ebbd3] Maybe fixed a nullpointer error
+ * [6023a40c] Fixed sporadic error while loading images
+ * [56b7c946] Fixed reader going blank after opening webview and going back
+ * [da0d2a9f] Updated view models with correct nullability
+ * [078a486c] Fixed additional fragment view lifecycle issues
+
+Nikita Epifanov (1):
+ * [d09adafe] Updated Russian translation using Weblate
+
+# 1.11.2
+Eric (1):
+ * [b5a50dfb] Updated Chinese (Simplified) translation using Weblate
+
+Jonas Kalderstam (5):
+ * [130137d3] Fixed database test
+ * [aa9ebbd3] Maybe fixed a nullpointer error
+ * [6023a40c] Fixed sporadic error while loading images
+
+Nikita Epifanov (1):
+ * [d09adafe] Updated Russian translation using Weblate
+
+# 1.11.1
+Jonas Kalderstam (2):
+ * [130137d3] Fixed database test
+ * [aa9ebbd3] Maybe fixed a nullpointer error
+
+Nikita Epifanov (1):
+ * [d09adafe] Updated Russian translation using Weblate
+
+# 1.11.0
+Allan Nordhøy (2):
+ * [4e05cb55] Updated Norwegian Bokmål translation using Weblate
+
+Eduardo (1):
+ * [7d23f022] Updated Portuguese (Brazil) translation using Weblate
+
+El Pirujo (2):
+ * [4af3761e] Updated Spanish translation using Weblate
+
+J. Lavoie (2):
+ * [65079f61] Updated Italian translation using Weblate
+
+Jakub Fabijan (1):
+ * [d49aa9e6] Updated Esperanto translation using Weblate
+
+Jonas Kalderstam (7):
+ * [074e85ac] Fixed links not opening after screen rotation
+ * [2bd413a7] Fixed a leaking service connection
+ * [72b26b59] Updated Japanese translation using Weblate
+ * [13b0b601] Added full text parsing option using Readability4J
+ * [e6a632d9] Updated Swedish translation using Weblate
+
+Oğuz Ersen (2):
+ * [e420ef80] Updated Turkish translation using Weblate
+
+Reza Almanda (1):
+ * [90cd9031] Updated Indonesian translation using Weblate
+
+Tomáš Tihlařík (1):
+ * [ab41bf6e] Update Czech strings.xml
+
+WaldiS (1):
+ * [b6ffe8bf] Updated Polish translation using Weblate
+
+zmni (1):
+ * [5d763077] Updated Indonesian translation using Weblate
+
+Ícar N. S (1):
+ * [d36e6d67] Updated Catalan translation using Weblate
+
+# 1.10.14
+Jonas Kalderstam (2):
+ * [3777ebfd] Added error reporting when trying to add a feed fails
+
+Meiru (1):
+ * [ab59bc7a] Updated Japanese translation using Weblate
+
+kak mi (1):
+ * [0215e61c] Updated Chinese (Simplified) translation using Weblate
+
+vachan-maker (1):
+ * [1221c6f3] Updated Malayalam translation using Weblate
+
+# 1.10.13
+Eduardo Rodrigues (1):
+ * [7d01b89f] Translated using Weblate (Portuguese (Brazil))
+
+Jonas Kalderstam (3):
+ * [9f191f73] Implemented parallel load of images in Reader view
+
+Meiru (2):
+ * [a92e14d8] Updated Japanese translation using Weblate
+ * [607a0947] Translated using Weblate (Japanese)
+
+Reza Almanda (1):
+ * [253fdd6d] Translated using Weblate (Indonesian)
+
+daywalk3r666 (1):
+ * [017de69c] Translated using Weblate (German)
+
+vachan-maker (2):
+ * [c71b9210] Updated Malayalam translation using Weblate
+ * [9a5a8f2e] Updated Malayalam translation using Weblate
+
+zmni (1):
+ * [b59e249b] Update Indonesian translation
+
+Ícar N. S (1):
+ * [c67896b7] Updated Catalan translation using Weblate
+
+# 1.10.12
+Belmar Begić (1):
+ * [07443bf7] Updated Bosnian translation using Weblate
+
+Jakub Fabijan (1):
+ * [7b225d25] Updated Esperanto translation using Weblate
+
+Jonas Kalderstam (9):
+ * [365bd45c] Removed empty translations
+
+Reza Almanda (1):
+ * [b088b923] Updated Indonesian translation using Weblate
+
+# 1.10.11
+Allan Nordhøy (2):
+ * [c64b4a57] Updated Norwegian Bokmål translation using Weblate
+ * [853b7f0a] Translated using Weblate (Norwegian Bokmål)
+
+El Pirujo (1):
+ * [18a10d55] Translated using Weblate (Spanish)
+
+George (1):
+ * [f317a3ee] Translated using Weblate (Greek)
+
+J. Lavoie (1):
+ * [53b67002] Translated using Weblate (Italian)
+
+Jakub Fabijan (1):
+ * [a084f837] Added Esperanto translation using Weblate
+
+Jonas Kalderstam (15):
+ * [9e9c46f5] Replaced Crowdin widget with Weblate widget
+ * [f5739850] Added contribution notes in README
+ * [bc00fba3] Updated Russian translation using Weblate
+ * [80eca008] Updated Norwegian Bokmål translation using Weblate
+ * [fb557d58] Updated Malayalam translation using Weblate
+
+Nikita Epifanov (1):
+ * [eb3bbeff] Translated using Weblate (Russian)
+
+Oğuz Ersen (1):
+ * [eafe6fb8] Translated using Weblate (Turkish)
+
+Riku Viitanen (2):
+ * [78112ea3] Translated using Weblate (Finnish)
+ * [6ccbdaa3] Translated using Weblate (Finnish)
+
+WaldiS (1):
+ * [d3a99c11] Translated using Weblate (Polish)
+
+vachan-maker (1):
+ * [0abb9096] Updated Malayalam translation using Weblate
+
+Ícar N. S (1):
+ * [65b7bc99] Translated using Weblate (Catalan)
+
+# 1.10.10
+Space Cowboy (3):
+ * [b316df06] New translations from Crowdin
+
+# 1.10.9
+Jonas Kalderstam (3):
+ * [5ac2bc2c] Disabled minification due to crash on old Android
+ * [0add4d20] Added comments to some strings
+
+Space Cowboy (5):
+ * [7a715fa4] Updated translations from Crowdin
+
+# 1.10.8
+Jonas Kalderstam (2):
+ * [472dc314] Fixed reader going blank after opening a web view
+
+# 1.10.7
+Jonas Kalderstam (22):
+ * [27cd9114] Updated translations
+ * [5fa9116f] Enabled minification for play and release builds
+
+Muha Aliss (2):
+ * [45ac6e09] Turkish translation updated
+ * [387db7cd] Turkish translate checked and updated.
+
+mezysinc (4):
+ * [6dd67f76] description in ptbr
+ * [3de13944] full desc. ptbr
+ * [4044ee48] Delete .gitkeep
+ * [589ac044] updated strings ptbr
+
+# 1.10.6
+Jonas Kalderstam (5):
+ * [06f7fb81] Added a scrollbar to the Reader
+ * [05078389] Fixed atom feed html content being unescaped twice
+ * [e8c5470d] Fixed some additional html escaping cases
+
+# 1.10.5
+Armand Lynch (2):
+ * [08b6aa7f] Adds 'mark above as read' option
+ * [14c07701] Remove code duplication
+
+Enrico Lovisotto (1):
+ * [487a250c] Improved Italian translation and added missing items
+
+Jonas Kalderstam (5):
+ * [a622d655] Added minification to the app to make it faster to install
+ * [3ebd53c3] Fixed scroll position being reset in Reader
+
+Khar Khamal (1):
+ * [6663bdf2] Update Spanish strings.xml to add one new string and correct
+ other string
+
+# 1.10.4
+Jonas Kalderstam (1):
+ * [51ef23e6] App is now compiled against Android 11 (SDK-30, R)
+
+# 1.10.3
+Jonas Kalderstam (1):
+ * [4827e41c] Fixed crash when base64 encoded images were present in feeds
+
+# 1.10.2
+Fëdor T (1):
+ * [e9787dee] Updated Russian translation
+
+Muha Aliss (1):
+ * [2885b218] Turkish translations added
+
+# 1.10.1
+Jonas Kalderstam (2):
+ * [b9b3bd76] Reworded tooltip to reduce confusion
+ * [a4d8dd3b] Increased synchronization speed
+
+Khar Khamal (2):
+ * [756cb108] Update strings.xml for Spanish language
+ * [ffff95dd] Update strings.xml for Spanish language
+
+aevw (1):
+ * [1fd20db4] Updated Portuguese translation
+
+linsui (1):
+ * [19b64a13] Update Simplified Chinese translation
+
+# 1.10.0
+Jonas Kalderstam (5):
+ * [3a3d3689] Added preference for battery optimization
+ * [0d17d374] Fixed custom tab not showing as default option for opening
+ links
+ * [c8b57882] Added option to preload links in custom tab
+
+Khar Khamal (1):
+ * [0fdac915] Update Spanish strings.xml for Custom Tab
+
+Sudeep Duggal (1):
+ * [2c211b53] Feeder now opts out of sending usage metrics of WebView to
+ Google
+
+Tomáš Tihlařík (1):
+ * [1709c2fd] Update Czech strings.xml for Custom Tab & Battery options
+
+emersion (1):
+ * [e0a9d261] Added support for custom tabs
+
+linsui (1):
+ * [751f8665] Update Simplified Chinese translation
+
+zmni (2):
+ * [8be9508a] Update Indonesian translation
+ * [8bc4f4e6] Update Indonesian translation
+
+# 1.9.9
+Jonas Kalderstam (4):
+ * [b4827aaa] Fixed text formatting not updating with System night mode
+
+Khar Khamal (1):
+ * [37646e21] Fixed typo in Spanish translation
+
+Tomáš Tihlařík (1):
+ * [b2cb4a11] Updated Czech translation
+
+aevw (1):
+ * [a2ac9334] Added Portuguese (Brazil) translation
+
+# 1.9.8
+Jonas Kalderstam (2):
+ * [e3245b9c] Added 'mark as unread' to the webview menu
+
+Khar Khamal (1):
+ * [d8b09639] Updated Spanish translation
+
+Michael Hynes (1):
+ * [7d1e419b] Added an option to disable floating action button.
+
+Sam Clie (1):
+ * [bdedadd5] Fixed typo in Chinese translation
+
+# 1.9.7
+Tomáš Tihlařík (2):
+ * [251ffe8d] Updated Czech translation
+ * [8d92b9ac] Updated Czech translation
+
+linsui (1):
+ * [a7b65165] Updated Simplified Chinese Translation
+
+# 1.9.6
+Jonas Kalderstam (2):
+ * [47bc0a5c] Fixed possible crash in case you pressed two feed items at
+ once
+
+Khar Khamal (2):
+ * [8aa6649e] Updated Spanish translation
+ * [2b9180c3] Updated Spanish translation
+
+Ramzan Sheikh (5):
+ * [fd7570e7] Modified FeedItemsViewModel to use LiveData for sorting
+ preference
+ * [d130f0d0] Added reverse sort option to settings menu
+ * [cf70edfe] Added sorting option utilities to PrefUtils.kt
+ * [61128e4f] Modified FeedItemDao and FeedItemsViewModel to allow listing
+ feeds in reverse order
+ * [6f002883] Fixed current feed order not changing when sorting setting
+ changed
+
+linsui (1):
+ * [f9fdb071] Updated Simplified Chinese translation
+
+zmni (1):
+ * [4b67ce48] Updated Indonesian translation
+
+# 1.9.5
+Philipp Hutterer (1):
+ * [9222bf71] Bugfix: decode encoded credentials before request
+
+zmni (1):
+ * [60007125] Update Indonesian translation
+
+# 1.9.4
+Jonas Kalderstam (9):
+ * [6003e84c] Fixed monospacing of pre-tags
+ * [fd87f04b] Removed html formatting from titles
+ * [6f6ed5ca] Added share option for feeds
+ * [bfa1a293] Fixed parsing some feeds with bad server responses
+
+# 1.9.3
+Jonas Kalderstam (4):
+ * [614597d] Fixed sort order to be the minimum of syncing time and publish date
+ * [5596669] Updated share menu to use modern chooser
+ * [c59b2f5] Fixed items with no links showing "show in browser" buttons
+
+Tomáš Tihlařík (1):
+ * [ada5da8] Updated Czech translation
+
+# 1.9.2
+Jonas Kalderstam (2):
+ * [d7eeb89] Fixed incorrect titles shown in delete dialog
+
+Karol Kosek (1):
+ * [1d64c7f] Updated Polish translation
+
+Khar Khamal (1):
+ * [3a3df99] Updated Spanish translation
+
+Vadik Sirekanyan (1):
+ * [85fc6d1] Added option for hiding thumbnails
+
+# 1.9.1
+ * [72f6d12] Disabled R9 minification to avoid crash on Android Kitkat
+
+# 1.9.0
+Jonas Kalderstam (3):
+ * [ae1338e] Added additional accessibility strings
+ * [25e9602] Added dialog for deleting multiple feeds
+ * [da3089e] Changed sort order to include synchronization time
+
+Khar Khamal (1):
+ * [ff491f1] Updated Spanish translations
+
+# 1.8.30
+ * [49e7f76] Replaced day-night theme with manual control over themes
+ * [d54ccbc] Fixed scrollbar ghosting
+ * [3614f8a] Added another theme which follows system night mode
+ * [4022f62] Save navigation state and restore it
+ * [d72d7fa] Increased speed of app and implemented system-follow theme
+ * [7df3dc2] Removed conscrypt
+ * [e9a6dc3] Updated versions of libraries used
+
+# 1.8.29
+* Added a UserAgent to fix sites blocking requests
+ See !214 #248
+
+# 1.8.28
+
+* Fixed a crash when clicking on notification
+
+# 1.8.27
+
+Minor bug fixes and tweaks.
+
+# 1.8.26
+* Stores feed content primarily in files instead of database
+ See !209 #227
+* More feeds should now have thumbnails displayed
+ See !210 #231
+
+# 1.8.24
+* Fixed alignment issue in RTL layout
+ See !208 #224
+* Update Italian (it) translation
+ Thanks to Emanuele Petriglia
+ See !207
+
+# 1.8.23
+* List should once again remember where you were when you come back
+ See !206 #219
+* Spanish translation
+ Thanks to Khar Khamal
+ See !205
+
+# 1.8.22
+* Update Spanish translations
+ Thanks to Khar Khamal
+ See !203
+
+# 1.8.21
+* Long press items to open a context menu with various actions
+ See !202
+* List will now auto scroll to top when new items are downloaded if list is already at the top
+ See !202
+
+# 1.8.20
+* Changed 'Report bug' to open the Gitlab issues page instead of an email
+ See !201
+* Updated Czech translation
+ Thanks to Tomáš Tihlařík
+ See !200 !199
+
+# 1.8.19
+* Added czech translation
+ Thanks to Tomas
+ See !198
+* Added option to toggle Javascript in Webview
+ See !197
+
+# 1.8.18
+* Indonesian translation
+ Thanks to zmni
+ See !196
+* Fixed back button handling in web view
+ See !195
+
+# 1.8.17
+* Made feed title clickable in Reader
+ See !194 #205
+* Fixed crash when notification contained items to be marked as read
+ See !193 #204
+
+# 1.8.16
+* Fixed a null pointer crash if bare
tag was encountered
+ See !192
+
+# 1.8.15
+* Improved webview: cookie dialogs should no longer be off screen
+ See !190
+
+# 1.8.14
+* Fixed crash on tablets
+ See !189 #191
+* Fixed handling of URLs with only user (such as http://user@...)
+ See !188
+
+# 1.8.13
+* Fixed edit dialog starting with the wrong theme
+ See !187
+* Fixed spelling error in Spanish
+ See !185
+* Fixed webview resetting night mode
+ See !185 #172
+* Migrated to single activity; app should feel faster
+ See !185
+* Fixed thumbnails not showing in Engadget feed
+ See !183 #186
+
+# 1.8.12
+* Fixed webview being obscured by the action bar
+ See !182 #179 #173
+* Added Spanish translation
+ Thanks to Khar Khamal
+ See !180
+
+# 1.8.11
+
+Removed "mark as read when scrolling". It had a bug when toggling display of read items, and it was very "surprising" to some users.
+
+Will be back when bug free and off by default.
+
+# 1.8.10
+* Update Simplified Chinese Translation
+ Thanks to linsui
+ See !179
+* Added option to mark items as read as you scroll (defaults to true)
+
+# 1.8.9
+* Increased http timeouts to 30 seconds from 5 seconds
+ See !175
+* Changed so time of publication (and not just date) is shown in Article
+ See !174 #61
+
+# 1.8.8
+* Changed plaintext conversion to stop formatting as markdown
+ See !172
+* Fixed not being able to parse dates in certain feeds
+ See !170
+* Fixed so feeds without publication dates gets some when synced
+ See !169 #178
+
+# 1.8.7
+* Added support for RTL
+ Some devices might still not render perfectly though
+ See !165 #176
+* Fixed youtube previews not showing
+ See !168
+* Changed plaintext rendering to not include '[image alt text]' in text
+ See !167
+* Changed so that notification actions do not open the app after pressing Back
+ See !166
+
+# 1.8.6
+* Fixed notification "Open in"-actions not working
+ See !164
+
+# 1.8.5
+* Fixed parsing of feeds without unique guids or links (NixOS)
+ See !162
+* Changed so feed search finds alternate links in body of documents
+ See !162
+* Fixed feed results not showing error message on *second* search
+ See !162
+* Feeder can now be used to *open* links, not just accept *shared* ones
+ See !161 #174
+* Fixed notifications so that all actions will mark item as read also
+ See !160
+* Fixed app losing state if in reader and switching to another app and back again
+ See !159
+* Fixed action bar overlaying web view
+ See !157 #173
+* Fixed custom feed titles not being displayed
+ See !154 #168 #167
+* Updated Simplified Chinese Translation
+ Thanks to linsui
+ See !153
+* Fixed feeds with no link not working
+ See !150 #165
+* Fixed some parsing errors on feeds with slash-comments
+ See #166
+
+# 1.8.4
+* Fixed long blog title overlapping date
+ See !149 #164
+* Fixed crash when loading certain videos
+ See !148 #163
+* Fixed opening in browser from notification not marking as read or dismissing
+ See !146 #155
+
+# 1.8.3
+* Tweaked colors in themes
+ See !144 #159
+* Fixed crash when loading bad images
+* Fixed scrolling position getting reset during sync in Reader
+ See !142 #160
+* Fixed crash when loading bad images
+ See !140
+* Fixed theme-specific place holder image for articles
+ See !139
+
+# 1.8.2
+* Fixed crash when image could not be loaded on pre Lollipop
+ See !138 #156
+* Added menu item for sending a bug report via email
+ See !137
+
+# 1.8.1
+* Fixed crash when clearing notifications
+ See !136 #153
+* Update Simplified Chinese
+ Thanks to linsui
+ See !134
+* Fixed screenshots in README
+ Thanks to DJCrashdummy
+ See !135
+
+# 1.8.0
+* Removed option to sync on Hotspots
+ Fixed automatic synchronization never running on mobile data
+ Added option to sync when app is opened
+ Improved caching so less data traffic will be used during sync
+ Improved sync speed by only parsing feeds with new content
+ See !131
+* Improved error handling in Add Feed dialog
+ See !132
+* Simplified Chinese Translation
+ Thanks to linsui
+ See !128
+
+# 1.7.1
+* Fixed possible crash when marking all items as read
+ See !127 #145
+* Fixed text for show unread toggle
+ See !125
+
+# 1.7.0
+* Moved notification toggle to options menu
+ See !123 #125 #66
+* Added a light theme
+ See !122 #38
+* Fixed size of FAB icon on high density screens
+ See !119
+* Fixed crash for certain feeds with slash comment meta-data
+ See !117 #140
+* Added additional sync frequency options (15min and 30min)
+ Also removed the need for an account and related system permission
+ See #49
+* Added menu option in reader to mark item as unread
+ See !111 #134
+
+# 1.6.8
+* Fixed crash when supplying bad URL to add feed dialog
+ See !110 #137
+* Fix typo in German translation
+ Thanks to Swen Krüger
+ See !109
+
+# 1.6.7
+* Fixed crash on older Android versions when opening a web view
+ See !108
+* Fixed update of views when pressing 'mark all as read' button
+ See !107
+* Improved network caching
+ See !105
+* German translations updated and added
+ Thanks to Chris
+ See !106
+
+# 1.6.6
+
+- Fixed a crash in Reader
+
+# 1.6.5
+* Added support for username/password in URLs
+ See !100 #128
+* Fixed https compatibility on older versions of Android
+ See !102 #113
+* Fixed crash for HorribleSubs.info
+ See !103 #131
+
+# 1.6.4
+* Added paging to lists
+ See !99
+* Added option for maximum number of items per feed
+ See !98 #126
+
+# 1.6.3
+* Now all links are explicitly opened in new browser tabs
+ See !97 #117
+* Fixed buggy back stack
+ See !96
+
+# 1.6.2
+* Block cookies from webview
+ See !95
+
+# 1.6.1
+* Fixed parsing of some OPML formats
+ See !94 #111
+
+# 1.6.0
+* Added option of how to open articles.
+ One of Reader, WebView or Browser.
+ See !93 #39 #102
+* Fixed resolution of relative links
+ See !92 #101
+
+# 1.5.0
+* Fixed notifications
+ See !91 #10 #88
+* Changed to allow installation on internal storage
+ This has always been implied by the limitations of Android but now
+ it is explicit to avoid issues for people who try to move it to
+ external storage.
+ See !78 #79
+* Added special handling for finding Youtube feeds
+ See !90 #100
+* Fixed HTML encoded titles not being decoded in list
+ See !89 #91
+* Changed so more feeds display thumbnail images
+ See !88 #96
+* Fixed various crashes
+
+# 1.4.3
+* Fixed crash for missing video urls
+ See !84 #90
+* Improved UI responsiveness but throttling database loaders
+ See !81
+* Fixed existing tag not being shown in edit feed dialog
+ See !80 #82
+* Improved rendering of
tags
+ See !77
+* Added newline between table columns
+ See !77
+* Handle ENTER press in add feed dialog
+ See !77
+
+# 1.4.2
+* Stopped rendering script tags
+ See !75 #85
+
+# 1.4.1
+* Fixed some translation issues which could cause crashes
+ See !74
+* Added French translation
+ Thanks to Jef Roelandt
+ See !73
+* Added Polish translation
+ Thanks to Grzegorz Szymaszek
+ See !72
+
+# 1.4.0
+
+This version changes the database tables slighly which means your
+read-status will be gone. Apologies for the inconvenience.
+
+* Feeds are now sorted case-insensitively
+ See !71 #77
+* Feeds are now displayed using correct encoding
+ See !68 #76
+* Articles are parsed to find cover images
+ See !67
+* Relative links are now resolved
+ See !67
+* Adding feeds will now parse the page in case it's not a feed and try
+ to find alternate links to feeds. All results are displayed in the
+ dialog.
+ See !67
+* Maintain scroll position in articles when switching between apps
+ See !66 #71
+* Images with relative URLs are now displayed
+ See !66 #37 #54
+* Added app shortcuts for the latest 3 feeds
+ See !65 #60
+* Added option to sync once per day
+ See !64
+* New icons
+ See !63
+* Added support for JSONFeed
+ See !41
+
+# 1.3.15
+* Fixed an installation crash on Android 5
+ See !62 #69
+
+# 1.3.14
+* Fixed loss of scroll position on redraw in left drawer menu
+ See !61 #57
+
+# 1.3.13
+
+* Add new feed now finds feed links in web pages
+
+ Makes it possible to input a url to a site, such as
+ `cowboyprogrammer.org`, when adding a new feed.
+
+ Previously, the direct address to the RSS/Atom feed was required
+ (`cowboyprogrammer.org/atom.xml`). This was not ideal because
+
+ - not all sites advertise a link to their feeds
+
+ - the location of the feed is not standardized so it's not easily
+ guessable
+
+ - viewing the source of a web site to find the alternate link is
+ very hard to do on mobile
+
+ Now, the site you enter is parsed and if it contains alternate
+ links to feeds, one of those links are loaded parsed
+ instead. Currently RSS and Atom feeds are identified and Atom is
+ preferred over RSS.
+
+ See !60
+
+* Target Android 26
+ See !60
+
+# 1.3.12
+* Changed so that an empty feed can be dragged to be refreshed
+ See !57 #40
+
+# 1.3.11
+* Added Italian translation
+ Thanks to Marco
+ See !56
+
+# 1.3.10
+* Fixed crash when toggling 'Notify for new items' on All Feeds
+ See !55 #56
+
+# 1.3.9
+* Fixed visibility of notify icon on certain devices
+ See !53 #55
+
+# 1.3.8
+* Fixed crash on older versions of Android
+ See !51 #53
+
+# 1.3.7
+* Added a show all option in the sidebar
+ See !50 #50
+
+# 1.3.6
+* Fixed crash when importing/exporting OPML on Android18
+ See !49 #51
+* Updated russian translation
+ Thanks to Anton Shestakov
+ See !48
+
+# 1.3.5
+* Add tests for contributed OMPL files
+ See !47 #36
+* Move OMPL test to correct package
+ See !47
+* Handle case when cursor is null
+ See !47
+* Changed to 'Updated feeds' instead of 'New RSS-items'
+ See !46
+* Fixed OPML importing
+ See !46
+* Fixed OPML exporting
+ See !46
+* Improved performance of list by not loading full text of items
+ See !46 #48
+* Fixed crash if item had too much text
+ See !46 #48
+* Reduced size of some text to contain german translation
+ See !45 #46
+* New german translations courtesy of @dehnhard
+ See !45
+
+# 1.3.4
+* Removed translations of dummy strings
+ See !43 #44
+* Added russian translation
+ Thanks to Anton Shestakov
+ See !42
+* Fixed sorting of feeds to be alphabetical
+ See !38 #41
+
+# 1.3.3
+* Update feed items if they exist instead of effectively ignoring them
+ See !36 #33
+* Fallback to feed author if entry author is empty
+ See !36 #31
+* Update UI after each feed is synced instead of all at the end
+ See !36
+* Don't crash when column doesn't exist
+ See !35
+* Catch no such activity exceptions
+ See !34 #35
+* Don't print style tags in articles
+ See !33 #32
+* Don't print so many newlines in preview snippets
+ See !33
+* Don't render markdown links in plaintext snippets
+ See !32 #30
+
+# 1.3.2
+* Fix OPML export
+ See !27
+* Add missing permission for SDK23 and below
+ See !30 #28
+* Make read story title even more readable
+
+# 1.3.1
+* Make read story title even more readable
+ See !28
diff --git a/fqnews2/LICENSE b/fqnews2/LICENSE
new file mode 100644
index 000000000..9cecc1d46
--- /dev/null
+++ b/fqnews2/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ {one line to give the program's name and a brief idea of what it does.}
+ Copyright (C) {year} {name of author}
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ {project} Copyright (C) {year} {fullname}
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/fqnews2/README.md b/fqnews2/README.md
new file mode 100644
index 000000000..55ea16658
--- /dev/null
+++ b/fqnews2/README.md
@@ -0,0 +1,9 @@
+# 翻墙新闻(FQNews)安卓APP(新版)
+
+全新发布 FQNews APP,无需VPN,后台自动翻墙下载你想看的新闻。添加任何墙外新闻的RSS/FEED,无需VPN,FQNews APP会在后台自动翻墙下载新闻并缓存到本机,FQNews也内置了禁闻网的一些栏目。
+
+
+
+
+
+"""
+
+@Language("xml")
+const val rssWithHtmlEscapedDescription = """
+
+
+
+ Cowboy Programmer
+ https://cowboyprogrammer.org/
+ Recent content in Cowboy Programmer on Cowboy Programmer
+ en-us
+ Sun, 01 Sep 2019 23:21:00 +0200
+
+
+ description
+ http://cowboyprogrammer.org/4
+ Sun, 01 Sep 2019 23:21:00 +0200
+ jonas@cowboyprogrammer.org (Space Cowboy)
+ http://cowboyprogrammer.org/4
+ <img src="hello.jpg&cached=true">
+
+
+
+"""
+
+@Language("xml")
+const val atomWithUnknownProtocol = """
+
+
+gemini://gemini.circumlunar.space/news/
+Official Project Gemini news feed
+2023-03-01T18:34:36.714818+00:00
+
+Solderpunk
+solderpunk@posteo.net
+
+
+
+python-feedgen
+
+gemini://gemini.circumlunar.space/news/2022_01_16.gmi
+2022-01-16 - Mailing list downtime, official news feed
+2022-01-16T16:10:48.445244+00:00
+
+
+
+gemini://gemini.circumlunar.space/news/2022_01_22.gmi
+2022-01-22 - Mailing list archives, Atom feed for official news
+2022-01-22T18:44:56.495170+00:00
+
+
+
+gemini://gemini.circumlunar.space/news/2022_01_30.gmi
+2022-01-30 - Minor specification update (0.16.1)
+2022-01-30T14:38:04.738832+00:00
+
+
+
+gemini://gemini.circumlunar.space/news/2022_06_20.gmi
+2022-06-20 - Three years of Gemini!
+2022-06-20T17:48:06.479966+00:00
+
+
+
+gemini://gemini.circumlunar.space/news/2023_01_08.gmi
+2023-01-08 - Changing DNS server
+2023-01-08T14:12:22.568187+00:00
+
+
+
+gemini://gemini.circumlunar.space/news/2023_01_14.gmi
+2023-01-14 - Tidying up gemini.circumlunar.space user capsules
+2023-01-14T15:58:26.933828+00:00
+
+
+
+gemini://gemini.circumlunar.space/news/2023_02_14.gmi
+2023-02-14 - Empty user capsules removed
+2023-02-14T08:45:03.559039+00:00
+
+
+
+gemini://gemini.circumlunar.space/news/2023_03_01.gmi
+2023-03-01 - Molly Brown upgrade
+2023-03-01T18:34:36.714818+00:00
+
+
+
+"""
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/Feeds.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/Feeds.kt
new file mode 100644
index 000000000..15bf7c7c6
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/Feeds.kt
@@ -0,0 +1,131 @@
+package com.nononsenseapps.feeder.model
+
+import org.intellij.lang.annotations.Language
+import java.io.InputStream
+
+class Feeds {
+ companion object {
+ val nixosRss: InputStream
+ get() = Companion::class.java.getResourceAsStream("rss_nixos.xml")!!
+
+ val cowboyJson: String
+ get() =
+ String(
+ Companion::class.java.getResourceAsStream("cowboyprogrammer_feed.json")!!
+ .use { it.readBytes() },
+ )
+
+ val cowboyAtom: String
+ get() =
+ String(
+ Companion::class.java.getResourceAsStream("cowboyprogrammer_atom.xml")!!.use { it.readBytes() },
+ )
+
+ /**
+ * Reported in https://gitlab.com/spacecowboy/Feeder/-/issues/410
+ *
+ * All items are genuine - except the first which is taken from the feed at 2021-10-06T21:06:00
+ */
+ @Language("xml")
+ const val RSS_WITH_DUPLICATE_GUIDS = """
+
+
+Weather Warnings for Victoria. Issued by the Australian Bureau of Meteorology
+http://www.bom.gov.au/fwo/IDZ00059.warnings_vic.xml
+
+Current weather warnings for Victoria, Australia including strong wind, gale, storm force and hurricane force wind warnings; tsunami; damaging waves; abnormally high tides; tropical cyclones; severe thunderstorms; severe weather; fire weather; flood; frost; driving; bushwalking; sheep graziers and other agricultural warnings.
+en-au
+Copyright: (C) Copyright Commonwealth of Australia 2010, Bureau of Meteorology (ABN 92637 533532), see http://www.bom.gov.au/other/copyright.shtml for terms and conditions of reuse.
+webops@bom.gov.au (Help desk)
+Tue, 05 Oct 2021 11:02:55 GMT
+Tue, 05 Oct 2021 11:02:55 GMT
+Australian Bureau of Meteorology
+10
+
+http://www.bom.gov.au/images/bom_logo_inline.gif
+Weather Warnings for Victoria. Issued by the Australian Bureau of Meteorology
+http://www.bom.gov.au/fwo/IDZ00059.warnings_vic.xml
+
+
+08/10:22 EDT Minor Flood Warning for the Murray River
+http://www.bom.gov.au/nsw/warnings/flood/murrayriver.shtml
+Thu, 07 Oct 2021 23:22:07 GMT
+http://www.bom.gov.au/nsw/warnings/flood/murrayriver.shtml
+
+
+05/10:44 EDT Minor Flood Warning for the Murray River
+http://www.bom.gov.au/nsw/warnings/flood/murrayriver.shtml
+Mon, 04 Oct 2021 23:44:01 GMT
+http://www.bom.gov.au/nsw/warnings/flood/murrayriver.shtml
+
+
+05/22:00 EDT Marine Wind Warning Summary for Victoria
+http://www.bom.gov.au/vic/warnings/marinewind.shtml
+Tue, 05 Oct 2021 11:00:19 GMT
+http://www.bom.gov.au/vic/warnings/marinewind.shtml
+
+
+05/16:04 EDT Cancellation of Severe Weather Warning for East Gippsland, North East and West and South Gippsland Forecast Districts.
+http://www.bom.gov.au/products/IDV21037.shtml
+Tue, 05 Oct 2021 05:04:04 GMT
+http://www.bom.gov.au/products/IDV21037.shtml
+
+
+05/10:32 EDT Frost Warning for North Central, North East and Central forecast districts
+http://www.bom.gov.au/vic/warnings/frost.shtml
+Mon, 04 Oct 2021 23:32:38 GMT
+http://www.bom.gov.au/vic/warnings/frost.shtml
+
+
+05/15:32 EDT Cancellation of Warning to Sheep Graziers for Wimmera, North Central, North East, South West, Central and West and South Gippsland forecast districts
+http://www.bom.gov.au/vic/warnings/sheep.shtml
+Tue, 05 Oct 2021 04:32:44 GMT
+http://www.bom.gov.au/vic/warnings/sheep.shtml
+
+
+05/13:48 EDT Final Flood Watch for Barwon, Otway Coast, Greater Melbourne, South and West Gippsland and North East Victoria
+http://www.bom.gov.au/cgi-bin/wrap_fwo.pl?IDV35010.html
+Tue, 05 Oct 2021 02:48:06 GMT
+http://www.bom.gov.au/cgi-bin/wrap_fwo.pl?IDV35010.html
+
+
+05/17:11 EDT Flood Warning Summary for Victoria
+http://www.bom.gov.au/vic/warnings/flood/summary.shtml
+Tue, 05 Oct 2021 06:11:32 GMT
+http://www.bom.gov.au/vic/warnings/flood/summary.shtml
+
+
+05/11:16 EDT Minor Flood Warning for the Thomson River
+http://www.bom.gov.au/vic/warnings/flood/thomsonriver.shtml
+Tue, 05 Oct 2021 00:16:26 GMT
+http://www.bom.gov.au/vic/warnings/flood/thomsonriver.shtml
+
+
+05/10:13 EDT Minor Flood Warning for the Latrobe River
+http://www.bom.gov.au/vic/warnings/flood/latroberiver.shtml
+Mon, 04 Oct 2021 23:13:47 GMT
+http://www.bom.gov.au/vic/warnings/flood/latroberiver.shtml
+
+
+05/16:06 EDT Minor Flood Warning for the Yarra River
+http://www.bom.gov.au/vic/warnings/flood/yarrariver.shtml
+Tue, 05 Oct 2021 05:06:20 GMT
+http://www.bom.gov.au/vic/warnings/flood/yarrariver.shtml
+
+
+05/17:11 EDT Minor Flood Warning for the Bunyip River
+http://www.bom.gov.au/cgi-bin/wrap_fwo.pl?IDV36330.html
+Tue, 05 Oct 2021 06:11:14 GMT
+http://www.bom.gov.au/cgi-bin/wrap_fwo.pl?IDV36330.html
+
+
+05/12:37 EDT Minor Flood Warning for the Kiewa River
+http://www.bom.gov.au/vic/warnings/flood/kiewariver.shtml
+Tue, 05 Oct 2021 01:37:01 GMT
+http://www.bom.gov.au/vic/warnings/flood/kiewariver.shtml
+
+
+
+"""
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/FeedsToSyncTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/FeedsToSyncTest.kt
new file mode 100644
index 000000000..696766527
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/FeedsToSyncTest.kt
@@ -0,0 +1,158 @@
+package com.nononsenseapps.feeder.model
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider.getApplicationContext
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.nononsenseapps.feeder.archmodel.FeedStore
+import com.nononsenseapps.feeder.archmodel.Repository
+import com.nononsenseapps.feeder.db.room.AppDatabase
+import com.nononsenseapps.feeder.db.room.Feed
+import com.nononsenseapps.feeder.db.room.FeedDao
+import com.nononsenseapps.feeder.db.room.ID_UNSET
+import com.nononsenseapps.feeder.ui.TestDatabaseRule
+import com.nononsenseapps.feeder.util.minusMinutes
+import kotlinx.coroutines.runBlocking
+import org.junit.Assert.assertEquals
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.kodein.di.DIAware
+import org.kodein.di.android.closestDI
+import org.kodein.di.android.subDI
+import org.kodein.di.bind
+import org.kodein.di.instance
+import org.kodein.di.singleton
+import java.net.URL
+import java.time.Instant
+
+@RunWith(AndroidJUnit4::class)
+class FeedsToSyncTest : DIAware {
+ @get:Rule
+ val testDb = TestDatabaseRule(getApplicationContext())
+
+ override val di by subDI(closestDI(getApplicationContext() as Context)) {
+ bind(overrides = true) with instance(testDb.db)
+ bind(overrides = true) with singleton { testDb.db.feedDao() }
+ bind(overrides = true) with singleton { FeedStore(di) }
+ bind(overrides = true) with singleton { Repository(di) }
+ bind(overrides = true) with singleton { RssLocalSync(di) }
+ }
+
+ private val rssLocalSync: RssLocalSync by instance()
+
+ @Test
+ fun returnsStaleFeed() =
+ runBlocking {
+ // with stale feed
+ val feed = withFeed()
+
+ // when
+ val result = rssLocalSync.feedsToSync(feedId = feed.id, tag = "")
+
+ // then
+ assertEquals(listOf(feed), result)
+ }
+
+ @Test
+ fun doesNotReturnFreshFeed() =
+ runBlocking {
+ val now = Instant.now()
+ val feed = withFeed(lastSync = now.minusMinutes(1))
+
+ // when
+ val result =
+ rssLocalSync.feedsToSync(
+ feedId = feed.id,
+ tag = "",
+ staleTime = now.minusMinutes(2).toEpochMilli(),
+ )
+
+ // then
+ assertEquals(emptyList(), result)
+ }
+
+ @Test
+ fun returnsAllStaleFeeds() =
+ runBlocking {
+ val items =
+ listOf(
+ withFeed(url = URL("http://one")),
+ withFeed(url = URL("http://two")),
+ )
+
+ val result = rssLocalSync.feedsToSync(feedId = ID_UNSET, tag = "")
+
+ assertEquals(items, result)
+ }
+
+ @Test
+ fun doesNotReturnAllFreshFeeds() =
+ runBlocking {
+ val now = Instant.now()
+ val items =
+ listOf(
+ withFeed(url = URL("http://one"), lastSync = now.minusMinutes(1)),
+ withFeed(url = URL("http://two"), lastSync = now.minusMinutes(3)),
+ )
+
+ val result =
+ rssLocalSync.feedsToSync(
+ feedId = ID_UNSET,
+ tag = "",
+ staleTime = now.minusMinutes(2).toEpochMilli(),
+ )
+
+ assertEquals(listOf(items[1]), result)
+ }
+
+ @Test
+ fun returnsTaggedStaleFeeds() =
+ runBlocking {
+ val items =
+ listOf(
+ withFeed(url = URL("http://one"), tag = "tag"),
+ withFeed(url = URL("http://two"), tag = "tag"),
+ )
+
+ val result = rssLocalSync.feedsToSync(feedId = ID_UNSET, tag = "")
+
+ assertEquals(items, result)
+ }
+
+ @Test
+ fun doesNotReturnTaggedFreshFeeds() =
+ runBlocking {
+ val now = Instant.now()
+ val items =
+ listOf(
+ withFeed(url = URL("http://one"), lastSync = now.minusMinutes(1), tag = "tag"),
+ withFeed(url = URL("http://two"), lastSync = now.minusMinutes(3), tag = "tag"),
+ )
+
+ val result =
+ rssLocalSync.feedsToSync(
+ feedId = ID_UNSET,
+ tag = "tag",
+ staleTime = now.minusMinutes(2).toEpochMilli(),
+ )
+
+ assertEquals(listOf(items[1]), result)
+ }
+
+ private suspend fun withFeed(
+ lastSync: Instant = Instant.ofEpochMilli(0),
+ url: URL = URL("http://url"),
+ tag: String = "",
+ ): Feed {
+ val feed =
+ Feed(
+ lastSync = lastSync,
+ url = url,
+ tag = tag,
+ )
+
+ val id = testDb.db.feedDao().insertFeed(feed)
+
+ return feed.copy(id = id)
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/RssLocalSyncKtTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/RssLocalSyncKtTest.kt
new file mode 100644
index 000000000..1a44a418b
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/RssLocalSyncKtTest.kt
@@ -0,0 +1,689 @@
+package com.nononsenseapps.feeder.model
+
+import android.content.Context
+import android.content.SharedPreferences
+import androidx.test.core.app.ApplicationProvider.getApplicationContext
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.work.WorkManager
+import com.nononsenseapps.feeder.ApplicationCoroutineScope
+import jww.app.FeederApplication
+import com.nononsenseapps.feeder.archmodel.FeedItemStore
+import com.nononsenseapps.feeder.archmodel.FeedStore
+import com.nononsenseapps.feeder.archmodel.Repository
+import com.nononsenseapps.feeder.archmodel.SessionStore
+import com.nononsenseapps.feeder.archmodel.SettingsStore
+import com.nononsenseapps.feeder.archmodel.SyncRemoteStore
+import com.nononsenseapps.feeder.db.room.AppDatabase
+import com.nononsenseapps.feeder.db.room.BlocklistDao
+import com.nononsenseapps.feeder.db.room.Feed
+import com.nononsenseapps.feeder.db.room.FeedDao
+import com.nononsenseapps.feeder.db.room.FeedItemDao
+import com.nononsenseapps.feeder.db.room.ID_UNSET
+import com.nononsenseapps.feeder.db.room.ReadStatusSyncedDao
+import com.nononsenseapps.feeder.db.room.RemoteReadMarkDao
+import com.nononsenseapps.feeder.db.room.SyncRemoteDao
+import com.nononsenseapps.feeder.di.networkModule
+import com.nononsenseapps.feeder.model.Feeds.Companion.RSS_WITH_DUPLICATE_GUIDS
+import com.nononsenseapps.feeder.model.Feeds.Companion.cowboyAtom
+import com.nononsenseapps.feeder.model.Feeds.Companion.cowboyJson
+import com.nononsenseapps.feeder.model.Feeds.Companion.nixosRss
+import com.nononsenseapps.feeder.ui.TestDatabaseRule
+import com.nononsenseapps.feeder.util.DoNotUseInProd
+import com.nononsenseapps.feeder.util.FilePathProvider
+import com.nononsenseapps.feeder.util.filePathProvider
+import com.nononsenseapps.feeder.util.minusMinutes
+import com.nononsenseapps.jsonfeed.cachingHttpClient
+import kotlinx.coroutines.runBlocking
+import okhttp3.OkHttpClient
+import okhttp3.mockwebserver.Dispatcher
+import okhttp3.mockwebserver.MockResponse
+import okhttp3.mockwebserver.MockWebServer
+import okhttp3.mockwebserver.RecordedRequest
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.kodein.di.DI
+import org.kodein.di.DIAware
+import org.kodein.di.bind
+import org.kodein.di.instance
+import org.kodein.di.singleton
+import java.net.URL
+import java.time.Instant
+import java.util.concurrent.TimeUnit
+import kotlin.test.assertTrue
+
+@OptIn(DoNotUseInProd::class)
+@RunWith(AndroidJUnit4::class)
+@MediumTest
+class RssLocalSyncKtTest : DIAware {
+ @get:Rule
+ val testDb = TestDatabaseRule(getApplicationContext())
+
+ override val di by DI.lazy {
+ bind() with instance(testDb.db)
+ bind() with singleton { testDb.db.feedDao() }
+ bind() with singleton { testDb.db.feedItemDao() }
+ bind() with singleton { testDb.db.blocklistDao() }
+ bind() with singleton { testDb.db.remoteReadMarkDao() }
+ bind() with singleton { testDb.db.readStatusSyncedDao() }
+ bind() with singleton { testDb.db.syncRemoteDao() }
+ bind() with singleton { FeedStore(di) }
+ bind() with singleton { FeedItemStore(di) }
+ bind() with
+ singleton {
+ SettingsStore(di).also {
+ it.setAddedFeederNews(true)
+ }
+ }
+ bind() with singleton { SessionStore() }
+ bind() with singleton { SyncRemoteStore(di) }
+ bind() with singleton { cachingHttpClient() }
+ import(networkModule)
+ bind() with singleton { WorkManager.getInstance(getApplicationContext()) }
+ bind() with singleton { getApplicationContext().getSharedPreferences("test", Context.MODE_PRIVATE) }
+ bind() with singleton { ApplicationCoroutineScope() }
+ bind() with singleton { Repository(di) }
+ bind() with
+ singleton {
+ filePathProvider(
+ cacheDir = getApplicationContext().cacheDir,
+ filesDir = getApplicationContext().filesDir,
+ )
+ }
+ }
+
+ private val server = MockWebServer()
+
+ val responses = mutableMapOf()
+
+ private val rssLocalSync: RssLocalSync by instance()
+
+ @After
+ fun stopServer() {
+ server.shutdown()
+ }
+
+ @Before
+ fun setup() {
+ server.start()
+ }
+
+ private suspend fun insertFeed(
+ title: String,
+ url: URL,
+ raw: String,
+ isJson: Boolean = true,
+ useAlternateId: Boolean = false,
+ skipDuplicates: Boolean = false,
+ ): Long {
+ val id =
+ testDb.db.feedDao().insertFeed(
+ Feed(
+ title = title,
+ url = url,
+ tag = "",
+ alternateId = useAlternateId,
+ skipDuplicates = skipDuplicates,
+ ),
+ )
+
+ server.dispatcher =
+ object : Dispatcher() {
+ override fun dispatch(request: RecordedRequest): MockResponse {
+ return responses.getOrDefault(
+ request.requestUrl?.toUrl(),
+ MockResponse().setResponseCode(404),
+ )
+ }
+ }
+
+ responses[url] =
+ MockResponse().apply {
+ setResponseCode(200)
+ if (isJson) {
+ setHeader("Content-Type", "application/json")
+ } else {
+ setHeader("Content-Type", "application/xml")
+ }
+ setBody(raw)
+ }
+
+ return id
+ }
+
+ @Test
+ fun syncCowboyJsonWorks() =
+ runBlocking {
+ val cowboyJsonId =
+ insertFeed(
+ "cowboyjson",
+ server.url("/feed.json").toUrl(),
+ cowboyJson,
+ )
+
+ runBlocking {
+ assertTrue("Should have synced OK") {
+ rssLocalSync.syncFeeds(
+ feedId = cowboyJsonId,
+ )
+ }
+ }
+
+ assertEquals(
+ "Unexpected number of items in feed",
+ 10,
+ testDb.db.feedItemDao().loadFeedItemsInFeedDesc(cowboyJsonId).size,
+ )
+ }
+
+ @Test
+ fun syncCowboyAtomWorks() =
+ runBlocking {
+ val cowboyAtomId =
+ insertFeed(
+ "cowboyatom",
+ server.url("/atom.xml").toUrl(),
+ cowboyAtom,
+ isJson = false,
+ )
+
+ runBlocking {
+ rssLocalSync.syncFeeds(
+ feedId = cowboyAtomId,
+ )
+ }
+
+ assertEquals(
+ "Unexpected number of items in feed",
+ 15,
+ testDb.db.feedItemDao().loadFeedItemsInFeedDesc(cowboyAtomId).size,
+ )
+ }
+
+ @Test
+ fun alternateIdMitigatesRssFeedsWithNonUniqueGuids() =
+ runBlocking {
+ val duplicateIdRss =
+ insertFeed(
+ "aussieWeather",
+ server.url("/IDZ00059.warnings_vic.xml").toUrl(),
+ RSS_WITH_DUPLICATE_GUIDS,
+ isJson = false,
+ useAlternateId = true,
+ )
+
+ runBlocking {
+ rssLocalSync.syncFeeds(
+ feedId = duplicateIdRss,
+ )
+ }
+
+ assertEquals(
+ "Expected duplicate guids to be mitigated by alternate id",
+ 13,
+ testDb.db.feedItemDao().loadFeedItemsInFeedDesc(duplicateIdRss).size,
+ )
+ }
+
+ @Test
+ fun syncAllWorks() =
+ runBlocking {
+ val cowboyJsonId =
+ insertFeed(
+ "cowboyjson",
+ server.url("/feed.json").toUrl(),
+ cowboyJson,
+ )
+ val cowboyAtomId =
+ insertFeed(
+ "cowboyatom",
+ server.url("/atom.xml").toUrl(),
+ cowboyAtom,
+ isJson = false,
+ )
+
+ runBlocking {
+ rssLocalSync.syncFeeds(
+ feedId = ID_UNSET,
+ )
+ }
+
+ assertEquals(
+ "Unexpected number of items in feed",
+ 10,
+ testDb.db.feedItemDao().loadFeedItemsInFeedDesc(cowboyJsonId).size,
+ )
+
+ assertEquals(
+ "Unexpected number of items in feed",
+ 15,
+ testDb.db.feedItemDao().loadFeedItemsInFeedDesc(cowboyAtomId).size,
+ )
+ }
+
+ @Test
+ fun responsesAreNotParsedUnlessFeedHashHasChanged() =
+ runBlocking {
+ val cowboyJsonId =
+ insertFeed(
+ "cowboyjson",
+ server.url("/feed.json").toUrl(),
+ cowboyJson,
+ )
+
+ runBlocking {
+ rssLocalSync.syncFeeds(feedId = cowboyJsonId, forceNetwork = true)
+ testDb.db.feedDao().getFeed(cowboyJsonId)!!.let { feed ->
+ assertTrue("Feed should have been synced", feed.lastSync.toEpochMilli() > 0)
+// assertTrue("Feed should have a valid response hash", feed.responseHash > 0)
+ // "Long time" ago, but not unset
+ testDb.db.feedDao().updateFeed(feed.copy(lastSync = Instant.ofEpochMilli(999L)))
+ }
+ rssLocalSync.syncFeeds(feedId = cowboyJsonId, forceNetwork = true)
+ }
+
+ assertEquals("Feed should have been fetched twice", 2, server.requestCount)
+
+ assertNotEquals(
+ "Cached response should still have updated feed last sync",
+ 999L,
+ testDb.db.feedDao().getFeed(cowboyJsonId)!!.lastSync.toEpochMilli(),
+ )
+ }
+
+ @Test
+ fun feedsSyncedWithin15MinAreIgnored() =
+ runBlocking {
+ val cowboyJsonId =
+ insertFeed(
+ "cowboyjson",
+ server.url("/feed.json").toUrl(),
+ cowboyJson,
+ )
+
+ val fourteenMinsAgo = Instant.now().minusMinutes(14)
+ runBlocking {
+ rssLocalSync.syncFeeds(feedId = cowboyJsonId, forceNetwork = true)
+ testDb.db.feedDao().getFeed(cowboyJsonId)!!.let { feed ->
+ assertTrue("Feed should have been synced", feed.lastSync.toEpochMilli() > 0)
+// assertTrue("Feed should have a valid response hash", feed.responseHash > 0)
+
+ testDb.db.feedDao().updateFeed(feed.copy(lastSync = fourteenMinsAgo))
+ }
+ rssLocalSync.syncFeeds(
+ feedId = cowboyJsonId,
+ forceNetwork = false,
+ minFeedAgeMinutes = 15,
+ )
+ }
+
+ assertEquals(
+ "Recently synced feed should not get a second network request",
+ 1,
+ server.requestCount,
+ )
+
+ assertEquals(
+ "Last sync should not have changed",
+ fourteenMinsAgo,
+ testDb.db.feedDao().getFeed(cowboyJsonId)!!.lastSync,
+ )
+ }
+
+ @Test
+ fun feedsGetRetryAfterSetAndWillNotSyncLater() =
+ runBlocking {
+ val cowboyJsonId =
+ testDb.db.feedDao().insertFeed(
+ Feed(
+ title = "feed1",
+ url = server.url("/feed.json").toUrl(),
+ tag = "",
+ ),
+ )
+
+ val someOtherFeedId =
+ testDb.db.feedDao().insertFeed(
+ Feed(
+ title = "feed2",
+ url = server.url("/feed2.json").toUrl(),
+ tag = "",
+ ),
+ )
+
+ val response =
+ MockResponse().also {
+ it.setResponseCode(429)
+ it.setHeader("Retry-After", "30")
+ }
+ server.enqueue(response)
+
+ rssLocalSync.syncFeeds(feedId = cowboyJsonId)
+ assertEquals("Request should have been sent ", 1, server.requestCount)
+
+ // Get the feed and check value
+ val feed = testDb.db.feedDao().getFeed(cowboyJsonId)!!
+ assertTrue("Feed should have a retry after value in the future") {
+ feed.retryAfter > Instant.now()
+ }
+
+ val feed2 = testDb.db.feedDao().getFeed(someOtherFeedId)!!
+ assertTrue("Feed should have a retry after value in the future") {
+ feed2.retryAfter > Instant.now()
+ }
+
+ rssLocalSync.syncFeeds(feedId = cowboyJsonId)
+ assertEquals("Request should not have been sent due to retry-after", 1, server.requestCount)
+
+ rssLocalSync.syncFeeds(feedId = someOtherFeedId)
+ assertEquals("Request should not have been sent due to retry-after", 1, server.requestCount)
+ }
+
+ @Test
+ fun feedsSyncedWithin15MinAreNotIgnoredWhenForcingNetwork() =
+ runBlocking {
+ val cowboyJsonId =
+ insertFeed(
+ "cowboyjson",
+ server.url("/feed.json").toUrl(),
+ cowboyJson,
+ )
+
+ val fourteenMinsAgo = Instant.now().minusMinutes(14)
+ runBlocking {
+ rssLocalSync.syncFeeds(feedId = cowboyJsonId, forceNetwork = true)
+ testDb.db.feedDao().getFeed(cowboyJsonId)!!.let { feed ->
+ assertTrue("Feed should have been synced", feed.lastSync.toEpochMilli() > 0)
+// assertTrue("Feed should have a valid response hash", feed.responseHash > 0)
+
+ testDb.db.feedDao().updateFeed(feed.copy(lastSync = fourteenMinsAgo))
+ }
+ rssLocalSync.syncFeeds(
+ feedId = cowboyJsonId,
+ forceNetwork = true,
+ minFeedAgeMinutes = 15,
+ )
+ }
+
+ assertEquals("Request should have been sent due to forced network", 2, server.requestCount)
+
+ assertNotEquals(
+ "Last sync should have changed",
+ fourteenMinsAgo,
+ testDb.db.feedDao().getFeed(cowboyJsonId)!!.lastSync,
+ )
+ }
+
+ @Test
+ fun feedShouldNotBeUpdatedIfRequestFails() =
+ runBlocking {
+ val response =
+ MockResponse().also {
+ it.setResponseCode(500)
+ }
+ server.enqueue(response)
+
+ val url = server.url("/feed.json")
+
+ val failingJsonId =
+ testDb.db.feedDao().insertFeed(
+ Feed(
+ title = "failJson",
+ url = URL("$url"),
+ tag = "",
+ ),
+ )
+
+ runBlocking {
+ rssLocalSync.syncFeeds(feedId = failingJsonId)
+ }
+
+ assertNotEquals(
+ "Last sync should have been updated",
+ Instant.EPOCH,
+ testDb.db.feedDao().getFeed(failingJsonId)!!.lastSync,
+ )
+
+ // Assert the feed was retrieved
+ assertEquals("/feed.json", server.takeRequest().path)
+ }
+
+ @Test
+ fun feedWithNoUniqueLinksGetsSomeGeneratedGUIDsFromTitles() =
+ runBlocking {
+ val response =
+ MockResponse().also {
+ it.setResponseCode(200)
+ it.setBody(String(nixosRss.readBytes()))
+ it.setHeader("Content-Type", "application/xml")
+ }
+ server.enqueue(response)
+
+ val url = server.url("/news-rss.xml")
+
+ val feedId =
+ testDb.db.feedDao().insertFeed(
+ Feed(
+ title = "NixOS",
+ url = URL("$url"),
+ tag = "",
+ ),
+ )
+
+ runBlocking {
+ rssLocalSync.syncFeeds(
+ feedId = feedId,
+ )
+ }
+
+ // Assert the feed was retrieved
+ assertEquals("/news-rss.xml", server.takeRequest().path)
+ val items = testDb.db.feedItemDao().loadFeedItemsInFeedDesc(feedId)
+ assertEquals(
+ "Unique IDs should have been generated for items",
+ 99,
+ items.size,
+ )
+
+ // Should be unique to item so that it stays the same after updates
+ assertTrue {
+ items.first().guid.startsWith("https://nixos.org/news.html|")
+ }
+ }
+
+ @Test
+ fun feedWithNoDatesShouldGetSomeGenerated() =
+ runBlocking {
+ val response =
+ MockResponse().also {
+ it.setResponseCode(200)
+ it.setBody(fooRss(2))
+ it.setHeader("Content-Type", "application/xml")
+ }
+ server.enqueue(response)
+
+ val url = server.url("/rss")
+
+ val feedId =
+ testDb.db.feedDao().insertFeed(
+ Feed(
+ url = URL("$url"),
+ ),
+ )
+
+ val beforeSyncTime = Instant.now()
+
+ runBlocking {
+ rssLocalSync.syncFeeds(feedId = feedId)
+ }
+
+ // Assert the feed was retrieved
+ assertEquals("/rss", server.takeRequest().path)
+
+ val items = testDb.db.feedItemDao().loadFeedItemsInFeedDesc(feedId)
+
+ assertNotNull(
+ "Item should have gotten a pubDate generated",
+ items[0].pubDate,
+ )
+
+ assertNotEquals(
+ "Items should have distinct pubDates",
+ items[0].pubDate,
+ items[1].pubDate,
+ )
+
+ assertTrue(
+ "The pubDate should be after 'before sync time'",
+ items[0].pubDate!!.toInstant() > beforeSyncTime,
+ )
+
+ // Compare ID to compare insertion order (and thus pubdate compared to raw feed)
+ assertTrue("The pubDates' magnitude should match descending iteration order") {
+ items[0].guid == "https://foo.bar/1" &&
+ items[1].guid == "https://foo.bar/2" &&
+ items[0].pubDate!! > items[1].pubDate!!
+ }
+ }
+
+ @Test
+ fun feedShouldNotBeCleanedToHaveLessItemsThanActualFeed() =
+ runBlocking {
+ val feedItemCount = 9
+ server.enqueue(
+ MockResponse().also {
+ it.setResponseCode(200)
+ it.setBody(fooRss(feedItemCount))
+ it.setHeader("Content-Type", "application/xml")
+ },
+ )
+
+ val url = server.url("/rss")
+
+ val feedId =
+ testDb.db.feedDao().insertFeed(
+ Feed(
+ url = URL("$url"),
+ ),
+ )
+
+ val maxFeedItemCount = 5
+
+ // Sync first time
+ runBlocking {
+ rssLocalSync.syncFeeds(
+ feedId = feedId,
+ maxFeedItemCount = maxFeedItemCount,
+ )
+ }
+
+ // Assert the feed was retrieved
+ assertEquals("/rss", server.takeRequest(100, TimeUnit.MILLISECONDS)!!.path)
+
+ testDb.db.feedItemDao().loadFeedItemsInFeedDesc(feedId).let { items ->
+ assertEquals(
+ "Feed should have no less items than in the raw feed even if that's more than cleanup count",
+ feedItemCount,
+ items.size,
+ )
+ }
+ }
+
+ @Test
+ @Ignore("This test is slow, would be nice to rewrite with a delay...")
+ fun slowResponseShouldBeOk() =
+ runBlocking {
+ val url = server.url("/atom.xml").toUrl()
+ val cowboyAtomId = insertFeed("cowboy", url, cowboyAtom, isJson = false)
+ responses[url]!!.throttleBody(1024 * 100, 29, TimeUnit.SECONDS)
+
+ runBlocking {
+ rssLocalSync.syncFeeds(feedId = cowboyAtomId)
+ }
+
+ assertEquals(
+ "Feed should have been parsed from slow response",
+ 15,
+ testDb.db.feedItemDao().loadFeedItemsInFeedDesc(cowboyAtomId).size,
+ )
+ }
+
+ @Test
+ @Ignore("This test is slow, would be nice to rewrite with a delay...")
+ fun verySlowResponseShouldBeCancelled() =
+ runBlocking {
+ val url = server.url("/atom.xml").toUrl()
+ val cowboyAtomId = insertFeed("cowboy", url, cowboyAtom, isJson = false)
+ responses[url]!!.throttleBody(1024 * 100, 31, TimeUnit.SECONDS)
+
+ rssLocalSync.syncFeeds(feedId = cowboyAtomId)
+
+ assertEquals(
+ "Feed should not have been parsed from extremely slow response",
+ 0,
+ testDb.db.feedItemDao().loadFeedItemsInFeedDesc(cowboyAtomId).size,
+ )
+ }
+
+ @Test
+ fun duplicateItemsAreNotSaved(): Unit =
+ runBlocking {
+ val atomUrl = server.url("/atom.xml").toUrl()
+ val cowboyAtomId = insertFeed("cowboyAtom", atomUrl, cowboyAtom, isJson = false, skipDuplicates = true)
+
+ runBlocking {
+ rssLocalSync.syncFeeds(feedId = cowboyAtomId)
+ }
+
+ assertEquals(
+ "All items from first feed should be present",
+ 15,
+ testDb.db.feedItemDao().loadFeedItemsInFeedDesc(cowboyAtomId).size,
+ )
+
+ val jsonUrl = server.url("/feed.json").toUrl()
+ val cowboyJsonId = insertFeed("cowboyJson", jsonUrl, cowboyJson, isJson = true, skipDuplicates = true)
+
+ runBlocking {
+ rssLocalSync.syncFeeds(feedId = cowboyJsonId)
+ }
+
+ assertEquals(
+ "All items should have been filtered out due to duplicate checking",
+ 0,
+ testDb.db.feedItemDao().loadFeedItemsInFeedDesc(cowboyJsonId).size,
+ )
+ }
+
+ private fun fooRss(itemsCount: Int = 1): String {
+ val items =
+ (1..itemsCount).joinToString("\n") {
+ """
+
+ Foo Item $it
+ https://foo.bar/$it
+ Woop woop $it
+
+ """.trimIndent()
+ }
+
+ return """
+
+
+
+ Foo Feed
+ https://foo.bar
+ $items
+
+
+ """.trimIndent()
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/RssNotificationsKtTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/RssNotificationsKtTest.kt
new file mode 100644
index 000000000..e8a6f8fcc
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/RssNotificationsKtTest.kt
@@ -0,0 +1,81 @@
+package com.nononsenseapps.feeder.model
+
+import android.content.Intent
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
+import com.nononsenseapps.feeder.db.COL_LINK
+import com.nononsenseapps.feeder.db.room.FeedItem
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertEquals
+import kotlin.test.assertFalse
+import kotlin.test.assertNull
+
+@RunWith(AndroidJUnit4::class)
+class RssNotificationsKtTest {
+ @Test
+ fun openInBrowserIntentPointsToActivityWithIdAndLink() {
+ val intent: Intent = getOpenInDefaultActivityIntent(getInstrumentation().context, 99, "http://foo")
+
+ assertEquals(
+ "com.nononsenseapps.feeder.ui.OpenLinkInDefaultActivity",
+ intent.component?.className,
+ )
+ assertEquals("99", intent.data?.lastPathSegment)
+ assertEquals("http://foo", intent.data?.getQueryParameter(COL_LINK))
+ }
+
+ @Test
+ fun openInDefaultActivityIntentsAreConsideredDifferentForSameItem() {
+ val feedItem =
+ FeedItem(
+ id = 5,
+ link = "http://foo",
+ enclosureLink = "ftp://bar",
+ )
+
+ val linkIntent = getOpenInDefaultActivityIntent(getInstrumentation().context, feedItem.id, link = feedItem.link)
+ val enclosureIntent = getOpenInDefaultActivityIntent(getInstrumentation().context, feedItem.id, link = feedItem.enclosureLink)
+ val markAsReadIntent = getOpenInDefaultActivityIntent(getInstrumentation().context, feedItem.id, link = null)
+
+ assertFalse(
+ linkIntent.filterEquals(enclosureIntent),
+ message = "linkIntent should not be considered equal to enclosureIntent",
+ )
+
+ assertFalse(
+ linkIntent.filterEquals(markAsReadIntent),
+ message = "linkIntent should not be considered equal to markAsReadIntent",
+ )
+
+ assertFalse(
+ enclosureIntent.filterEquals(markAsReadIntent),
+ message = "enclosureIntent should not be considered equal to markAsReadIntent",
+ )
+ }
+
+ @Test
+ fun queryParameterDoesntGetGarbled() {
+ @Suppress("ktlint:standard:max-line-length")
+ val magnetLink = "magnet:?xt=urn:btih:82B1726F2D1B22F383A2B2CD6977B00F908FB315&dn=Crazy+Ex+Girlfriend+S04E10+720p+HDTV+x264+LucidTV&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=http%3A%2F%2Ftracker.trackerfix.com%3A80%2Fannounce"
+
+ val enclosureIntent = getOpenInDefaultActivityIntent(getInstrumentation().context, 5, link = magnetLink)
+
+ assertEquals(
+ magnetLink,
+ enclosureIntent.data?.getQueryParameter(COL_LINK),
+ message = "Expected link to not get garbled as query parameter",
+ )
+ }
+
+ @Test
+ fun nullLinkIsNullQueryParam() {
+ val enclosureIntent = getOpenInDefaultActivityIntent(getInstrumentation().context, 5, link = null)
+
+ assertNull(
+ enclosureIntent.data?.getQueryParameter(COL_LINK),
+ message = "Expected a null query parameter",
+ )
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/export/ExportSavedTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/export/ExportSavedTest.kt
new file mode 100644
index 000000000..33ce2ebe5
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/export/ExportSavedTest.kt
@@ -0,0 +1,137 @@
+package com.nononsenseapps.feeder.model.export
+
+import android.content.ContentResolver
+import android.content.Context
+import android.content.SharedPreferences
+import androidx.core.net.toUri
+import androidx.preference.PreferenceManager
+import androidx.room.Room
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.work.WorkManager
+import com.nononsenseapps.feeder.archmodel.FeedStore
+import com.nononsenseapps.feeder.archmodel.SettingsStore
+import com.nononsenseapps.feeder.db.room.AppDatabase
+import com.nononsenseapps.feeder.db.room.BlocklistDao
+import com.nononsenseapps.feeder.db.room.Feed
+import com.nononsenseapps.feeder.db.room.FeedDao
+import com.nononsenseapps.feeder.db.room.FeedItem
+import com.nononsenseapps.feeder.db.room.FeedItemDao
+import com.nononsenseapps.feeder.model.OPMLParserHandler
+import com.nononsenseapps.feeder.model.opml.OPMLImporter
+import com.nononsenseapps.feeder.util.ToastMaker
+import kotlinx.coroutines.runBlocking
+import org.junit.After
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.kodein.di.DI
+import org.kodein.di.DIAware
+import org.kodein.di.bind
+import org.kodein.di.instance
+import org.kodein.di.singleton
+import java.io.File
+import java.net.URL
+import java.time.Instant
+import java.time.ZoneOffset
+import java.time.ZonedDateTime
+import kotlin.random.Random
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+
+@RunWith(AndroidJUnit4::class)
+class ExportSavedTest : DIAware {
+ private val context: Context = ApplicationProvider.getApplicationContext()
+ lateinit var db: AppDatabase
+ override val di =
+ DI.lazy {
+ bind() with
+ singleton {
+ PreferenceManager.getDefaultSharedPreferences(
+ this@ExportSavedTest.context,
+ )
+ }
+ bind() with instance(db)
+ bind() with singleton { db.feedDao() }
+ bind() with singleton { db.feedItemDao() }
+ bind() with singleton { db.blocklistDao() }
+ bind() with singleton { SettingsStore(di) }
+ bind() with singleton { FeedStore(di) }
+ bind() with singleton { OPMLImporter(di) }
+ bind() with singleton { WorkManager.getInstance(this@ExportSavedTest.context) }
+ bind() with
+ instance(
+ object : ToastMaker {
+ override suspend fun makeToast(text: String) {}
+
+ override suspend fun makeToast(resId: Int) {}
+ },
+ )
+ bind() with singleton { this@ExportSavedTest.context.contentResolver }
+ }
+
+ private var dir: File? = null
+ private var path: File? = null
+
+ @Before
+ fun setup() {
+ // Get internal data dir
+ dir = context.externalCacheDir!!.resolve("${Random.nextInt()}").also { it.mkdir() }
+ path = context.externalCacheDir!!.resolve("${Random.nextInt()}").also { it.createNewFile() }
+ Assert.assertTrue("Need to be able to write to data dir $dir", dir!!.canWrite())
+
+ db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java).build()
+ }
+
+ @After
+ fun tearDown() {
+ // Remove everything in database
+ }
+
+ @SmallTest
+ @Test
+ fun testExportSavedArticles() {
+ runBlocking {
+ val itemId = insertTestData()
+
+ db.feedItemDao().setBookmarked(itemId, true)
+
+ assertTrue {
+ exportSavedArticles(
+ di,
+ path!!.toUri(),
+ ).isRight()
+ }
+
+ val result = path!!.readLines()
+
+ assertEquals(1, result.size)
+ assertEquals("https://example.com/ampersands/1", result.first())
+ }
+ }
+
+ private suspend fun insertTestData(): Long {
+ val feedId =
+ db.feedDao().insertFeed(
+ Feed(
+ title = "Ampersands are & the worst",
+ url = URL("https://example.com/ampersands"),
+ ),
+ )
+
+ return db.feedItemDao().insertFeedItem(
+ FeedItem(
+ guid = "guid anime2you",
+ plainTitle = "Item with image",
+ plainSnippet = "Snippet with image",
+ feedId = feedId,
+ link = "https://example.com/ampersands/1",
+ pubDate = ZonedDateTime.now(ZoneOffset.UTC),
+ primarySortTime = Instant.now(),
+ thumbnailImage = null,
+ ),
+ )
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/opml/OPMLTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/opml/OPMLTest.kt
new file mode 100644
index 000000000..b56e2294f
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/model/opml/OPMLTest.kt
@@ -0,0 +1,832 @@
+package com.nononsenseapps.feeder.model.opml
+
+import android.content.ContentResolver
+import android.content.Context
+import android.content.SharedPreferences
+import androidx.core.net.toUri
+import androidx.preference.PreferenceManager
+import androidx.room.Room
+import androidx.test.core.app.ApplicationProvider.getApplicationContext
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SmallTest
+import androidx.work.WorkManager
+import com.nononsenseapps.feeder.archmodel.FeedStore
+import com.nononsenseapps.feeder.archmodel.PREF_VAL_OPEN_WITH_CUSTOM_TAB
+import com.nononsenseapps.feeder.archmodel.SettingsStore
+import com.nononsenseapps.feeder.archmodel.UserSettings
+import com.nononsenseapps.feeder.db.room.AppDatabase
+import com.nononsenseapps.feeder.db.room.BlocklistDao
+import com.nononsenseapps.feeder.db.room.Feed
+import com.nononsenseapps.feeder.db.room.FeedDao
+import com.nononsenseapps.feeder.db.room.OPEN_ARTICLE_WITH_APPLICATION_DEFAULT
+import com.nononsenseapps.feeder.model.OPMLParserHandler
+import com.nononsenseapps.feeder.util.Either
+import com.nononsenseapps.feeder.util.ToastMaker
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.runBlocking
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Assert.fail
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.kodein.di.DI
+import org.kodein.di.DIAware
+import org.kodein.di.bind
+import org.kodein.di.instance
+import org.kodein.di.singleton
+import java.io.File
+import java.io.IOException
+import java.net.URL
+import kotlin.random.Random
+
+@RunWith(AndroidJUnit4::class)
+class OPMLTest : DIAware {
+ private val context: Context = getApplicationContext()
+ lateinit var db: AppDatabase
+ override val di =
+ DI.lazy {
+ bind() with
+ singleton {
+ PreferenceManager.getDefaultSharedPreferences(
+ this@OPMLTest.context,
+ )
+ }
+ bind() with instance(db)
+ bind() with singleton { db.feedDao() }
+ bind() with singleton { db.blocklistDao() }
+ bind() with singleton { SettingsStore(di) }
+ bind() with singleton { FeedStore(di) }
+ bind() with singleton { OPMLImporter(di) }
+ bind() with singleton { WorkManager.getInstance(this@OPMLTest.context) }
+ bind() with
+ instance(
+ object : ToastMaker {
+ override suspend fun makeToast(text: String) {}
+
+ override suspend fun makeToast(resId: Int) {}
+ },
+ )
+ bind() with singleton { this@OPMLTest.context.contentResolver }
+ }
+
+ private var dir: File? = null
+ private var path: File? = null
+
+ private val opmlParserHandler: OPMLParserHandler by instance()
+ private val settingsStore: SettingsStore by instance()
+ private val feedStore: FeedStore by instance()
+
+ @Before
+ fun setup() {
+ // Get internal data dir
+ dir = context.externalCacheDir!!.resolve("${Random.nextInt()}").also { it.mkdir() }
+ path = context.externalCacheDir!!.resolve("${Random.nextInt()}").also { it.createNewFile() }
+ assertTrue("Need to be able to write to data dir $dir", dir!!.canWrite())
+
+ db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java).build()
+ }
+
+ @After
+ fun tearDown() {
+ // Remove everything in database
+ }
+
+ @MediumTest
+ @Test
+ fun testWrite() =
+ runBlocking {
+ // Create some feeds
+ createSampleFeeds()
+
+ writeFile(
+ path = path!!.absolutePath,
+ settings = ALL_SETTINGS_WITH_VALUES,
+ blockedPatterns = BLOCKED_PATTERNS,
+ tags = getTags(),
+ ) { tag ->
+ db.feedDao().getFeedsByTitle(tag = tag)
+ }
+
+ // check contents of file
+ path!!.bufferedReader().useLines { lines ->
+ lines.forEachIndexed { i, line ->
+ assertEquals("line $i differed", sampleFile[i], line)
+ }
+ }
+ }
+
+ @MediumTest
+ @Test
+ fun testReadSettings() =
+ runBlocking {
+ writeSampleFile()
+
+ val parser = OpmlPullParser(opmlParserHandler)
+ parser.parseFile(path!!.canonicalPath)
+
+ // Verify database is correct
+ val actual = settingsStore.getAllSettings()
+
+ ALL_SETTINGS_WITH_VALUES.forEach { (key, expected) ->
+ assertEquals(expected, actual[key].toString())
+ }
+
+ val actualBlocked = settingsStore.blockListPreference.first()
+
+ assertEquals(1, actualBlocked.size)
+ assertEquals("foo", actualBlocked.first())
+ }
+
+ @MediumTest
+ @Test
+ fun testRead() =
+ runBlocking {
+ writeSampleFile()
+
+ val parser = OpmlPullParser(opmlParserHandler)
+ parser.parseFile(path!!.canonicalPath)
+
+ // Verify database is correct
+ val seen = ArrayList()
+ val feeds = db.feedDao().getAllFeeds()
+ assertFalse("No feeds in DB!", feeds.isEmpty())
+ for (feed in feeds) {
+ val i = Integer.parseInt(feed.title.replace("[custom \"]".toRegex(), ""))
+ seen.add(i)
+ assertEquals("URL doesn't match", URL("http://example.com/$i/rss.xml"), feed.url)
+
+ when (i) {
+ 0 -> {
+ assertEquals("title should be the same", "\"$i\"", feed.title)
+ assertEquals(
+ "custom title should have been set to title",
+ "\"$i\"",
+ feed.customTitle,
+ )
+ }
+
+ else -> {
+ assertEquals(
+ "custom title should have overridden title",
+ "custom \"$i\"",
+ feed.title,
+ )
+ assertEquals(
+ "title and custom title should match",
+ feed.customTitle,
+ feed.title,
+ )
+ }
+ }
+
+ when {
+ i % 3 == 1 -> assertEquals("tag1", feed.tag)
+ i % 3 == 2 -> assertEquals("tag2", feed.tag)
+ else -> assertEquals("", feed.tag)
+ }
+ }
+ for (i in 0..9) {
+ assertTrue("Missing $i", seen.contains(i))
+ }
+ }
+
+ @MediumTest
+ @Test
+ fun testReadExisting() =
+ runBlocking {
+ writeSampleFile()
+
+ // Create something that does not exist
+ var feednew =
+ Feed(
+ url = URL("http://example.com/20/rss.xml"),
+ title = "\"20\"",
+ tag = "kapow",
+ )
+ var id = db.feedDao().insertFeed(feednew)
+ feednew = feednew.copy(id = id)
+ // Create something that will exist
+ var feedold =
+ Feed(
+ url = URL("http://example.com/0/rss.xml"),
+ title = "\"0\"",
+ )
+ id = db.feedDao().insertFeed(feedold)
+
+ feedold = feedold.copy(id = id)
+
+ // Read file
+ val parser = OpmlPullParser(opmlParserHandler)
+ parser.parseFile(path!!.canonicalPath)
+
+ // should not kill the existing stuff
+ val seen = ArrayList()
+ val feeds = db.feedDao().getAllFeeds()
+ assertFalse("No feeds in DB!", feeds.isEmpty())
+ for (feed in feeds) {
+ val i = Integer.parseInt(feed.title.replace("[custom \"]".toRegex(), ""))
+ seen.add(i)
+ assertEquals(URL("http://example.com/$i/rss.xml"), feed.url)
+
+ when {
+ i == 20 -> {
+ assertEquals("Should not have changed", feednew.id, feed.id)
+ assertEquals("Should not have changed", feednew.url, feed.url)
+ assertEquals("Should not have changed", feednew.tag, feed.tag)
+ }
+
+ i % 3 == 1 -> assertEquals("tag1", feed.tag)
+ i % 3 == 2 -> assertEquals("tag2", feed.tag)
+ else -> assertEquals("", feed.tag)
+ }
+
+ // Ensure titles are correct
+ when (i) {
+ 0 -> {
+ assertEquals("title should be the same", feedold.title, feed.title)
+ assertEquals(
+ "custom title should have been set to title",
+ feedold.title,
+ feed.customTitle,
+ )
+ }
+
+ 20 -> {
+ assertEquals(
+ "feed not present in OPML should not have changed",
+ feednew.title,
+ feed.title,
+ )
+ assertEquals(
+ "feed not present in OPML should not have changed",
+ feednew.customTitle,
+ feednew.customTitle,
+ )
+ }
+
+ else -> {
+ assertEquals(
+ "custom title should have overridden title",
+ "custom \"$i\"",
+ feed.title,
+ )
+ assertEquals(
+ "title and custom title should match",
+ feed.customTitle,
+ feed.title,
+ )
+ }
+ }
+
+ if (i == 0) {
+ // Make sure id is same as old
+ assertEquals("Id should be same still", feedold.id, feed.id)
+
+ assertTrue("Notify is wrong", feed.notify)
+ assertTrue("AlternateId is wrong", feed.alternateId)
+ assertTrue("FullTextByDefault is wrong", feed.fullTextByDefault)
+ assertEquals("OpenArticlesWith is wrong", "reader", feed.openArticlesWith)
+ assertEquals(
+ "ImageURL is wrong",
+ URL("https://example.com/feedImage.png"),
+ feed.imageUrl,
+ )
+ }
+ }
+ assertTrue("Missing 20", seen.contains(20))
+ for (i in 0..9) {
+ assertTrue("Missing $i", seen.contains(i))
+ }
+ }
+
+ @MediumTest
+ @Test
+ fun testReadBadFile() =
+ runBlocking {
+ path!!.bufferedWriter().use {
+ it.write("This is just some bullshit in the file\n")
+ }
+
+ // Read file
+ val parser = OpmlPullParser(opmlParserHandler)
+ parser.parseFile(path!!.absolutePath)
+
+ val feeds = db.feedDao().getAllFeeds()
+ assertTrue("Expected no feeds and no exception", feeds.isEmpty())
+ }
+
+ @SmallTest
+ @Test
+ fun testReadMissingFile() =
+ runBlocking {
+ val path = File(dir, "lsadflibaslsdfa.opml")
+ // Read file
+ val parser = OpmlPullParser(opmlParserHandler)
+ val result = parser.parseFile(path.absolutePath)
+
+ assertTrue(result.isLeft())
+ }
+
+ @Throws(IOException::class)
+ private fun writeSampleFile() =
+ runBlocking {
+ // Use test write to write the sample file
+ testWrite()
+ // Then delete all feeds again
+ db.runInTransaction {
+ runBlocking {
+ db.feedDao().getAllFeeds().forEach {
+ db.feedDao().deleteFeed(it)
+ }
+ }
+ }
+ }
+
+ private suspend fun createSampleFeeds() {
+ for (i in 0..9) {
+ val feed =
+ Feed(
+ url = URL("http://example.com/$i/rss.xml"),
+ title = "\"$i\"",
+ customTitle = if (i == 0) "" else "custom \"$i\"",
+ tag =
+ when (i % 3) {
+ 1 -> "tag1"
+ 2 -> "tag2"
+ else -> ""
+ },
+ notify = i == 0,
+ alternateId = i == 0,
+ fullTextByDefault = i == 0,
+ imageUrl =
+ if (i == 0) {
+ URL("https://example.com/feedImage.png")
+ } else {
+ null
+ },
+ openArticlesWith =
+ if (i == 0) {
+ "reader"
+ } else {
+ OPEN_ARTICLE_WITH_APPLICATION_DEFAULT
+ },
+ )
+
+ db.feedDao().insertFeed(feed)
+ }
+ }
+
+ private suspend fun getTags(): List = db.feedDao().loadTags()
+
+ @Test
+ @MediumTest
+ fun antennaPodOPMLImports() =
+ runBlocking {
+ // given
+ val opmlStream = this@OPMLTest.javaClass.getResourceAsStream("antennapod-feeds.opml")!!
+
+ // when
+ val parser = OpmlPullParser(opmlParserHandler)
+ parser.parseInputStreamWithFallback(opmlStream)
+
+ // then
+ val feeds = db.feedDao().getAllFeeds()
+ val tags = db.feedDao().loadTags()
+ assertEquals("Expecting 8 feeds", 8, feeds.size)
+ assertEquals("Expecting 1 tags (incl empty)", 1, tags.size)
+
+ feeds.forEach { feed ->
+ assertEquals("No tag expected", "", feed.tag)
+ when (feed.url) {
+ URL("http://aliceisntdead.libsyn.com/rss") -> {
+ assertEquals("Alice Isn't Dead", feed.title)
+ }
+
+ URL("http://feeds.soundcloud.com/users/soundcloud:users:154104768/sounds.rss") -> {
+ assertEquals("Invisible City", feed.title)
+ }
+
+ URL("http://feeds.feedburner.com/PodCastle_Main") -> {
+ assertEquals("PodCastle", feed.title)
+ }
+
+ URL("http://www.artofstorytellingshow.com/podcast/storycast.xml") -> {
+ assertEquals("The Art of Storytelling with Brother Wolf", feed.title)
+ }
+
+ URL("http://feeds.feedburner.com/TheCleansed") -> {
+ assertEquals("The Cleansed: A Post-Apocalyptic Saga", feed.title)
+ }
+
+ URL("http://media.signumuniversity.org/tolkienprof/feed") -> {
+ assertEquals("The Tolkien Professor", feed.title)
+ }
+
+ URL("http://nightvale.libsyn.com/rss") -> {
+ assertEquals("Welcome to Night Vale", feed.title)
+ }
+
+ URL("http://withinthewires.libsyn.com/rss") -> {
+ assertEquals("Within the Wires", feed.title)
+ }
+
+ else -> fail("Unexpected URI. Feed: $feed")
+ }
+ }
+ }
+
+ @Test
+ @MediumTest
+ fun flymOPMLImports() =
+ runBlocking {
+ // given
+ val opmlStream = this@OPMLTest.javaClass.getResourceAsStream("Flym_auto_backup.opml")!!
+
+ // when
+ val parser = OpmlPullParser(opmlParserHandler)
+ parser.parseInputStreamWithFallback(opmlStream)
+
+ // then
+ val feeds = db.feedDao().getAllFeeds()
+ val tags = db.feedDao().loadTags()
+ assertEquals("Expecting 11 feeds", 11, feeds.size)
+ assertEquals("Expecting 4 tags (incl empty)", 4, tags.size)
+
+ feeds.forEach { feed ->
+ when (feed.url) {
+ URL("http://www.smbc-comics.com/rss.php") -> {
+ assertEquals("black humor", feed.tag)
+ assertEquals("SMBC", feed.customTitle)
+ assertFalse(feed.fullTextByDefault)
+ }
+
+ URL("http://www.deathbulge.com/rss.xml") -> {
+ assertEquals("black humor", feed.tag)
+ assertEquals("Deathbulge", feed.customTitle)
+ assertTrue(feed.fullTextByDefault)
+ }
+
+ URL("http://www.sandraandwoo.com/gaia/feed/") -> {
+ assertEquals("comics", feed.tag)
+ assertEquals("Gaia", feed.customTitle)
+ assertFalse(feed.fullTextByDefault)
+ }
+
+ URL("http://replaycomic.com/feed/") -> {
+ assertEquals("comics", feed.tag)
+ assertEquals("Replay", feed.customTitle)
+ assertTrue(feed.fullTextByDefault)
+ }
+
+ URL("http://www.cuttimecomic.com/rss.php") -> {
+ assertEquals("comics", feed.tag)
+ assertEquals("Cut Time", feed.customTitle)
+ assertFalse(feed.fullTextByDefault)
+ }
+
+ URL("http://www.commitstrip.com/feed/") -> {
+ assertEquals("comics", feed.tag)
+ assertEquals("Commit strip", feed.customTitle)
+ assertTrue(feed.fullTextByDefault)
+ }
+
+ URL("http://www.sandraandwoo.com/feed/") -> {
+ assertEquals("comics", feed.tag)
+ assertEquals("Sandra and Woo", feed.customTitle)
+ assertFalse(feed.fullTextByDefault)
+ }
+
+ URL("http://www.awakencomic.com/rss.php") -> {
+ assertEquals("comics", feed.tag)
+ assertEquals("Awaken", feed.customTitle)
+ assertTrue(feed.fullTextByDefault)
+ }
+
+ URL("http://www.questionablecontent.net/QCRSS.xml") -> {
+ assertEquals("comics", feed.tag)
+ assertEquals("Questionable Content", feed.customTitle)
+ assertFalse(feed.fullTextByDefault)
+ }
+
+ URL("https://www.archlinux.org/feeds/news/") -> {
+ assertEquals("Tech", feed.tag)
+ assertEquals("Arch news", feed.customTitle)
+ assertFalse(feed.fullTextByDefault)
+ }
+
+ URL("https://grisebouille.net/feed/") -> {
+ assertEquals("Political humour", feed.tag)
+ assertEquals("Grisebouille", feed.customTitle)
+ assertTrue(feed.fullTextByDefault)
+ }
+
+ else -> fail("Unexpected URI. Feed: $feed")
+ }
+ }
+ }
+
+ @Test
+ @MediumTest
+ fun rssGuardOPMLImports1() =
+ runBlocking {
+ // given
+ val opmlStream = this@OPMLTest.javaClass.getResourceAsStream("rssguard_1.opml")!!
+
+ // when
+ val parser = OpmlPullParser(opmlParserHandler)
+ parser.parseInputStreamWithFallback(opmlStream)
+
+ // then
+ val feeds = db.feedDao().getAllFeeds()
+ val tags = db.feedDao().loadTags()
+ assertEquals("Expecting 30 feeds", 30, feeds.size)
+ assertEquals("Expecting 6 tags (incl empty)", 6, tags.size)
+
+ feeds.forEach { feed ->
+ when (feed.url) {
+ URL("http://www.les-trois-sagesses.org/rss-articles.xml") -> {
+ assertEquals("Religion", feed.tag)
+ assertEquals("Les trois sagesses", feed.customTitle)
+ }
+
+ URL("http://www.avrildeperthuis.com/feed/") -> {
+ assertEquals("Amis", feed.tag)
+ assertEquals("avril de perthuis", feed.customTitle)
+ }
+
+ URL("http://www.fashioningtech.com/profiles/blog/feed?xn_auth=no") -> {
+ assertEquals("Actu Geek", feed.tag)
+ assertEquals("Everyone's Blog Posts - Fashioning Technology", feed.customTitle)
+ }
+
+ URL("http://feeds2.feedburner.com/ChartPorn") -> {
+ assertEquals("Graphs", feed.tag)
+ assertEquals("Chart Porn", feed.customTitle)
+ }
+
+ URL("http://www.mosqueedeparis.net/index.php?format=feed&type=atom") -> {
+ assertEquals("Religion", feed.tag)
+ assertEquals("Mosquee de Paris", feed.customTitle)
+ }
+
+ URL("http://sourceforge.net/projects/stuntrally/rss") -> {
+ assertEquals("Mainstream update", feed.tag)
+ assertEquals("Stunt Rally", feed.customTitle)
+ }
+
+ URL("http://www.mairie6.lyon.fr/cs/Satellite?Thematique=&TypeContenu=Actualite&pagename=RSSFeed&site=Mairie6") -> {
+ assertEquals("", feed.tag)
+ assertEquals("Actualités", feed.customTitle)
+ }
+ }
+ }
+ }
+
+ @MediumTest
+ @Test
+ fun testExportThenImport(): Unit =
+ runBlocking {
+ val fileUri = context.cacheDir.resolve("exporttest.opml").toUri()
+ val feedIds = mutableSetOf()
+ feedStore.saveFeed(
+ Feed(
+ title = "Ampersands are & the worst",
+ url = URL("https://example.com/ampersands"),
+ ),
+ ).also { feedIds.add(it) }
+ feedStore.saveFeed(
+ Feed(
+ title = "So are > brackets",
+ url = URL("https://example.com/lt"),
+ ),
+ ).also { feedIds.add(it) }
+ feedStore.saveFeed(
+ Feed(
+ title = "So are < brackets",
+ url = URL("https://example.com/gt"),
+ ),
+ ).also { feedIds.add(it) }
+
+ assertEquals(3, feedIds.size)
+
+ val exportResult = exportOpml(di, fileUri)
+
+ exportResult.leftOrNull()?.let { e ->
+ throw e.throwable!!
+ }
+
+ val opmlFeedList = OpmlFeedList()
+ val parser = OpmlPullParser(opmlFeedList)
+ val result = parser.parseFile(fileUri.path!!)
+
+ result.leftOrNull()?.let { e ->
+ throw e.throwable!!
+ }
+
+ assertEquals(3, opmlFeedList.feeds.size)
+ }
+
+ @Test
+ @MediumTest
+ fun importPlenaryProgramming(): Unit =
+ runBlocking {
+ // given
+ val opmlStream = this@OPMLTest.javaClass.getResourceAsStream("Programming.opml")!!
+
+ // when
+ val opmlFeedList = OpmlFeedList()
+ val parser = OpmlPullParser(opmlFeedList)
+ val result = parser.parseInputStreamWithFallback(opmlStream)
+
+ result.leftOrNull()?.let {
+ throw it.throwable!!
+ }
+
+ // then
+ assertEquals("Expecting feeds", 50, opmlFeedList.feeds.size)
+ }
+
+ @Test
+ @MediumTest
+ fun rssGuardOPMLImports2() =
+ runBlocking {
+ // given
+ val opmlStream = this@OPMLTest.javaClass.getResourceAsStream("rssguard_2.opml")!!
+
+ // when
+ val parser = OpmlPullParser(opmlParserHandler)
+ parser.parseInputStreamWithFallback(opmlStream)
+
+ // then
+ val feeds = db.feedDao().getAllFeeds()
+ val tags = db.feedDao().loadTags()
+ assertEquals("Expecting 30 feeds", 30, feeds.size)
+ assertEquals("Expecting 6 tags (incl empty)", 6, tags.size)
+
+ feeds.forEach { feed ->
+ when (feed.url) {
+ URL("http://www.les-trois-sagesses.org/rss-articles.xml") -> {
+ assertEquals("Religion", feed.tag)
+ assertEquals("Les trois sagesses", feed.customTitle)
+ }
+
+ URL("http://www.avrildeperthuis.com/feed/") -> {
+ assertEquals("Amis", feed.tag)
+ assertEquals("avril de perthuis", feed.customTitle)
+ }
+
+ URL("http://www.fashioningtech.com/profiles/blog/feed?xn_auth=no") -> {
+ assertEquals("Actu Geek", feed.tag)
+ assertEquals("Everyone's Blog Posts - Fashioning Technology", feed.customTitle)
+ }
+
+ URL("http://feeds2.feedburner.com/ChartPorn") -> {
+ assertEquals("Graphs", feed.tag)
+ assertEquals("Chart Porn", feed.customTitle)
+ }
+
+ URL("http://www.mosqueedeparis.net/index.php?format=feed&type=atom") -> {
+ assertEquals("Religion", feed.tag)
+ assertEquals("Mosquee de Paris", feed.customTitle)
+ }
+
+ URL("http://sourceforge.net/projects/stuntrally/rss") -> {
+ assertEquals("Mainstream update", feed.tag)
+ assertEquals("Stunt Rally", feed.customTitle)
+ }
+
+ URL("http://www.mairie6.lyon.fr/cs/Satellite?Thematique=&TypeContenu=Actualite&pagename=RSSFeed&site=Mairie6") -> {
+ assertEquals("", feed.tag)
+ assertEquals("Actualités", feed.customTitle)
+ }
+ }
+ }
+ }
+
+ companion object {
+ private val BLOCKED_PATTERNS: List = listOf("foo")
+ private val ALL_SETTINGS_WITH_VALUES: Map =
+ UserSettings.values().associate { userSetting ->
+ userSetting.key to
+ when (userSetting) {
+ UserSettings.SETTING_OPEN_LINKS_WITH -> PREF_VAL_OPEN_WITH_CUSTOM_TAB
+ UserSettings.SETTING_ADDED_FEEDER_NEWS -> "true"
+ UserSettings.SETTING_THEME -> "night"
+ UserSettings.SETTING_DARK_THEME -> "dark"
+ UserSettings.SETTING_DYNAMIC_THEME -> "false"
+ UserSettings.SETTING_SORT -> "oldest_first"
+ UserSettings.SETTING_SHOW_FAB -> "false"
+ UserSettings.SETTING_FEED_ITEM_STYLE -> "SUPER_COMPACT"
+ UserSettings.SETTING_SWIPE_AS_READ -> "DISABLED"
+ UserSettings.SETTING_SYNC_ON_RESUME -> "true"
+ UserSettings.SETTING_SYNC_ONLY_WIFI -> "false"
+ UserSettings.SETTING_IMG_ONLY_WIFI -> "true"
+ UserSettings.SETTING_IMG_SHOW_THUMBNAILS -> "false"
+ UserSettings.SETTING_DEFAULT_OPEN_ITEM_WITH -> PREF_VAL_OPEN_WITH_CUSTOM_TAB
+ UserSettings.SETTING_TEXT_SCALE -> "1.6"
+ UserSettings.SETTING_IS_MARK_AS_READ_ON_SCROLL -> "true"
+ UserSettings.SETTING_READALOUD_USE_DETECT_LANGUAGE -> "true"
+ UserSettings.SETTING_SYNC_ONLY_CHARGING -> "true"
+ UserSettings.SETTING_SYNC_FREQ -> "720"
+ UserSettings.SETTING_MAX_LINES -> "6"
+ UserSettings.SETTINGS_FILTER_SAVED -> "true"
+ UserSettings.SETTINGS_FILTER_RECENTLY_READ -> "true"
+ UserSettings.SETTINGS_FILTER_READ -> "false"
+ UserSettings.SETTINGS_LIST_SHOW_ONLY_TITLES -> "true"
+ UserSettings.SETTING_OPEN_ADJACENT -> "true"
+ }
+ }
+ }
+}
+
+suspend fun OpmlPullParser.parseFile(path: String): Either {
+ return try {
+ File(path).inputStream().use {
+ parseInputStreamWithFallback(it)
+ }
+ } catch (t: Throwable) {
+ Either.Left(OpmlUnknownError(t))
+ }
+}
+
+private val sampleFile: List =
+ """
+
+
+
+
+ Feeder
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ """.trimIndent()
+ .split("\n")
+
+class OpmlFeedList : OPMLParserHandler {
+ val feeds = mutableMapOf()
+ val settings = mutableMapOf()
+ val blockList = mutableListOf()
+
+ override suspend fun saveFeed(feed: Feed) {
+ feeds[feed.url] = feed
+ }
+
+ override suspend fun saveSetting(
+ key: String,
+ value: String,
+ ) {
+ settings.put(key, value)
+ }
+
+ override suspend fun saveBlocklistPatterns(patterns: Iterable) {
+ blockList.addAll(patterns)
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/Helpers.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/Helpers.kt
new file mode 100644
index 000000000..5d670fd33
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/Helpers.kt
@@ -0,0 +1,72 @@
+package com.nononsenseapps.feeder.ui
+
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.withTimeout
+
+/**
+ * Delays until the factory provides the correct object
+ */
+suspend fun whileNotEq(
+ other: Any?,
+ timeoutMillis: Long = 500,
+ sleepMillis: Long = 50,
+ body: (suspend () -> T),
+): T =
+ withTimeout(timeoutMillis) {
+ var item = body.invoke()
+ while (item != other) {
+ delay(sleepMillis)
+ item = body.invoke()
+ }
+ item
+ }
+
+/**
+ * Delays until the factory provides a different object
+ */
+suspend fun whileEq(
+ other: Any?,
+ timeoutMillis: Long = 500,
+ sleepMillis: Long = 50,
+ body: (suspend () -> T),
+): T =
+ withTimeout(timeoutMillis) {
+ var item = body.invoke()
+ while (item == other) {
+ delay(sleepMillis)
+ item = body.invoke()
+ }
+ item
+ }
+
+/**
+ * Delays until the factory provides a different object
+ */
+suspend fun untilNotEq(
+ other: Any?,
+ timeoutMillis: Long = 500,
+ sleepMillis: Long = 50,
+ body: (suspend () -> T),
+): T =
+ whileEq(
+ other = other,
+ timeoutMillis = timeoutMillis,
+ sleepMillis = sleepMillis,
+ body = body,
+ )
+
+/**
+ * Delays until the factory provides the correct object
+ */
+suspend fun untilEq(
+ other: Any?,
+ timeoutMillis: Long = 500,
+ sleepMillis: Long = 50,
+ body: (suspend () -> T),
+): T =
+ whileNotEq(
+ other = other,
+ timeoutMillis = timeoutMillis,
+ sleepMillis = sleepMillis,
+ body = body,
+ )
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/NotificationClearingTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/NotificationClearingTest.kt
new file mode 100644
index 000000000..362cf4cbf
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/NotificationClearingTest.kt
@@ -0,0 +1,112 @@
+package com.nononsenseapps.feeder.ui
+
+import androidx.test.core.app.ApplicationProvider.getApplicationContext
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.nononsenseapps.feeder.db.room.Feed
+import com.nononsenseapps.feeder.db.room.FeedItem
+import com.nononsenseapps.feeder.db.room.FeedItemWithFeed
+import com.nononsenseapps.feeder.model.RssNotificationBroadcastReceiver
+import com.nononsenseapps.feeder.model.getDeleteIntent
+import com.nononsenseapps.feeder.model.notify
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withContext
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.net.URL
+
+// This can be flaky
+@RunWith(AndroidJUnit4::class)
+@Ignore
+class NotificationClearingTest {
+ private val receiver: RssNotificationBroadcastReceiver = RssNotificationBroadcastReceiver()
+
+ @get:Rule
+ val testDb = TestDatabaseRule(getApplicationContext())
+
+ @Test
+ fun clearingNotificationMarksAsNotified() =
+ runBlocking {
+ val feedId =
+ testDb.db.feedDao().insertFeed(
+ Feed(
+ title = "testFeed",
+ url = URL("http://testfeed"),
+ tag = "testTag",
+ ),
+ )
+
+ val item1Id =
+ testDb.db.feedItemDao().insertFeedItem(
+ FeedItem(
+ feedId = feedId,
+ guid = "item1",
+ title = "item1",
+ notified = false,
+ ),
+ )
+
+ val di =
+ getDeleteIntent(
+ getApplicationContext(),
+ FeedItemWithFeed(
+ id = item1Id,
+ feedId = feedId,
+ guid = "item1",
+ title = "item1",
+ ),
+ )
+
+ runBlocking {
+ // Receiver runs on main thread
+ withContext(Dispatchers.Main) {
+ receiver.onReceive(getApplicationContext(), di)
+ }
+
+ delay(50)
+
+ val item = testDb.db.feedItemDao().loadFeedItem(guid = "item1", feedId = feedId)
+ assertTrue(item!!.notified)
+ }
+ }
+
+ @Test
+ fun notifyWorksOnMainThread() =
+ runBlocking {
+ val feedId =
+ testDb.db.feedDao().insertFeed(
+ Feed(
+ title = "testFeed",
+ url = URL("http://testfeed"),
+ tag = "testTag",
+ ),
+ )
+
+ testDb.db.feedItemDao().insertFeedItem(
+ FeedItem(
+ feedId = feedId,
+ guid = "item1",
+ title = "item1",
+ notified = false,
+ ),
+ )
+
+ runBlocking {
+ // Try to notify on main thread
+ withContext(Dispatchers.Main) {
+ notify(getApplicationContext())
+ }
+
+ delay(50)
+
+ // Only care that the above call didn't crash because we ran on the main thread
+ val item = testDb.db.feedItemDao().loadFeedItem(guid = "item1", feedId = feedId)
+ assertFalse(item!!.notified)
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/TestDatabaseRule.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/TestDatabaseRule.kt
new file mode 100644
index 000000000..d24bc64b0
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/TestDatabaseRule.kt
@@ -0,0 +1,25 @@
+package com.nononsenseapps.feeder.ui
+
+import android.content.Context
+import androidx.room.Room
+import com.nononsenseapps.feeder.db.room.AppDatabase
+import org.junit.rules.ExternalResource
+
+class TestDatabaseRule(private val context: Context) : ExternalResource() {
+ lateinit var db: AppDatabase
+
+ override fun before() {
+ db =
+ Room.inMemoryDatabaseBuilder(
+ context,
+ AppDatabase::class.java,
+ ).build().also {
+ // Ensure all classes use test database
+ AppDatabase.setInstance(it)
+ }
+ }
+
+ override fun after() {
+ // Don't close the databse or tests fail
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/activity/AddFeedFromShareActivityTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/activity/AddFeedFromShareActivityTest.kt
new file mode 100644
index 000000000..04e6ce27a
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/activity/AddFeedFromShareActivityTest.kt
@@ -0,0 +1,26 @@
+package com.nononsenseapps.feeder.ui.activity
+
+import android.content.Intent
+import androidx.lifecycle.Lifecycle
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.core.app.launchActivity
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.nononsenseapps.feeder.ui.AddFeedFromShareActivity
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertEquals
+
+@RunWith(AndroidJUnit4::class)
+class AddFeedFromShareActivityTest {
+ @Test
+ fun activityShouldStart() {
+ val intent =
+ Intent(
+ ApplicationProvider.getApplicationContext(),
+ AddFeedFromShareActivity::class.java,
+ )
+ launchActivity(intent).use { scenario ->
+ assertEquals(Lifecycle.State.RESUMED, scenario.state)
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/activity/MainActivityTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/activity/MainActivityTest.kt
new file mode 100644
index 000000000..036179ff7
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/activity/MainActivityTest.kt
@@ -0,0 +1,26 @@
+package com.nononsenseapps.feeder.ui.activity
+
+import android.content.Intent
+import androidx.lifecycle.Lifecycle
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.core.app.launchActivity
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.nononsenseapps.feeder.ui.MainActivity
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertEquals
+
+@RunWith(AndroidJUnit4::class)
+class MainActivityTest {
+ @Test
+ fun activityShouldStart() {
+ val intent =
+ Intent(
+ ApplicationProvider.getApplicationContext(),
+ MainActivity::class.java,
+ )
+ launchActivity(intent).use { scenario ->
+ assertEquals(Lifecycle.State.RESUMED, scenario.state)
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/activity/ManageSettingsActivityTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/activity/ManageSettingsActivityTest.kt
new file mode 100644
index 000000000..bf7d7db85
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/activity/ManageSettingsActivityTest.kt
@@ -0,0 +1,26 @@
+package com.nononsenseapps.feeder.ui.activity
+
+import android.content.Intent
+import androidx.lifecycle.Lifecycle
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.core.app.launchActivity
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.nononsenseapps.feeder.ui.ManageSettingsActivity
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertEquals
+
+@RunWith(AndroidJUnit4::class)
+class ManageSettingsActivityTest {
+ @Test
+ fun activityShouldStart() {
+ val intent =
+ Intent(
+ ApplicationProvider.getApplicationContext(),
+ ManageSettingsActivity::class.java,
+ )
+ launchActivity(intent).use { scenario ->
+ assertEquals(Lifecycle.State.RESUMED, scenario.state)
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/BaseComposeTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/BaseComposeTest.kt
new file mode 100644
index 000000000..6fa2a4167
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/BaseComposeTest.kt
@@ -0,0 +1,7 @@
+package com.nononsenseapps.feeder.ui.compose
+
+import androidx.compose.ui.test.junit4.ComposeTestRule
+
+interface BaseComposeTest {
+ val composeTestRule: ComposeTestRule
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/EndToEndTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/EndToEndTest.kt
new file mode 100644
index 000000000..8caac394c
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/EndToEndTest.kt
@@ -0,0 +1,44 @@
+package com.nononsenseapps.feeder.ui.compose
+
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import com.nononsenseapps.feeder.ui.MainActivity
+import com.nononsenseapps.feeder.ui.compose.theme.FeederTheme
+import com.nononsenseapps.feeder.ui.robots.feedScreen
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+import org.kodein.di.compose.withDI
+
+@Ignore
+class EndToEndTest : BaseComposeTest {
+ @get:Rule
+ override val composeTestRule = createAndroidComposeRule()
+
+ @Before
+ fun setup() {
+ composeTestRule.setContent {
+ FeederTheme {
+ withDI {
+ composeTestRule.activity.AppContent()
+ }
+ }
+ }
+ }
+
+ @Test
+ fun addFeed() {
+ feedScreen {
+ } openOverflowMenu {
+ } pressAddFeed {
+ assertSearchButtonIsNotEnabled()
+ enterText("cowboyprogrammer.org")
+ assertSearchButtonIsEnabled()
+ pressSearchButton()
+ } pressFirstResult {
+ scrollToBottom()
+ } pressOKButton {
+ assertAppBarTitleIs("Cowboy Programmer")
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/FeedScreenMarkAsReadOnScrollTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/FeedScreenMarkAsReadOnScrollTest.kt
new file mode 100644
index 000000000..f1d89fe1a
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/FeedScreenMarkAsReadOnScrollTest.kt
@@ -0,0 +1,193 @@
+package com.nononsenseapps.feeder.ui.compose
+
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.click
+import androidx.compose.ui.test.hasTestTag
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.test.swipe
+import com.nononsenseapps.feeder.archmodel.Repository
+import com.nononsenseapps.feeder.archmodel.SyncFrequency
+import com.nononsenseapps.feeder.db.room.Feed
+import com.nononsenseapps.feeder.db.room.FeedItem
+import com.nononsenseapps.feeder.ui.MainActivity
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withTimeout
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+import org.kodein.di.instance
+import java.net.URL
+import java.time.Instant
+import java.time.ZoneOffset
+import java.time.ZonedDateTime
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+
+@Ignore("Flaky")
+class FeedScreenMarkAsReadOnScrollTest : BaseComposeTest {
+ @get:Rule
+ override val composeTestRule = createAndroidComposeRule()
+
+ @OptIn(ExperimentalTestApi::class)
+ @Test
+ fun scrollingWillMarkAsRead() {
+ val repository by (composeTestRule.activity).di.instance()
+
+ repository.setIsMarkAsReadOnScroll(true)
+ repository.setSyncFrequency(SyncFrequency.MANUAL)
+
+ // Ensure we have feeds and items
+ val feedId =
+ runBlocking {
+ val feedId =
+ repository.saveFeed(
+ Feed(
+ title = "Ampersands are & the worst",
+ url = URL("https://example.com/ampersands"),
+ ),
+ )
+
+ repository.setCurrentFeedAndTag(feedId, "")
+
+ repository.upsertFeedItems(
+ (1..50).map { i ->
+ FeedItem(
+ guid = "guid$i",
+ title = "Item $i",
+ feedId = feedId,
+ pubDate = ZonedDateTime.now(ZoneOffset.UTC).plusDays(i.toLong()),
+ primarySortTime = Instant.now().plusSeconds(i.toLong()),
+ ) to ""
+ },
+ ) { _, _ -> }
+
+ feedId
+ }
+
+ composeTestRule.waitUntilExactlyOneExists(
+ hasTestTag("feed_list"),
+ 10_000L,
+ )
+
+ val unreadCountBefore: Int =
+ runBlocking {
+ repository.getUnreadCount(feedId).first()
+ }
+
+ assertTrue("There should be unread items before test: $unreadCountBefore") {
+ unreadCountBefore > 0
+ }
+
+ composeTestRule.waitForIdle()
+
+ composeTestRule
+ .onNodeWithTag("feed_list")
+ .performTouchInput {
+ val start = Offset(centerX, top)
+ val end = Offset(centerX, -2000f)
+ swipe(start, end, durationMillis = 10_000)
+ }
+
+ composeTestRule.waitForIdle()
+
+ runBlocking {
+ withTimeout(5_000L) {
+ while (repository.getUnreadCount(feedId).first() == unreadCountBefore) {
+ composeTestRule.waitForIdle()
+ delay(100L)
+ }
+ }
+ }
+ }
+
+ @OptIn(ExperimentalTestApi::class)
+ @Test
+ fun markAsReadOnScrollOnlyHappensOnScroll() {
+ val repository by (composeTestRule.activity).di.instance()
+
+ repository.setIsMarkAsReadOnScroll(true)
+ repository.setSyncFrequency(SyncFrequency.MANUAL)
+
+ // Ensure we have feeds and items
+ val feedId =
+ runBlocking {
+ val feedId =
+ repository.saveFeed(
+ Feed(
+ title = "Ampersands are & the worst",
+ url = URL("https://example.com/ampersands"),
+ ),
+ )
+
+ repository.setCurrentFeedAndTag(feedId, "")
+
+ repository.upsertFeedItems(
+ (1..50).map { i ->
+ FeedItem(
+ guid = "guid$i",
+ title = "Item $i",
+ feedId = feedId,
+ pubDate = ZonedDateTime.now(ZoneOffset.UTC).plusDays(i.toLong()),
+ primarySortTime = Instant.now().plusSeconds(i.toLong()),
+ ) to ""
+ },
+ ) { _, _ -> }
+
+ feedId
+ }
+
+ composeTestRule.waitUntilExactlyOneExists(
+ hasTestTag("feed_list"),
+ 10_000L,
+ )
+
+ val unreadCountBefore: Int =
+ runBlocking {
+ repository.getUnreadCount(feedId).first()
+ }
+
+ assertTrue("There should be unread items before test: $unreadCountBefore") {
+ unreadCountBefore > 0
+ }
+
+ // Make sure items are on screen a while before click. We do that with a slow swipe to the side
+ composeTestRule
+ .onNodeWithTag("feed_list")
+ .performTouchInput {
+ val start = Offset(centerX, top)
+ val end = Offset(-50f, top)
+ swipe(start, end, durationMillis = 10_000)
+ }
+
+ composeTestRule.waitForIdle()
+
+ // Click first item
+ composeTestRule
+ .onNodeWithTag("feed_list")
+ .performTouchInput {
+ click(Offset(centerX, top + 100f))
+ }
+
+ composeTestRule.waitUntilExactlyOneExists(
+ hasTestTag("readerColumn"),
+ 10_000L,
+ )
+
+ composeTestRule.waitForIdle()
+
+ runBlocking {
+ // Delay to ensure background tasks - if any - complete
+ delay(500L)
+ assertEquals(
+ unreadCountBefore - 1,
+ repository.getUnreadCount(feedId).first(),
+ "Should have marked as read on click but no more",
+ )
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/StartingNavigationTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/StartingNavigationTest.kt
new file mode 100644
index 000000000..9b149cb12
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/StartingNavigationTest.kt
@@ -0,0 +1,39 @@
+package com.nononsenseapps.feeder.ui.compose
+
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import com.nononsenseapps.feeder.ui.MainActivity
+import com.nononsenseapps.feeder.ui.compose.theme.FeederTheme
+import com.nononsenseapps.feeder.ui.robots.feedScreen
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+import org.kodein.di.compose.withDI
+import kotlin.test.assertFalse
+
+@Ignore
+class StartingNavigationTest : BaseComposeTest {
+ @get:Rule
+ override val composeTestRule = createAndroidComposeRule()
+
+ @Before
+ fun setup() {
+ composeTestRule.setContent {
+ FeederTheme {
+ withDI {
+ composeTestRule.activity.AppContent()
+ }
+ }
+ }
+ }
+
+ @Test
+ fun backWillExitApp() {
+ feedScreen {
+ pressBackButton()
+ assertFalse {
+ isAppRunning
+ }
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/SyncSetupTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/SyncSetupTest.kt
new file mode 100644
index 000000000..0638a88e0
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/SyncSetupTest.kt
@@ -0,0 +1,53 @@
+package com.nononsenseapps.feeder.ui.compose
+
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.rememberNavController
+import com.nononsenseapps.feeder.ui.MainActivity
+import com.nononsenseapps.feeder.ui.compose.navigation.SyncScreenDestination
+import com.nononsenseapps.feeder.ui.compose.theme.FeederTheme
+import com.nononsenseapps.feeder.ui.robots.feedScreen
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+import org.kodein.di.compose.withDI
+
+@Ignore
+class SyncSetupTest : BaseComposeTest {
+ @get:Rule
+ override val composeTestRule = createAndroidComposeRule()
+
+ @Before
+ fun setup() {
+ composeTestRule.setContent {
+ FeederTheme {
+ withDI {
+ val navController = rememberNavController()
+ val navDrawerListState = rememberLazyListState()
+
+ NavHost(navController, startDestination = SyncScreenDestination.route) {
+ SyncScreenDestination.register(this, navController, navDrawerListState)
+ }
+ }
+ }
+ }
+ }
+
+ @Test
+ fun addFeed() {
+ feedScreen {
+ } openOverflowMenu {
+ } pressAddFeed {
+ assertSearchButtonIsNotEnabled()
+ enterText("cowboyprogrammer.org")
+ assertSearchButtonIsEnabled()
+ pressSearchButton()
+ } pressFirstResult {
+ scrollToBottom()
+ } pressOKButton {
+ assertAppBarTitleIs("Cowboy Programmer")
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/ThumbnailsAreDisplayedTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/ThumbnailsAreDisplayedTest.kt
new file mode 100644
index 000000000..83fa38121
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/ThumbnailsAreDisplayedTest.kt
@@ -0,0 +1,77 @@
+package com.nononsenseapps.feeder.ui.compose
+
+import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.hasTestTag
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import com.nononsenseapps.feeder.archmodel.FeedItemStyle
+import com.nononsenseapps.feeder.archmodel.Repository
+import com.nononsenseapps.feeder.archmodel.SyncFrequency
+import com.nononsenseapps.feeder.db.room.Feed
+import com.nononsenseapps.feeder.db.room.FeedItem
+import com.nononsenseapps.feeder.model.ImageFromHTML
+import com.nononsenseapps.feeder.ui.MainActivity
+import kotlinx.coroutines.runBlocking
+import org.junit.Rule
+import org.junit.Test
+import org.kodein.di.instance
+import java.net.URL
+import java.time.Instant
+import java.time.ZoneOffset
+import java.time.ZonedDateTime
+
+class ThumbnailsAreDisplayedTest : BaseComposeTest {
+ @get:Rule
+ override val composeTestRule = createAndroidComposeRule()
+
+ @OptIn(ExperimentalTestApi::class)
+ @Test
+ fun thumbnailsAreShown() {
+ val repository by (composeTestRule.activity).di.instance()
+
+ repository.setSyncFrequency(SyncFrequency.MANUAL)
+ repository.setFeedItemStyle(FeedItemStyle.CARD)
+ repository.setShowThumbnails(true)
+
+ // Ensure we have feeds and items
+ runBlocking {
+ val feedId =
+ repository.saveFeed(
+ Feed(
+ title = "Ampersands are & the worst",
+ url = URL("https://example.com/ampersands"),
+ ),
+ )
+
+ repository.setCurrentFeedAndTag(feedId, "")
+
+ repository.upsertFeedItems(
+ listOf(
+ FeedItem(
+ guid = "guid anime2you",
+ plainTitle = "Item with image",
+ plainSnippet = "Snippet with image",
+ feedId = feedId,
+ pubDate = ZonedDateTime.now(ZoneOffset.UTC),
+ primarySortTime = Instant.now(),
+ thumbnailImage =
+ ImageFromHTML(
+ url = "https://img.anime2you.de/2023/12/jujutsu-kaisen-6.jpg",
+ width = 700,
+ height = 350,
+ ),
+ ) to "",
+ ),
+ ) { _, _ -> }
+ }
+
+ composeTestRule.waitUntilExactlyOneExists(
+ hasTestTag("feed_list"),
+ 5_000L,
+ )
+
+ composeTestRule.onNodeWithTag("card_image", useUnmergedTree = true)
+ .assertIsDisplayed()
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/AddFeedDestinationTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/AddFeedDestinationTest.kt
new file mode 100644
index 000000000..bbb0432fa
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/AddFeedDestinationTest.kt
@@ -0,0 +1,80 @@
+package com.nononsenseapps.feeder.ui.compose.navigation
+
+import androidx.navigation.NavController
+import io.mockk.MockKAnnotations
+import io.mockk.impl.annotations.MockK
+import io.mockk.verify
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Test
+import kotlin.test.assertEquals
+
+@Ignore
+class AddFeedDestinationTest {
+ @MockK
+ private lateinit var navController: NavController
+
+ @Before
+ fun setup() {
+ MockKAnnotations.init(this, relaxed = true, relaxUnitFun = true)
+ }
+
+ @Test
+ fun addFeedHasCorrectRoute() {
+ assertEquals(
+ "add/feed/{feedUrl}?feedTitle={feedTitle}",
+ AddFeedDestination.route,
+ )
+ }
+
+ @Test
+ fun addFeedNavigateNoTitle() {
+ AddFeedDestination.navigate(
+ navController,
+ "https://cowboyprogrammer.org",
+ )
+
+ verify {
+ navController.navigate("add/feed/https%3A%2F%2Fcowboyprogrammer.org")
+ }
+ }
+
+ @Test
+ fun addFeedNavigateWithEmptyTitle() {
+ AddFeedDestination.navigate(
+ navController,
+ "https://cowboyprogrammer.org",
+ "",
+ )
+
+ verify {
+ navController.navigate("add/feed/https%3A%2F%2Fcowboyprogrammer.org")
+ }
+ }
+
+ @Test
+ fun addFeedNavigateWithBlankTitle() {
+ AddFeedDestination.navigate(
+ navController,
+ "https://cowboyprogrammer.org",
+ " ",
+ )
+
+ verify {
+ navController.navigate("add/feed/https%3A%2F%2Fcowboyprogrammer.org?feedTitle=+")
+ }
+ }
+
+ @Test
+ fun addFeedNavigateWithTitle() {
+ AddFeedDestination.navigate(
+ navController,
+ "https://cowboyprogrammer.org",
+ "A feed",
+ )
+
+ verify {
+ navController.navigate("add/feed/https%3A%2F%2Fcowboyprogrammer.org?feedTitle=A+feed")
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/ArticleDestinationTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/ArticleDestinationTest.kt
new file mode 100644
index 000000000..22969837d
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/ArticleDestinationTest.kt
@@ -0,0 +1,52 @@
+package com.nononsenseapps.feeder.ui.compose.navigation
+
+import androidx.navigation.NavController
+import com.nononsenseapps.feeder.util.DEEP_LINK_BASE_URI
+import io.mockk.MockKAnnotations
+import io.mockk.impl.annotations.MockK
+import io.mockk.verify
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Test
+import kotlin.test.assertEquals
+
+@Ignore
+class ArticleDestinationTest {
+ @MockK
+ private lateinit var navController: NavController
+
+ @Before
+ fun setup() {
+ MockKAnnotations.init(this, relaxed = true, relaxUnitFun = true)
+ }
+
+ @Test
+ fun readerHasCorrectRoute() {
+ assertEquals(
+ "reader/{itemId}",
+ ArticleDestination.route,
+ )
+ }
+
+ @Test
+ fun readerHasCorrectDeeplinks() {
+ assertEquals(
+ listOf(
+ "$DEEP_LINK_BASE_URI/article/{itemId}",
+ ),
+ ArticleDestination.deepLinks.map { it.uriPattern },
+ )
+ }
+
+ @Test
+ fun readerNavigate() {
+ ArticleDestination.navigate(
+ navController,
+ 55L,
+ )
+
+ verify {
+ navController.navigate("reader/55")
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/EditFeedDestinationTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/EditFeedDestinationTest.kt
new file mode 100644
index 000000000..4649ff86c
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/EditFeedDestinationTest.kt
@@ -0,0 +1,41 @@
+package com.nononsenseapps.feeder.ui.compose.navigation
+
+import androidx.navigation.NavController
+import io.mockk.MockKAnnotations
+import io.mockk.impl.annotations.MockK
+import io.mockk.verify
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Test
+import kotlin.test.assertEquals
+
+@Ignore
+class EditFeedDestinationTest {
+ @MockK
+ private lateinit var navController: NavController
+
+ @Before
+ fun setup() {
+ MockKAnnotations.init(this, relaxed = true, relaxUnitFun = true)
+ }
+
+ @Test
+ fun editFeedHasCorrectRoute() {
+ assertEquals(
+ "edit/feed/{feedId}",
+ EditFeedDestination.route,
+ )
+ }
+
+ @Test
+ fun editFeedNavigate() {
+ EditFeedDestination.navigate(
+ navController,
+ 99L,
+ )
+
+ verify {
+ navController.navigate("edit/feed/99")
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/FeedDestinationTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/FeedDestinationTest.kt
new file mode 100644
index 000000000..80486c759
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/FeedDestinationTest.kt
@@ -0,0 +1,89 @@
+package com.nononsenseapps.feeder.ui.compose.navigation
+
+import androidx.navigation.NavController
+import com.nononsenseapps.feeder.db.room.ID_ALL_FEEDS
+import com.nononsenseapps.feeder.util.DEEP_LINK_BASE_URI
+import io.mockk.MockKAnnotations
+import io.mockk.impl.annotations.MockK
+import io.mockk.verify
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Test
+import kotlin.test.assertEquals
+
+@Ignore
+class FeedDestinationTest {
+ @MockK
+ private lateinit var navController: NavController
+
+ @Before
+ fun setup() {
+ MockKAnnotations.init(this, relaxed = true, relaxUnitFun = true)
+ }
+
+ @Test
+ fun feedHasCorrectRoute() {
+ assertEquals(
+ "feed?id={id}&tag={tag}",
+ FeedDestination.route,
+ )
+ }
+
+ @Test
+ fun feedHasCorrectDeeplinks() {
+ assertEquals(
+ listOf(
+ "$DEEP_LINK_BASE_URI/feed?id={id}&tag={tag}",
+ ),
+ FeedDestination.deepLinks.map { it.uriPattern },
+ )
+ }
+
+ @Test
+ fun feedNavigateDefaults() {
+ FeedDestination.navigate(
+ navController,
+ )
+
+ verify {
+ navController.navigate("feed")
+ }
+ }
+
+ @Test
+ fun feedNavigateId() {
+ FeedDestination.navigate(
+ navController,
+ feedId = 6L,
+ )
+
+ verify {
+ navController.navigate("feed?id=6")
+ }
+ }
+
+ @Test
+ fun feedNavigateTag() {
+ FeedDestination.navigate(
+ navController,
+ tag = "foo bar+cop",
+ )
+
+ verify {
+ navController.navigate("feed?tag=foo+bar%2Bcop")
+ }
+ }
+
+ @Test
+ fun feedNavigateIdAndTag() {
+ FeedDestination.navigate(
+ navController,
+ feedId = ID_ALL_FEEDS,
+ tag = "foo bar+cop",
+ )
+
+ verify {
+ navController.navigate("feed?id=-10&tag=foo+bar%2Bcop")
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/SearchFeedDestinationTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/SearchFeedDestinationTest.kt
new file mode 100644
index 000000000..040c207d6
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/SearchFeedDestinationTest.kt
@@ -0,0 +1,52 @@
+package com.nononsenseapps.feeder.ui.compose.navigation
+
+import androidx.navigation.NavController
+import io.mockk.MockKAnnotations
+import io.mockk.impl.annotations.MockK
+import io.mockk.verify
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Test
+import kotlin.test.assertEquals
+
+@Ignore
+class SearchFeedDestinationTest {
+ @MockK
+ private lateinit var navController: NavController
+
+ @Before
+ fun setup() {
+ MockKAnnotations.init(this, relaxed = true, relaxUnitFun = true)
+ }
+
+ @Test
+ fun searchFeedHasCorrectRoute() {
+ assertEquals(
+ "search/feed?feedUrl={feedUrl}",
+ SearchFeedDestination.route,
+ )
+ }
+
+ @Test
+ fun searchFeedNavigateDefaults() {
+ SearchFeedDestination.navigate(
+ navController,
+ )
+
+ verify {
+ navController.navigate("search/feed")
+ }
+ }
+
+ @Test
+ fun searchFeedNavigateFeed() {
+ SearchFeedDestination.navigate(
+ navController,
+ "https://cowboyprogrammer.org",
+ )
+
+ verify {
+ navController.navigate("search/feed?feedUrl=https%3A%2F%2Fcowboyprogrammer.org")
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/SettingsDestinationTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/SettingsDestinationTest.kt
new file mode 100644
index 000000000..f8f1320d1
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/compose/navigation/SettingsDestinationTest.kt
@@ -0,0 +1,40 @@
+package com.nononsenseapps.feeder.ui.compose.navigation
+
+import androidx.navigation.NavController
+import io.mockk.MockKAnnotations
+import io.mockk.impl.annotations.MockK
+import io.mockk.verify
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Test
+import kotlin.test.assertEquals
+
+@Ignore
+class SettingsDestinationTest {
+ @MockK
+ private lateinit var navController: NavController
+
+ @Before
+ fun setup() {
+ MockKAnnotations.init(this, relaxed = true, relaxUnitFun = true)
+ }
+
+ @Test
+ fun settingsHasCorrectRoute() {
+ assertEquals(
+ "settings",
+ SettingsDestination.route,
+ )
+ }
+
+ @Test
+ fun settingsNavigateDefaults() {
+ SettingsDestination.navigate(
+ navController,
+ )
+
+ verify {
+ navController.navigate("settings")
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/AndroidRobot.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/AndroidRobot.kt
new file mode 100644
index 000000000..657b3ca51
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/AndroidRobot.kt
@@ -0,0 +1,17 @@
+package com.nononsenseapps.feeder.ui.robots
+
+import androidx.test.espresso.Espresso
+import androidx.test.espresso.NoActivityResumedException
+
+abstract class AndroidRobot {
+ var isAppRunning: Boolean = true
+ private set
+
+ fun pressBackButton() {
+ try {
+ Espresso.pressBack()
+ } catch (_: NoActivityResumedException) {
+ isAppRunning = false
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/EditFeedScreenRobot.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/EditFeedScreenRobot.kt
new file mode 100644
index 000000000..1e8aada92
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/EditFeedScreenRobot.kt
@@ -0,0 +1,30 @@
+package com.nononsenseapps.feeder.ui.robots
+
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.hasScrollAction
+import androidx.compose.ui.test.junit4.ComposeTestRule
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.performClick
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.test.swipeUp
+
+class EditFeedScreenRobot(
+ private val testRule: ComposeTestRule,
+) : AndroidRobot() {
+ fun scrollToBottom() {
+ testRule
+ .onNode(hasScrollAction())
+ .performTouchInput {
+ swipeUp()
+ }
+ }
+
+ infix fun pressOKButton(block: FeedScreenRobot.() -> Unit): FeedScreenRobot {
+ testRule
+ .onNodeWithText("OK")
+ .assertIsDisplayed()
+ .performClick()
+
+ return FeedScreenRobot(testRule).apply { block() }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/FeedScreenMenuRobot.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/FeedScreenMenuRobot.kt
new file mode 100644
index 000000000..58bab97e9
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/FeedScreenMenuRobot.kt
@@ -0,0 +1,19 @@
+package com.nononsenseapps.feeder.ui.robots
+
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.junit4.ComposeTestRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performClick
+
+class FeedScreenMenuRobot(
+ private val testRule: ComposeTestRule,
+) {
+ infix fun pressAddFeed(block: SearchFeedScreenRobot.() -> Unit): SearchFeedScreenRobot {
+ testRule
+ .onNodeWithTag("menuAddFeed", useUnmergedTree = true)
+ .assertIsDisplayed()
+ .performClick()
+
+ return SearchFeedScreenRobot(testRule).apply { block() }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/FeedScreenRobot.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/FeedScreenRobot.kt
new file mode 100644
index 000000000..5d0547a0f
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/FeedScreenRobot.kt
@@ -0,0 +1,29 @@
+package com.nononsenseapps.feeder.ui.robots
+
+import androidx.compose.ui.test.assert
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.hasText
+import androidx.compose.ui.test.junit4.ComposeTestRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performClick
+import com.nononsenseapps.feeder.ui.compose.BaseComposeTest
+
+fun BaseComposeTest.feedScreen(block: FeedScreenRobot.() -> Unit) = FeedScreenRobot(composeTestRule).apply { block() }
+
+class FeedScreenRobot(
+ private val testRule: ComposeTestRule,
+) : AndroidRobot() {
+ fun assertAppBarTitleIs(title: String) {
+ testRule.onNodeWithTag("appBarTitle")
+ .assertIsDisplayed()
+ .assert(hasText(title))
+ }
+
+ infix fun openOverflowMenu(block: FeedScreenMenuRobot.() -> Unit): FeedScreenMenuRobot {
+ testRule.onNodeWithTag("menuButton")
+ .assertIsDisplayed()
+ .performClick()
+
+ return FeedScreenMenuRobot(testRule).apply { block() }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/SearchFeedScreenRobot.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/SearchFeedScreenRobot.kt
new file mode 100644
index 000000000..5bad401a8
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/ui/robots/SearchFeedScreenRobot.kt
@@ -0,0 +1,60 @@
+package com.nononsenseapps.feeder.ui.robots
+
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.assertIsEnabled
+import androidx.compose.ui.test.assertIsNotEnabled
+import androidx.compose.ui.test.junit4.ComposeTestRule
+import androidx.compose.ui.test.onAllNodesWithTag
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.performClick
+import androidx.compose.ui.test.performTextInput
+
+class SearchFeedScreenRobot(
+ private val testRule: ComposeTestRule,
+) : AndroidRobot() {
+ fun enterText(text: String) {
+ testRule
+ .onNodeWithTag("urlField")
+ .assertIsDisplayed()
+ .performTextInput(text)
+ }
+
+ fun assertSearchButtonIsNotEnabled() {
+ testRule
+ .onNodeWithText("Search")
+ .assertIsDisplayed()
+ .assertIsNotEnabled()
+ }
+
+ fun assertSearchButtonIsEnabled() {
+ testRule
+ .onNodeWithText("Search")
+ .assertIsDisplayed()
+ .assertIsEnabled()
+ }
+
+ fun pressSearchButton() {
+ testRule
+ .onNodeWithText("Search")
+ .assertIsEnabled()
+ .performClick()
+ }
+
+ infix fun pressFirstResult(block: EditFeedScreenRobot.() -> Unit): EditFeedScreenRobot {
+ testRule.waitUntil(5_000) {
+ try {
+ testRule.onNodeWithTag("searchingIndicator")
+ .assertIsDisplayed()
+ false
+ } catch (_: AssertionError) {
+ true
+ }
+ }
+
+ testRule.onAllNodesWithTag("searchResult")[0]
+ .performClick()
+
+ return EditFeedScreenRobot(testRule).apply { block() }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/util/BugReportKTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/util/BugReportKTest.kt
new file mode 100644
index 000000000..9b8c72a8d
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/util/BugReportKTest.kt
@@ -0,0 +1,61 @@
+package com.nononsenseapps.feeder.util
+
+import android.content.Intent.ACTION_SENDTO
+import android.content.Intent.ACTION_VIEW
+import android.content.Intent.EXTRA_EMAIL
+import android.content.Intent.EXTRA_SUBJECT
+import android.content.Intent.EXTRA_TEXT
+import android.net.Uri
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import app.Constants.CRASH_REPORT_ADDRESS
+import app.Constants.EMAIL_REPORT_ADDRESS
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+
+@RunWith(AndroidJUnit4::class)
+@MediumTest
+class BugReportKTest {
+ @Test
+ fun bugIntentIsCorrect() {
+ val intent = emailBugReportIntent()
+
+ assertEquals(ACTION_SENDTO, intent.action)
+ assertEquals(Uri.parse("mailto:$EMAIL_REPORT_ADDRESS"), intent.data)
+ assertEquals("Bug report for Feeder", intent.getStringExtra(EXTRA_SUBJECT))
+ assertEquals(EMAIL_REPORT_ADDRESS, intent.getStringExtra(EXTRA_EMAIL))
+
+ assertTrue(intent.getStringExtra(EXTRA_TEXT)) {
+ "Application: " in intent.getStringExtra(EXTRA_TEXT)!!
+ }
+ }
+
+ @Test
+ fun crashIntentIsCorrect() {
+ try {
+ @Suppress("DIVISION_BY_ZERO")
+ 1 / 0
+ } catch (e: Exception) {
+ val intent = emailCrashReportIntent(e)
+
+ assertEquals(ACTION_SENDTO, intent.action)
+ assertEquals(Uri.parse("mailto:$CRASH_REPORT_ADDRESS"), intent.data)
+ assertEquals("Crash report for Feeder", intent.getStringExtra(EXTRA_SUBJECT))
+ assertEquals(CRASH_REPORT_ADDRESS, intent.getStringExtra(EXTRA_EMAIL))
+
+ assertTrue(intent.getStringExtra(EXTRA_TEXT)) {
+ "java.lang.ArithmeticException: divide by zero" in intent.getStringExtra(EXTRA_TEXT)!!
+ }
+ }
+ }
+
+ @Test
+ fun issuesIntentIsCorrect() {
+ val intent = openGitlabIssues()
+
+ assertEquals(ACTION_VIEW, intent.action)
+ assertEquals(Uri.parse("https://gitlab.com/spacecowboy/Feeder/issues"), intent.data)
+ }
+}
diff --git a/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/util/IcoDecoderTest.kt b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/util/IcoDecoderTest.kt
new file mode 100644
index 000000000..3f99840d1
--- /dev/null
+++ b/fqnews2/app/src/androidTest/java/com/nononsenseapps/feeder/util/IcoDecoderTest.kt
@@ -0,0 +1,99 @@
+package com.nononsenseapps.feeder.util
+
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import coil.ImageLoader
+import coil.decode.DataSource
+import coil.decode.ImageSource
+import coil.fetch.SourceResult
+import coil.request.Options
+import com.danielrampelt.coil.ico.IcoDecoder
+import kotlinx.coroutines.runBlocking
+import okio.buffer
+import okio.source
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertNotNull
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class IcoDecoderTest {
+ private val factory = IcoDecoder.Factory(ApplicationProvider.getApplicationContext())
+
+ @Test
+ fun testPngFavicon() {
+ val decoder =
+ factory.create(
+ pngIco,
+ Options(ApplicationProvider.getApplicationContext()),
+ ImageLoader(ApplicationProvider.getApplicationContext()),
+ )
+
+ assertNotNull(decoder)
+ val result =
+ runBlocking {
+ decoder.decode()
+ }
+ assertNotNull(result)
+ }
+
+ @Test
+ fun testGitlabIco() {
+ val decoder =
+ factory.create(
+ pngIco,
+ Options(ApplicationProvider.getApplicationContext()),
+ ImageLoader(ApplicationProvider.getApplicationContext()),
+ )
+
+ assertNotNull(decoder)
+ val result =
+ runBlocking {
+ decoder.decode()
+ }
+ assertNotNull(result)
+ }
+
+ companion object {
+ private val gitlabIco: SourceResult
+ get() {
+ val buf =
+ Companion::class.java.getResourceAsStream("gitlab.ico")!!
+ .source()
+ .buffer()
+
+ val imageSource =
+ ImageSource(
+ source = buf,
+ context = ApplicationProvider.getApplicationContext(),
+ )
+
+ return SourceResult(
+ source = imageSource,
+ mimeType = null,
+ DataSource.DISK,
+ )
+ }
+
+ private val pngIco: SourceResult
+ get() {
+ val buf =
+ Companion::class.java.getResourceAsStream("png.ico")!!
+ .source()
+ .buffer()
+
+ val imageSource =
+ ImageSource(
+ source = buf,
+ context = ApplicationProvider.getApplicationContext(),
+ )
+
+ return SourceResult(
+ source = imageSource,
+ mimeType = null,
+ DataSource.DISK,
+ )
+ }
+ }
+}
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_content_type_html.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_content_type_html.xml
new file mode 100644
index 000000000..e99dd6abc
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_content_type_html.xml
@@ -0,0 +1,198 @@
+
+feeder_reproduceFeeder Reproduce2020-10-13T08:35:20Z
+ feeder_reproduce/o1iax714,000x Speedup2020-10-12T21:26:03Z<div><div class="span8">
+ <p>In my job as a scientific software developer, I tend to write a lot of code. And most people who haven’t been through a Computer Science degree tend to think that CS is “just” about slinging code at the screen and then running it. I have a good working relationship with many of my colleagues and co-workers with other backgrounds… Physics, Climate Science, Biology, etc. But when it comes to developing software, I get the distinct impression that people think, “Hey, how hard could this be?! We just write down a few instructions about what we want the computer to do, hit the execute button and the, ‘Blamo!’, we get our answer!”</p>
+
+ <p>The problem with that line of thinking is that it’s incredibly easy to write instructions that don’t mean what you think they mean. For example, your program could be completely uninterpretable by the computer. Furthermore, there is literally <a href="https://en.wikipedia.org/wiki/Halting_problem">no way to tell whether your program will ever actually terminate</a> without actually executing it. And there are many, many, <em>many</em>, ways to write a program which make it “slow” to execute. “Slow” being… like <em>really</em> slow. Like it would take your entire lifetime or more to actually execute it. This final problem is one that I see most often when reading software written by people without a CS education. And fixing that is my job.</p>
+
+ <p>The thing about CS that people don’t realize is that it teaches you about the theory of computation, computability (i.e. can we actually compute something? We often take for granted that we can!), algorithm complexity, and all of the knowledge, logic and analysis techniques and help you compose a program that will run in the minimum amount of time or using the minimum amount of space.</p>
+
+ <p>Allow me to show you an example of a huge optimization that I made to a simple script written by a colleague.</p>
+
+ <p>In climate science we do a lot of downscaling. We take temperature and precipitation readings from a coarse scale Global Climate Model grid and map them to a fine scale local grid. Let’s say the global grid is 50x25 and the local grid is 1000x500. For each grid cell in the local grid, we want to know to which grid cell in the global grid it corresponds.</p>
+
+ <p>A simple way to think about this is that we want to minimize the distance between L[n] and G[n]. So a simple way to do the search would be:</p>
+
+ <pre><code>for each Local cell L[i]:
+ for each Global cell G[j]:
+ compute distance between L[i] and G[j]
+ find the minimum distance in the set L[i] * G
+ return the index of the minimum
+ </code></pre>
+
+ <p>It seems simple enough. However, if you look closely, you’ll notice that you have to do a <em>lot</em> of extra work. Look at the algorithm in terms of the size of the input.</p>
+
+ <pre><code>for each Local cell L[i]: # Do this L times
+ for each Global cell G[j]: # Do this L x G times
+ compute distance (d) between L[i] and G[j] # Do this L x G times
+ find the minimum distance in the set d[i*j] # Read G cells L times (cost L x G)
+ find the index whose cell matches the minimum # Read G cells L times (cost L x G)
+ </code></pre>
+
+ <p>The code for this looked something like this:</p>
+
+ <pre><code class="language-R">obs.lon <- ncvar_get(nc.obs, 'lon')
+ obs.lat <- ncvar_get(nc.obs, 'lat')
+ n.lon <- length(obs.lon)
+ n.lat <- length(obs.lat)
+
+ obs.lats <- matrix(obs.lat, nrow=n.lon, ncol=n.lat, byrow=TRUE)
+ obs.lons <- matrix(obs.lon, nrow=n.lon, ncol=n.lat)
+ obs.time <- netcdf.calendar(nc.obs)
+
+ gcm.lon <- ncvar_get(nc.gcm, 'lon')-360
+ gcm.lat <- ncvar_get(nc.gcm, 'lat')
+ gcm.lats <- matrix(gcm.lat, ncol=length(gcm.lat), nrow=length(gcm.lon),
+ byrow=TRUE)
+ gcm.lons <- matrix(gcm.lon, ncol=length(gcm.lat), nrow=length(gcm.lon))
+ gcm.lons.lats <- cbind(c(gcm.lons), c(gcm.lats))
+
+ # Figure out which GCM grid boxes are associated with each fine-scale grid point
+ # Confine search to 10 deg. x 10 deg. neighbourhood
+
+ dxy <- 10
+ mdist <- function(x, y)
+ apply(abs(sweep(data.matrix(y), 2, data.matrix(x), '-')), 1, sum)
+ nn <- list()
+ for (i in seq_along(obs.lons)) {
+ if((i %% 500)==0) cat(i, '')
+ gcm.lims <- ((gcm.lons.lats[,1] >= (obs.lons[i]-dxy)) &
+ (gcm.lons.lats[,1] <= (obs.lons[i]+dxy))) &
+ ((gcm.lons.lats[,2] >= (obs.lats[i]-dxy)) &
+ (gcm.lons.lats[,2] <= (obs.lats[i]+dxy)))
+ gcm.lims <- which(gcm.lims)
+ nn.min <- which.min(mdist(c(obs.lons[i], obs.lats[i]),
+ gcm.lons.lats[gcm.lims,]))
+ nn[[i]] <- gcm.lims[nn.min]
+ }
+ nn <- unlist(nn)
+ </code></pre>
+
+ <p>So, it seems like a simple algorithm. “Just” compute the distances and then find the minimum. But the way it was written, as the size of the number of local cells grows, our cost of computation grows by its product with the number of global grid cells. For Canadian ANUSPLIN data, there are 1068 x 510 cells (for a total of 544,680) and let’s say that our GCM has 50 x 25 cells (for a total of 1,250 cells). So the cost of the inner loop in “some computational unit” is:</p>
+
+
+
+ <p>where the terms are constants that correspond to the cost of computing a distance between two points, finding the minimum point, and finding an array index. Really, we don’t care (much) about the constant terms, because they are not affected by the size of the input. So we can just clump them together and call the cost;</p>
+
+
+
+ <p>So for this set of input, our cost is </p>
+
+ <p>680 million.</p>
+
+ <p>That <em>seems</em> like a lot, but is it? Computers are fast, right? If we run the naive implementation that’s something like this:</p>
+
+ <p>it ends up taking 1668 seconds which is a little less than half an hour.</p>
+
+ <pre><code class="language-R">> source('BCCA/naive.implementation.R')
+ 500 1000 1500 2000 2500 3000 ... 543000 543500 544000 544500 [1] "Elapsed Time"
+ user system elapsed
+ 1668.868 8.926 1681.728
+ </code></pre>
+
+ <p>But do we <em>need</em> for it to take 30 minutes? Here’s the thing. We’re comparing two grids together, both of which have tons of structure that we haven’t taken advantage of. For example the latitudes and longitudes in both the coarse and the fine grid are in sorted order. So if you want to search for a number, you don’t have to look at every single number. You can use a bisect algorithm where you look at the point in the middle and then decide which half of the array you want to search. Then searching the full space only costs you the log (base 2) of the search space.</p>
+
+ <p>The other major structure that we haven’t taken advantage of is the fact that the latitudes repeat themselves in the dimension and the longitudes repeat themselves in the dimension. So instead of doing an operation times, we can do it times. That’s a <em>huge</em> optimization.</p>
+
+ <p>What does that look like in pseudo-code?</p>
+
+ <pre><code>For each local[x]:
+ bisect_search(local[x], Global[x])
+
+ For each local[y]:
+ bisect_search(local[y], Global[y])
+
+ return a 2d grid of the search results for each dimension
+ </code></pre>
+
+ <p>In code:</p>
+
+ <pre><code class="language-R">## Perform a binary search on the *sorted* vector v
+ ## Return the array index of the element closest to x
+ find.nearest <- function(x, v) {
+ if (length(v) == 1) {
+ return(1)
+ }
+ if (length(v) == 2) {
+ return(which.min(abs(v - x)))
+ }
+ mid <- ceiling(length(v) / 2)
+ if (x == v[mid]) {
+ return(mid)
+ } else if (x < v[mid]) {
+ return(find.nearest(x, v[1:mid]))
+ }
+ else {
+ return((mid - 1) + find.nearest(x, v[mid:length(v)]))
+ }
+ }
+
+ regrid.one.dim <- function(coarse.points, fine.points) {
+ return(sapply(fine.points, find.nearest, coarse.points))
+ }
+
+ ## Take a fine scale (e.g. ANUSPLINE) grid of latitudes and longitudes
+ ## and find the indicies that correspond to a coarse scale (e.g. a GCM) grid
+ ## Since the search is essentially a minimizing distance in 2 dimensions
+ ## We can actually search independently in each dimensions separately (which
+ ## is a huge optimization, making the run time x + y instead of x * y) and
+ ## then reconstruct the indices to create a full grid
+ regrid.coarse.to.fine <- function(coarse.lats, coarse.lons, fine.lats, fine.lons) {
+ xi <- regrid.one.dim(gcm.lon, obs.lon)
+ yi <- regrid.one.dim(gcm.lat, obs.lat)
+ ## Two dimensional grid of indices
+ xi <- matrix(xi, ncol=length(fine.lats), nrow=length(fine.lons), byrow=F)
+ yi <- matrix(yi, ncol=length(fine.lats), nrow=length(fine.lons), byrow=T)
+ return(list(xi=xi, yi=yi))
+ }
+
+ </code></pre>
+
+ <p>The cost for every bisection search is the log of the input size. Our input size is divided into X and Y space this time, so we’ll use , and for Global, Local, X and Y.</p>
+
+
+
+ <p>Plugging in our numbers this gives us a cost estimate of 553,076. 553 thousand sounds a lot better than 680 million. Do we see that in the run time?</p>
+
+ <pre><code class="language-R">> ptm <- proc.time(); rv <- regrid.coarse.to.fine(gcm.lat, gcm.lon, obs.lat, obs.lon); print('Elapsed Time'); print(proc.time() - ptm)[1] "Elapsed Time"
+ user system elapsed
+ 0.117 0.000 0.117
+ > str(rv)
+ List of 2
+ $ xi: num [1:1068, 1:510] 15 15 15 15 15 15 15 15 15 15 ...
+ $ yi: num [1:1068, 1:510] 13 13 13 13 13 13 13 13 13 13 ...
+ >
+ </code></pre>
+
+ <p>0.117 seconds. What took us almost half an hour before, now takes us a little over of a second.</p>
+
+ <pre><code class="language-R">> 1668.868 / .117
+ [1] 14263.83
+ </code></pre>
+
+ <p>Soooooo… I know that I’m trained to do this kind of work and it’s my job to know how to do these types of things. But even <em>I’m</em> surprised and self-impressed at how significant that speedup is. That’s a <em>14 thousand times</em> speedup.</p>
+
+ <p>This script used to take so long that it had to save its output to disk and be manually checked by a scientist before proceeding. Now you can compute it in the blink of an eye. This is a computation that we have to do hundreds of times, and this saves us days to weeks of computation time. And it increases the ability to interact with the system, helping us to get more value out of our scientists’ time… they’re not sitting around waiting for a computation to finish. It just does it.</p>
+
+ <p>I should emphasize that these epic performance improvements come without buying any larger computer systems, no parallelization or increase in complexity… in fact the code for the faster algorithm is actually simpler and more reusable! It’s pretty much an all around win, just by reading the code and having some knowledge of computational complexity.</p>
+
+ <p>tldr; Computer Science, For The Win.</p>
+
+ <hr/>
+
+ <hr/>
+
+
+
+
+
+ <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
+ <a href="http://disqus.com" class="dsq-brlink">blog comments powered by </a>
+
+
+
+
+ </div>
+
+ </div>
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_cornucopia.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_cornucopia.xml
new file mode 100644
index 000000000..57935e189
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_cornucopia.xml
@@ -0,0 +1,2446 @@
+
+
+
+ tag:blogger.com,1999:blog-8354057230547055221
+ 2017-03-05T14:35:26.861+01:00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cornucopia?
+ Evig tillväxt i en ändlig värld?
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+ Blogger
+ 12026
+ 1
+ 25
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-2490656752632862163
+ 2017-03-05T14:34:00.002+01:00
+ 2017-03-05T14:35:26.899+01:00
+
+
+
+
+ Tredje månaden med överhettad svensk ekonomi - tydlig säljsignal för börsen
+ För tredje månaden på raken ligger Konjunkturinsitutets barometerindikator ("konjunkturbarometern") kvar i överhettat läge. Det råder alltså en klart och tydligt långsiktig säljsignal i enlighet med konjunkturmodellen.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-hD_mqKJx-XY/WLwTIKSEt6I/AAAAAAAAqfI/sztWEjwSYAoN22y_YfnZ-yotKjQsypZHACLcB/s1600/konj.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="396" src="https://1.bp.blogspot.com/-hD_mqKJx-XY/WLwTIKSEt6I/AAAAAAAAqfI/sztWEjwSYAoN22y_YfnZ-yotKjQsypZHACLcB/s640/konj.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">OMXS30 i rött, konjunkturbarometern i rött.</td></tr></tbody></table><a name='more'></a>Börsen är nu dessutom på en lokal topp vilket bara stärker att det är dags att gå ur. Det finns kanske lite uppsida till, men framöver är det försämrad konjunktur som gäller, <i>inklusive i alla prognoser</i>, och med det kommer den överhettade svenska ekonomin vika.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-ecacsrU5mMk/WLwTeQunSjI/AAAAAAAAqfM/ogJP-hDTJbQxMQ3aSXB8sncCIL5U8FRkgCLcB/s1600/omxs30.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="396" src="https://1.bp.blogspot.com/-ecacsrU5mMk/WLwTeQunSjI/AAAAAAAAqfM/ogJP-hDTJbQxMQ3aSXB8sncCIL5U8FRkgCLcB/s640/omxs30.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Dagschart OMXS30.</td></tr></tbody></table>Värt att notera är att börsen antagligen inte kommer vända ner <i>nu</i>. Men går man ur på grund av konjunkturläget och inväntar att det är mörkt, armod, varnagel och tandagnisslan land och rike runt så kommer man vinna på det. Endast den oerfarne försöker pricka börstoppen exakt.<br /><div><br /></div><div>Ännu en indikator är att allmänheten tydligen rusar in i aktiefonder just nu. Kort sagt säljer de lite kunnigare institutionella investerarna och allmänheten får i sedvanlig ordning sitta med Svarte Petter.<br /><br /><i>När alla är överpositiva är det dags att sälja. Svårare än så är det inte.</i></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 0
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-3344699881755828202
+ 2017-03-04T16:01:00.000+01:00
+ 2017-03-04T16:19:55.914+01:00
+
+
+
+
+
+
+
+
+
+
+
+
+ Numerär är inte allt i strid
+ Det svenska försvaret kritiseras ofta för att ha för <i>låga siffror</i>, för liten numerär<i>. </i>Men all erfarenhet visar att en numerärt underlägsen sida kan besegra en överlägsen motståndare. Avgörande är faktorer som kompetens, övning, utbildning, teknologi, stridsvilja och kanske framför allt <i>ledarskap</i> och <i>krigskonst</i>.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-zWcUDCjBsYo/WLqeYLz3vvI/AAAAAAAAqec/BvUTpLG55d8dULvPcMZW7oATgyX2UBtqACLcB/s1600/US_Navy_030402-N-5362A-004_U.S._Army_Sgt._Mark_Phiffer_stands_guard_duty_near_a_burning_oil_well_in_the_Rumaylah_Oil_Fields_in_Southern_Iraq.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="420" src="https://1.bp.blogspot.com/-zWcUDCjBsYo/WLqeYLz3vvI/AAAAAAAAqec/BvUTpLG55d8dULvPcMZW7oATgyX2UBtqACLcB/s640/US_Navy_030402-N-5362A-004_U.S._Army_Sgt._Mark_Phiffer_stands_guard_duty_near_a_burning_oil_well_in_the_Rumaylah_Oil_Fields_in_Southern_Iraq.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Från <i>Operation Iraqi Freedom</i> under Irakkriget 2003.</td></tr></tbody></table><a name='more'></a><div>Det brukar sägas att en angripare behöver vara <i>minst</i> tre gånger så stark som försvararen, men motexemplen på detta genom världshistorien är väldigt många. Jag kommer här fokusera på någorlunda modern tid för någraexempel.</div><div><br /></div><div>Avgörande är inte numerären. Numerärt överlägsna värnpliktiga kan besegras i grunden av yrkessoldater, trots att de värnpliktiga har haft månader på sig att genomföra fältarbeten och försvarar sig. <i>Utbildning, övning och stridsvilja</i> - <i>kompetens</i> - är tillsammans med <i>ledarskap</i> och <i>krigskonst </i>ofta avgörande.</div><div><br /></div><div>En numerärt underlägsen styrka kan fortfarande segra, även om man anfaller. Man måste exempelvis inte anfalla överallt samtidigt och det är styrkeförhållandena <i>där man faktiskt strider</i> som är avgörande. En angripare har fördelen att <i>välja sina strider</i>, dvs var man anfaller. Man ska anfalla där motståndaren är som svagast och inget annat, samt kan med små medel binda upp motståndarens större styrkor på annan plats. Något von Clausewitz hustru publicerade i hans bok <i>Om kriget</i> redan år 1832.<br /><blockquote class="tr_bq"><i>”Allmänna principer för offensiv. För en attack måste man välja en punkt i fiendens position och anfalla den med överlägsen styrka, lämnandes hans övriga styrkor i osäkerhet men uppbundna. Detta är det enda sätt man kan använda en likvärdig eller svagare styrka med övertag och därmed med en chans att lyckas. Desto svagare man är, desto färre trupper skall användas för att binda upp fienden på icke avgörande platser, för att vara så stark som möjligt där avgörandet skall ske.” - </i>Carl von Clausewitz, <i>Om kriget</i>, 1832<i> - </i>min egen översättning från <a href="http://clk.tradedoubler.com/click?p=21&a=1559424&g=16159304&url=http://www.adlibris.com/se/bok/midvintermorker-9789174752007"><i>Midvintermörker</i></a>, kapitel <i>Valdemar Atterdag.</i></blockquote><b>Man anfaller givetvis inte om man inte anser sig kunna vinna - det är den offensiva sidans fördel och initiativförmåga. Anfallaren väljer sina strider, det gör inte den som försvarar. Detta innebär att den som inleder en konflikt och angrepp oftast, åtminstone initialt, segrar och når sina mål - <i>annars hade man inte valt att anfalla.</i></b></div><div><div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: -webkit-standard; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"></div><br /><div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: -webkit-standard; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><div style="margin: 0px;">Låt oss titta på några exempel. Alla siffror är från Wikipedia.</div></div><br /></div><div>Ett exempel är förstås Falklandskriget, där man i liten skala kan titta på <i>slaget vid Goose Green</i>.</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-jXVp5L9nisY/WLqfzSJLNDI/AAAAAAAAqeo/4w3Lf5OobSIbZ27HFzBMMxPjnAUiSnFZQCLcB/s1600/The_Falklands_Conflict%252C_April_-_June_1982_FKD267.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="444" src="https://4.bp.blogspot.com/-jXVp5L9nisY/WLqfzSJLNDI/AAAAAAAAqeo/4w3Lf5OobSIbZ27HFzBMMxPjnAUiSnFZQCLcB/s640/The_Falklands_Conflict%252C_April_-_June_1982_FKD267.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Juliet-kompaniet vid 42 Commando, Royal Marines anländer till Goose Green i slagets slutfas.</td></tr></tbody></table><div>De värnpliktiga argentinarna hade i flera månader ockuperat Falklandsöarna och kunnat gräva ner sig i sina försvarsställningar.<br /><br />Vid Darwin och Goose Green genomförde brittiska fallskärmsjägare ett frontalanfall <i>till fots</i> mot de nedgrävda argentinarna. Britterna var 690 man, men argentinarna var numerärt överlägsna med mellan 896 och 1083 man, de flesta värnpliktiga. Arton britter dödades och mellan 45 och 55 argentinare miste livet. I slutändan tillfångatogs 961 argentinare när de efter ett knappt dygns strider gav upp inför den numerärt underlägsna brittiska styrkan.<br /><br />Goose Green visar i sig ensamt det mesta kring numerär kontra kompetens och ledarskap. Visserligen dödades den ursprungliga brittiska befälhavaren, när han själv ledde ett anfall mot ett argentiskt kulsprutenäste, och ersättarens <i>uppdragstaktik</i> sägs av en del varit avgörande för utfallet av slaget.<br /><br />Då anföll ändå britterna baserat på ett felaktigt underrättelseläge och trodde att den försvarande styrkan var avsevärt mindre. Men man kunde anpassa sig och via överlägsen kompetens, stridsvilja och ledarskap nedkämpa en numerärt överlägsen motståndare.<br /><br /><b>Vad gäller Falklandskriget, så utspelade det sig som bekant på ett avsevärt avstånd från Brittiska Öarna. Britterna var alltså övertygade om att de kunde besegra de argentinska värnpliktiga ockupanterna med relativt små brittiska styrkor.</b><br /><br />Vill man titta på lite större konflikter så ser man att anfallssidan ingalunda måste vara överlägsen numerärt, utan att det är andra faktorer som avgör.<br /><br />Irakkriget 2003 hade den angripande amerikanska sidan 380 000 man, varav 192 000 amerikaner. Då ska man ha i minnet att det går någonstans mellan 5-10 amerikanska soldater på <i>funktionsförband</i> per soldat på ett <i>manöverförband</i> och antalet faktiskt stridande amerikaner var betydligt färre. Irak hade 1 142 000 man. Här besegrade angriparen en numerärt tre gånger så stor styrka. Inte tvärt om - att försvararen kan besegra en tre gånger så stark angripare. <b>Även här var man helt övertygade om att man trots dålig numerär med lätthet kunde besegra en numerärt överlägsen motståndare på andra sidan jordklotet.</b><br /><br />I finska fortsättningskriget fick 750 000 finnar och tyskar 650 000 ryssar på reträtt. Visserligen var den finska sidan numerärt marginellt överlägsen, men inte de klassiska tre gånger försvararna, som när 250 000 - 300 000 finnar stoppade det sovjetiska anfallet i Vinterkriget 39-40. Där hade angripande Sovjetunionen en styrka på en miljon man.<br /><br />Under sexdagarskriget 1967 besegrade 264 000 israeler 567 000 egyptier, jordanier och syrier i ett anfall där man erövrade hela Sinai-halvön plus Golanhöjderna och Västbanken. Försvararna var nästan tre gånger så många som angriparna, men det hela var en massiv förlust för framför allt Egypten. Mätt i antalet dödade så dödades upp till 20 gånger så många försvarare som angripare (ca 18 500 kontra 776 - 983 israeler).<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-2vR8CuiRRgw/WLqliGAJE1I/AAAAAAAAqe4/X6kK9Ni7B10xUQLhZz8-a1BUIuv0Fi_BQCLcB/s1600/Bundesarchiv_Bild_146-1972-045-08%252C_Westfeldzug%252C_Rommel_bei_Besprechung_mit_Offizieren.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="426" src="https://3.bp.blogspot.com/-2vR8CuiRRgw/WLqliGAJE1I/AAAAAAAAqe4/X6kK9Ni7B10xUQLhZz8-a1BUIuv0Fi_BQCLcB/s640/Bundesarchiv_Bild_146-1972-045-08%252C_Westfeldzug%252C_Rommel_bei_Besprechung_mit_Offizieren.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Ordergivning med Rommel och <i>spökdivisionen</i>. Det som kan kallas <i>uppdragstaktik</i> tillämpades och Rommel struntade i order från högre ort, utan anpassade sig till läget och tog eget initiativ för att lösa det övergripande uppdraget att besegra motståndaren. Hans pansardivision fick öknamnet <i>spökdivisionen</i>, för att de ryckte fram så fort och långt att de inte längre var i radiokontakt med den tyska ledningen. Rommels och kollegans Guderians <i>initiativförmåga</i> och <i>ledarskap</i> gjorde tillsammans med <i>uppdragstaktik</i> att man fullständigt krossade motståndaren genom att skära de allierades styrkor i två och ringa in bland annat hela brittiska armén, som i princip helt utplånades som stridande förband i samband med evakueringen vid Dunqerque.</td></tr></tbody></table>Vid slaget om Frankrike under andra världskriget 1940 var de angripande tyskarna numerärt jämlika, med 3 300 000 man mot de allierades 3 350 000, men underlägsna numerärt i såväl stridsvagnar och artilleri. Även tekniskt var t ex franska <i>Char B1 bis</i>-stridsvagnen helt överlägsen tyska stridsvagnar i duellsituationer. Men tyskarna valde förstås inte att genomföra sitt huvudanfall där motståndaren var som starkast längs Maginotlinjen (även om man anföll även där för att hålla fransmännen uppbundna - se von Clausewitz ovan). Det tål att upprepas att <i>den som anfaller väljer tid och plats</i>. Likt sexdagarskriget var de allierades förluster mångfaldigt större än de angripande tyskarnas. Ironiskt nog sägs den stridsvagns- och flygbaserade <i>blitzkrieg-</i>tanken varit den franske generalen de Gaulles idé, publicerad 1933, och ska ha inspirera tyske Guderian. Överlägsna teorier är en sak, men det gäller att också få gehör för den och att sedan <i>genomföra</i>.<br /><br /><b>Poängen är att <i>anfallaren väljer sina strider</i> och <i>Sverige måste ha en offensiv förmåga för att anfalla en angripare på vårt eget territorium, </i>samt <i>vältränade och övade förband som är självsäkra nog att ta egna initiativ</i> som en del av landets försvar. Att enbart förlita sig på att <i>värnplikt</i> skulle lösa något är inte bara naivt, det är fördummande.</b><br /><b><br /></b> Det svenska försvarets personal har aldrig varit så bra som den är idag, eftersom vi har yrkessoldater, varav många nu har flera års träning och utbildning, samt många som deltagit i skarpa insatser utomlands. Luckorna i rekryteringen kanske kan fyllas upp med värnpliktiga, men låt oss hoppas att kärnan av yrkesförband kommer bibehållas.<br /><br />Annars kan det i värsta fall gå som vid Goose Green. Oavsett hur bra vi är på att gräva ståvärn så angriparen kan välja att anfalla någon annanstans.<br /><br /><b>Ett anfall mot svenskt territorium kommer bara ske om angriparen är övertygad om att han kommer segra. Ett starkt försvar är därför krigsavhållande. Ett anfall mot Sverige kommer alltid ske där vi är svaga, och det är därför vara nödvändigt att kunna genomföra offensiva insatser mot angriparen i efterhand - vi kommer aldrig kunna försvara hela landets yta mot hypotetiska angrepp.</b><br /><br /><i>Sedan ska man vara medveten om att vår enda möjliga angripare - <b>Ryssland - har riktigt usla värnpliktiga soldater</b>. Riktigt kukiga<sup>1.</sup> faktiskt. Även deras elitförband har under striderna i sydöstra Ukraina och i Syrien visat sig vara ganska kassa även mot Call of Duty-spelande krigsturister och <a href="http://cornucopia.cornubot.se/2016/12/ryssland-utrustar-is-med-vapen.html">förlorade t ex Palmyra och massiva mängder utrustning så fort IS visade lite stridsvilja</a>, även om de kanske är bättre än svenskt hemvärn. Det är också högst tveksamt hur det står till med moral och motivation hos de breda massorna av värnpliktigt rekryterade soldater i den ryska försvarsmakten. <b>Det ryska värnplikts- och militära utbildningsystemet bygger på grupptryck och pennalism, och största risken att dödas som rysk soldat är genom misshandel av sina kamrater och befäl</b>. Visserligen lär sig alltså ryska värnpliktiga att döda, men det handlar om att döda varandra. Mörkertalet är stort men det kan handla om något tusental om året, vilket förstås kallas "olyckor". På högre nivå är ryssarna kompetenta, om än hierarkiska och med dålig känsla för uppdragstaktik och eget initiativ, men i slutändan är det alltid en soldat som måste genomföra. Det finns otaliga redogörelser från sydöstra Ukraina om hur ryska soldater blir helt passiva utan ledning och i princip kan nedkämpas utan att de ens skjuter tillbaka, då de bara hänger och väntar på att någon ska säga till dem att skjuta tillbaka. Den ryska mentaliteten, inte bara i det militära, är att om man inte gör något så har man inte heller gjort något fel.</i><br /><i><br /></i> <i><b>Enbart januari-februari i år har 101 ryssar sökt asyl i Sverige, enligt uppgifter till bloggen mestadels deserterade ryska värnpliktiga, som inte vill riskera att dödas av sina befäl eller kamrater under utbildningen eller senare i sydöstra Ukraina. Siffran är upp från 61 under samma period förra året. 101 på två månader ska också jämföras med 401 asylsökande från Ryssland under hela förra året. Moralen och viljan att dö för sin diktatur och fader Putin hos ryska värnpliktiga lämnar en hel del att önska.</b></i><br /><i><b><br /></b></i> <i>Dock har <a href="http://24-my.info/the-russian-army-is-preparing-for-a-grand-funeral-the-military-buys-a-huge-amount-of-flags-of-the-russian-federation-for-the-decoration-of-coffins/">ryska armén nu beställt 49 000 ryska flaggor</a> som ska användas som svepningar av kistor. Man förbereder sig på massiva förluster, väl medvetna om att det enda man har att komma med är en kötttsunami och en sådan kostar i egna liv.</i><br /><i><br /></i><sup>1. Kuk är på rysk slang (<i>mat</i>) negativt, fitta är positivt. Att vara kukig är att vara dålig, att vara fittig är bra.</sup></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 47
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-781063288764157469
+ 2017-03-04T14:15:00.000+01:00
+ 2017-03-04T14:15:04.719+01:00
+
+
+
+
+
+
+ Endast vetenskapliga rapporter ska beaktas - Ilmar Reepalus vinstrapport kan alltså kasseras
+ Det senaste i Sverige är att endast vetenskapliga rapporter ska beaktas. Det betyder att alla statliga utredningar, rapporter från politiska partier och all journalistik kan kasseras, då dessa inte är vetenskapligt. Det betyder också att Ilmar Reepalus rapport om förbud mot vinster inom välfärdsföretag kan kasseras. Den är nämligen inte vetenskaplig.<br /><div><a name='more'></a><br /></div><div>Grunden är att Myndigheten för samhällsskydd och beredskap gav <a href="http://www.svt.se/nyheter/inrikes/rapportforfattaren-pierre-durrani-var-med-i-muslimska-brodraskapet">muslimen och tidigare medlemmen i Muslimska brödraskapet, fil kand Pierre Durrani</a>, och terrorismforskaren dr Magnus Norell i uppdrag att göra en förstudie kring det av flera muslimska länder (inklusive av Ryssland, som bekant ett land med tiotalet miljoner muslimer) terroriststämplade så kallade Muslimska Brödraskapet. Rapporten har fått kritik av diverse islamister, samt akademiker, för att <i>inte vara vetenskaplig</i>. Norell har bemött kritiken genom att undra vad kritikerna rökt innan de läst rapporten och att alla svar på deras kritik står i rapporten (vilket väcker lite frågor om de alls har läst).</div><div><br /></div><div>MSB påtalar dock att <a href="https://www.msb.se/sv/Om-MSB/Nyheter-och-press/Nyheter/Nyheter-fran-MSB/MSB-om-forstudien-Muslimska-brodraskapet-i-Sverige/">rapporten är en <i>förstudie</i> och inte var avsedd att vara vetenskaplig</a>.</div><div><br /></div><div>Gott så.</div><div><br /></div><div><b>Eftersom nu endast vetenskapliga rapporter ska beaktas kan vi härmed strunta i all journalistik, alla statliga utredningar, alla rapporter från politiska partier och tankesmedjor. Dessa är nämligen inte <i>vetenskap</i>. Dit räknas t ex Ilmar Reepalus utredning om förbud mot vinster i välfärden.</b></div><div><b><br /></b></div><div>Det är förstås ett mycket positivt och välkommet besked att vi kan kassera alla politiska rapporter på grund av deras ovetenskaplighet.</div><div><br /></div><div>Därmed är hela frågan om vinster i välfärden avgjord. </div><div><br /></div><div>Man kan förstås också bortse från <a href="https://www.mynewsdesk.com/se/vardforetagarna/documents/patienttoppen-2016-59743">rapporten <i>Patienttoppen 2016</i>, där 1 148 vårdcentraler betygssats av 109 065 personer</a>. Den visar ju annars att 16 av de 20 bästa vårdcentralerna (enligt patienterna) är privata och att den bästa vårdcentralen i 16 av landets 21 regioner drivs privat.</div><div><br /></div><div>Men som sagt, inte vetenskapligt - <i>var är kontrollgrupperna till de 109 065 respondenterna - var är den vetenskapligt granskade publikationen -</i> så vi kan bortse även från den.</div><div><br /></div><div><b>Så kom ihåg att nästa gång någon politiker uttalar sig eller presenterar något, säg "<i>inte vetenskapligt"</i> så kan man direkt avfärda det hela.</b></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+ 13
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-7841582487980941818
+ 2017-03-04T09:10:00.004+01:00
+ 2017-03-04T09:59:38.830+01:00
+
+
+
+ Vattenbrist i Örebro - kan inte hantera befolkningstillväxten
+ Sedan i höstas råder det vattenbrist i Örebro kommun. Kommunen klarar inte av befolkningstillväxten och dränerar sjöarna man har som vattentäkter. Man uppmanar att spara på vattnet och väntas införa bevattningsförbud (på vintern...). Ändå vill kommunen växa.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td><a href="https://4.bp.blogspot.com/-4X8kttPIPBo/WLpyltMx0-I/AAAAAAAAqeA/08h9Cj5PLaI1FQTvSiKL-ZQZ4e_2W3HwgCLcB/s1600/orebro_fors.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://4.bp.blogspot.com/-4X8kttPIPBo/WLpyltMx0-I/AAAAAAAAqeA/08h9Cj5PLaI1FQTvSiKL-ZQZ4e_2W3HwgCLcB/s640/orebro_fors.JPG" width="640" /></a></td></tr><tr><td class="tr-caption" style="font-size: 12.800000190734863px;">Svartån genom Örebro för ett år sedan.</td></tr></tbody></table><a name='more'></a>Som exempel på desperationen är nu vattenståndet mycket lågt i sjöarna Ölen, Storbrjödekn och Toften, som har avrinning till Svartån, som är kommunens vattentäkt. Dräneringen kommer fortsätta och kommunen lutar sig mot en vattendom från 1600-talet, där den fyra meter djupa sjön Ölen tillåts sänkas med 2.6 meter, dvs till 1.4 meters djup.<br /><br />Nerikes Allehandla skriver om det hela (offline).<br /><br />Kommunens VA-chef varnade redan i november och i december gick kommunen ut med uppmaning till Örebroarna att spara på vattnet.<br /><blockquote class="tr_bq"><i>"I mitten av december sänktes den reda låga sjön Ölen ytterligare en halvmeter, ett medvetet beslut av Örebro kommun. Efter nyår ströps flödet i Svartån ännu mer för att behålla vatten i sjöarna, så vattenförsörjningen är säkrad ytterligare en tid."</i></blockquote>Man förväntar sig nu att Örebro kommun ska införa ett <i>bevattningsförbud mitt i vintern</i>, men beslutet är inte taget än.<br /><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-_wE5tWKleQw/WLp1BgSYxRI/AAAAAAAAqeM/RBeHiyCFD5IEYIFLKhH_W92Ln0OXyce5wCLcB/s1600/orebro.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="171" src="https://1.bp.blogspot.com/-_wE5tWKleQw/WLp1BgSYxRI/AAAAAAAAqeM/RBeHiyCFD5IEYIFLKhH_W92Ln0OXyce5wCLcB/s200/orebro.png" width="200" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Folkmängden i Örebro. Källa: SCB.</td></tr></tbody></table><br />Problemet är att Örebro kommun växer, i den eviga myten om att <i>fler människor är bra och lönsamt</i>. <a href="http://cornucopia.cornubot.se/2017/01/det-finns-ingen-fordel-med-att-bli-fler.html">I verkligheten finns det inga fördelar med att bli fler. Fler personer innebär linjärt mer utgifter inom välfärd</a> där det också saknas skalningsfördelar.<br /><blockquote class="tr_bq"><i>"Speciellt infrastrukturen är till stora delar betald sedan tidigare och därmed mycket billig i drift, liksom tidigare byggda sjukhus, skolor, vårdcentraler och dagis. När detta måste byggas ut blir det dyrt, även om man bokföringsmässigt kan trixa till det.<br />En ökande befolkning är inga supermänniskor som är friska och inte behöver utbildning. Och inom välfärdstjänster finns inga nämnvärda skalfördelar. [...]<br />Pratet om större befolkning skulle rädda ekonomin baserar sig på att man medvetet försämrar välfärden genom att inte skala upp den och hoppas att folket inte ska märka något." - </i>jag</blockquote>Tvärt om råkar man istället ut för kraftigt höjda investeringskrav och naturgivna begränsningar, likt tillgången på vatten.<br /><br />Örebro kommun är landets sjunde mest folkrika kommun. Sedan år 2000 har kommunen ökat med 18% i befolkning, men mängden vatten är förstås konstant. Naturligtvis har inte ökade intäkter från stigande befolkning lagts på att bygga ut vattenförsörjningen. Om det alls är möjligt att få några ytterligare vattendomar - Örebro ligger som bekant i ett jordbrukslandskap.<br /><br /><b>Normalt kanske Örebro klarar sig, men det räcker alltså att det sägs varit dåligt med nederbörd en sommar för att Sveriges sjunde största kommun ska få problem med vattenförsörjningen till vardags.</b><br /><b><br /></b> Nu återstår att se när och om förbudet mot bevattning tas under senvintern i Sveriges sjunde största kommun. I ett av de länder i världen med bäst tillgång till vatten.<br /><br />Sveriges VA-intrastruktur är enormt eftersatt och vi lever på forna investeringar. Ersättningstakten är i storleksordningen 300 år. Det är dock en annan fråga än själva tillgången till vatten. Men även denna är med sina vattendomar dimensionerad för gamla Folkhemssverige med mindre än åtta miljoner invånare. Eller för den delen domar från 1600-talet.<br /><br /><i>Man ska också komma ihåg att det kommunala utjämningssystemet gör att en kommun inte får några vinster på att öka sin befolkning och kommunalskatt - moms, företagsskatter etc går till staten och ökade kommunala skatteintäkter försvinner in i utjämningssystemet. För övrigt samma anledning som gör att Karlshamns kommun inte kommer tjäna något på sina silverpenningar för Nordstream 2 - fler i jobb i kommunen ger inte ökade intäkter när den kommunala utjämningen gjort sitt.</i><br /><div style="text-align: justify;"></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 63
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-9203478174899567827
+ 2017-03-03T14:53:00.003+01:00
+ 2017-03-03T15:09:05.223+01:00
+
+ Fredagsmys: Läser du den här bloggen - du kan vara ett geni!
+ Dags för lite härligt fredagsmys, och denna gång blir det återkoppling på <a href="http://cornucopia.cornubot.se/2017/02/vad-har-du-for-iq.html">senaste enkäten</a>, där 945 av bloggens veckoliga 50 000 - 70 000 läsare gjorde seriösare IQ-test och rapporterade sina resultat. Slutsatsen måste var att <i>om du läser den här bloggen kan du vara ett geni</i>. Eller kraftigt begåvningsbegränsad.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-d-FIls8axyA/WLlxec37a3I/AAAAAAAAqdk/zqoqND9bmtAlzjIFItShl-dAfMNA1puIwCLcB/s1600/iq.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="574" src="https://2.bp.blogspot.com/-d-FIls8axyA/WLlxec37a3I/AAAAAAAAqdk/zqoqND9bmtAlzjIFItShl-dAfMNA1puIwCLcB/s640/iq.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Bloggläsarnas IQ enligt Wechslerskalan, samt allmänhetens fördelning.</td></tr></tbody></table><a name='more'></a>Som synes ovan är bloggens läsare överbegåvade, dvs betydligt mer begåvade än normalt. Endast 13.68% av bloggläsarna är normalbegåvade eller under normalbegåvade, vilket innebär att 86.32% av bloggläsarna är överbegåvade.<br /><div><br /></div><div>Därtill tillhör hela 19.17% den procent av svenskarna som har högst IQ, <i>och kan var genier</i>. Helt fantastiskt. Om du läser det här blogginlägget har du alltså nästan en chans på fem att vara bland den mest intelligenta procenten i Sverige.</div><div><br /></div><div>Dock finns det en viss överrisk att man är <i>kraftigt begåvningsbegränsad</i>, eller som det hette förr - <i>förståndshandikappad</i>. Alltså tillhör de 2% av svenskarna som har lägst IQ. Dock föreslog jag ju att de som röstar på SD med fördel kunde välja 69 eller lägre om de inte orkade göra ett lite seriösare IQ-test, <a href="http://cornucopia.cornubot.se/2017/02/tino-sanandaji-upprepar-sdare-har-lagt.html">vilket kan förklara överrepresenationen av <i>kraftigt begåvningsbegränsade</i></a>.</div><div><br /></div><div>Sedan skulle det kunna vara så att läsarna <a href="http://cornucopia.cornubot.se/2017/02/vad-har-du-for-iq.html">trots uttrycklig uppmaning</a> har rapporterat sin IQ enligt Catellskalan och att siffrorna ovan därmed inte helt stämmer med verkligheten. Inte så begåvat att inte kunna ta till sig enkla instruktioner dock. Likväl så ligger överbegåvningen kvar även med Catell, då normalbegåvning även i den skalan ligger runt 100.</div><div><br /></div><div><i>Eller så är personer som har hög intelligens mer benägna att göra IQ-tester, så de kan lämna svar på en sådan här enkät...</i></div><div><br /></div><div>Men som fredagsmys tar vi alla med oss att bloggläsarna uppenbarligen är <i>skitsmarta</i>. Förklarar varför jag har en begränsad läsekrets. Majoriteten (67.26%) av läsarna säger sig tillhöra de 9% smartaste i Sverige, och om det är vad jag tilltalar med mina skriverier så blir det förstås svårt att nå ut till de breda lagren.</div><div><br /></div><div>Så trevligt fredagsmys på er! </div><div><br /></div><div><i>Vilket tal följer på denna talserie: 1 16 35 54 73</i></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 66
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-1287963908043040379
+ 2017-03-03T12:50:00.000+01:00
+ 2017-03-03T12:50:51.917+01:00
+
+
+
+
+
+
+
+ Är det smart att investera i två fastighetsmarknader?
+ <i>Detta inlägg är sponsrat av <a href="https://www.kameo.se/">Kameo</a>.</i><br /><i><br /></i>Det finns stora skillnader mellan bostadsmarknaderna i Sverige och Norge enligt Kameo, som erbjuder investerare att till hög ränta finansiera bostadsprojekt i de två grannländerna. Man har just nu <a href="https://www.kameo.se/Marknadsplats/9-5-raenta.-Vi-finansierar-byggnation-av-tvaa-bostadsfastigheter-tillsammans">ett projekt i Oslo till 9.5% ränta</a> och ett <a href="https://www.kameo.se/Marknadsplats/7-raenta-Vi-finansierar-renoveringen-av-en-fastighet-i-Goeteborg-tillsammans">projekt i Göteborg till 7.0% ränta</a>. Samtidigt har nu utvandringsvågen från Sverige till Norge vänt och Sverige ser ut att få nettoinvandring av svenskar från Norge för första gången sedan början av 2000-talet.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-fv30XILxjoU/WLlR6Zs-MMI/AAAAAAAAqdU/lLmmoNGKYnw_BdoOEKgPnxoazbKUygaogCLcB/s1600/IMG_1362.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://1.bp.blogspot.com/-fv30XILxjoU/WLlR6Zs-MMI/AAAAAAAAqdU/lLmmoNGKYnw_BdoOEKgPnxoazbKUygaogCLcB/s640/IMG_1362.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Oslo från Holmenkollen.</td></tr></tbody></table><br /><a name='more'></a>Som jag skrivit om tidigare är Norges bostadsmarknad i stort sett <i>fungerande</i>, till skillnad mot den svenska.<br /><br />En avgörande skillnad är att man i Norge <i>äger sin lägenhet</i>, medan svenskarna via bostadsrätter bara äger <i>rätten att bo</i>. Det betyder att norrmännen fritt kan hyra ut sina lägenheter, vilket leder till en fungerande bostadsmarknad med tusentals konkurrerande hyresvärdar istället för enstaka lokala kommunalt ägda oligopol som i Sverige.<br /><br />Både bostadsmarknaden i Norge och Sverige är dock heta, även om det är billigare med bostäder i Oslo än i Stockholm. Bidragande orsaker är enligt Kameo bostadsbristen, samt skattefördelar med bostadsägande. Snittpriser i Stockholm på ca 94 000:- SEK per m2 är högre än de motsvarande 75 000:- SEK per m2 som gäller i Oslo.<br /><br />Bostadspriserna stiger just nu snabbare i Norge än i Sverige, vilket förstås leder till att det byggs mer. Här kommer Kameo in och kan finansiera de topplån, som bankerna kräver egen finansiering på, eller för den delen hela projekt via sin <i>crowdfunding.</i><br /><br />Svenskar börjar nu flytta tillbaka från Norge <a href="http://e24.no/jobb/arbeidsliv/naa-reiser-svenskene-hjem/23663959">rapporterar norska E24</a>, och för första gångens sedan början av 2000-talet flyttar fler svenskar från Norge än till.<br /><br />Kameo lanserar snart en plattform för både svenska och norska fastighetslån, men man kan alltså redan idag vara med och <a href="https://www.kameo.se/Marknadsplats/9-5-raenta.-Vi-finansierar-byggnation-av-tvaa-bostadsfastigheter-tillsammans">till en ränta på 9.5% vara med och finansiera norska bostadsprojekt</a>. Det kommer framöver bli betydligt fler projekt att investera och beroende på riskprofil kommer man alltså kunna välja mellan Sverige eller Norge. Föredrar man Sverige finns <a href="https://www.kameo.se/Marknadsplats/7-raenta-Vi-finansierar-renoveringen-av-en-fastighet-i-Goeteborg-tillsammans">ett projekt i Göteborg med 7.0% i ränta</a>.<br /><joakim proad.se=""><lars wilderang.se=""><vanja kameo.se=""><br /></vanja></lars></joakim><joakim proad.se=""><lars wilderang.se=""><vanja kameo.se="">Det finns förstås de sedvanliga riskerna med denna typ av investeringar. Med investeringar i Norge tillkommer valutarisken, men på medellång till lång sikt är NOK och SEK stabila mot varandra, eller det som Kameos Sebastian Harung kallar <i>skandinaviska kronor.</i></vanja></lars></joakim><br /><joakim proad.se=""><lars wilderang.se=""><vanja kameo.se=""><i><br /></i></vanja></lars></joakim><a href="http://blogg.kameo.se/stockholm-vs-oslo-vilken-bostadsmarknad-ar-hetast/">Ni kan läsa mer om en jämförelse mellan den norska och svenska bostadsmarknaden på Kameos blogg</a>.<br /><joakim proad.se=""><lars wilderang.se=""><vanja kameo.se=""> </vanja></lars></joakim><br /><joakim proad.se=""><lars wilderang.se=""><vanja kameo.se=""><i>Detta inlägg är sponsrat av <a href="https://www.kameo.se/">Kameo</a>.</i></vanja></lars></joakim><br /><joakim proad.se=""><lars wilderang.se=""><vanja kameo.se=""><br /></vanja></lars></joakim>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 10
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-5926830160295157511
+ 2017-03-03T10:33:00.000+01:00
+ 2017-03-03T10:33:12.492+01:00
+
+
+
+
+
+
+
+ Norska PTS rekommenderar 700 Mhz-bandet till kommersiella aktörer - med rätt för krisbruk
+ Norges motsvarighet till PTS rekommenderar likt svenske Patrik Fältström att 700 Mhz-bandet går till civila mobiloperatörer. Dessa ska dock ge kris- och beredskapsmyndigheter möjlighet att bruka samtliga nät. Ett eget nät kostar åtta gånger så mycket som att nyttja fyra kommersiella nät med bättre redundans och täckning.<br /><div style="text-align: justify;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-BOb04MMlud4/WLkk776n1tI/AAAAAAAAqdA/BL2DNlmLlvYOafUwGZ-NrmNdVzvD98j7QCLcB/s1600/norge_oslo_radhus.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://1.bp.blogspot.com/-BOb04MMlud4/WLkk776n1tI/AAAAAAAAqdA/BL2DNlmLlvYOafUwGZ-NrmNdVzvD98j7QCLcB/s640/norge_oslo_radhus.jpg" width="640" /></a></div><div><a name='more'></a>Norska Nasjonal Kommunikationsmyndihet, NKOM, motsvarigheten till den svenska Post- och Telestyrelsen, PTS, rekommenderar alltså att 700 Mhz-banden släpps till de kommersiella mobiloperatörerna. Dessa ska dock ge kris- och beredskapsmyndigheter tillgång till näten.<br /><br />Detta är alltså <a href="http://cornucopia.cornubot.se/2017/02/patrik-falstrom-bygg-inte-ett-eget.html">helt i linje med Patrik Fältströms förslag</a>, och kommer ge betydligt bättre täckning till avsevärt lägre pris för krisberedskapen.</div><br /><a href="http://www.nkom.no/aktuelt/nyheter/_attachment/27620?_download=true&_ts=15a7fd5fdd8">NKOM skriver (PDF)</a>:<br /><blockquote class="tr_bq"><i>"Frekvensbåndene 703-733 MHz og 758-788 MHz refereres ofte til som dupleksbåndene i 700 MHz båndet, og de vil støttes i LTE-nettverksutstyr og brukerterminaler over hele verden. Dette er derfor attraktive frekvenser med stor verdi for flere aktører. Hovedproblemstillingen i denne analysen er hvordan disse frekvensene kan anvendes på en måte som gir mest effektiv utnyttelse av frekvensressursene og er samfunnsøkonomisk mest gunstig. En viktig del av denne vurderingen er hvordan nød- og beredskapsbrukeres behov for mobil bredbåndskommunikasjon kan ivaretas i ulike løsningsmodeller. <b>Etter en samlet vurdering er det vår anbefaling at alle frekvensressursene i det aktuelle båndet gjøres tilgjengelige for offentlige mobilnett, men slik at mobiloperatører som tildelesfrekvenser samtidig pålegges å legge til rette for nød- og beredskapsbrukeres behov."</b></i></blockquote><a href="http://www.nkom.no/aktuelt/nyheter/samfunns%C3%B8konomisk-analyse-av-700-mhz-b%C3%A5ndet">Något kortare står det på hemsidan</a>:<br /><blockquote class="tr_bq"><i>"En sentral del av Nkoms vurderinger vil omhandle nød- og beredskapssektorens og Forsvarets behov for mobile bredbåndtjenester<b>. Den samfunnsøkonomiske analysen anbefaler å legge til rette for en løsning der disse behovene ivaretas i de offentlige mobilnettene.</b>"</i></blockquote><b>Kort sagt: <i>Den samhällsekonomiska analysen är att kris- och beredskapsbehoven tas till vara i de offentliga mobilnäten.</i> </b><br /><b><br /></b>Det finns också siffror i rapporten, på skillnaden i pris. Ett separat nät för kriskommunikation beräknas kosta 27.7 miljarder NOK i totalkostnad. Om man använder de offentliga näten beräknas kostnaden till 3.5 miljarder NOK (sidan 4 i ovan länkade PDF).<br /><br /><b>Ett eget nät är alltså åtta gånger så dyrt.</b><br /><br />Dessutom kommer det alternativet vara bättre eller lika bra på på täckning, tillgänglighet, robusthet, funktionalitet och framtidssäkring som att driva ett eget nät. Enda skillnaden till fördel för eget nät ligger i viss ökad säkerhet (sidan 5 i PDF:en). <i>Vad nu säkerhet är värt om nätet inte har täckning - fyra operatörer kommer garanterat ge bättre täckning tillsammans än en operatör.</i><br /><br /><b>Sammantaget är det alltså billigare och bättre att använda prioriterad trafik i de offentliga näten än att bygga själv. Därmed kan vi vara säkra på att Sverige i sedvanlig ordning väljer den sämsta lösningen - åtta gånger dyrare och sämre.</b>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 9
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-2914460029146726059
+ 2017-03-03T08:48:00.001+01:00
+ 2017-03-03T08:48:08.473+01:00
+
+
+
+
+ Statens överskott endast 10 miljarder - sparande på skattekonto förklaringen
+ Statens överskott 2016 var inte alls 60 miljarder enligt finansutskottets Jan Ericson (m). 50 miljarder av "överskottet" beror på att företag och privatpersoner använde skattekontot som bank. Nu har räntan satts till noll och pengarna förväntas strömma ut från skattekontot.<br /><div style="text-align: justify;"></div><div><a name='more'></a><br />Skattekontot har på grund av tidigare lagstiftning erbjudit en för ränteläget hög och skattefri ränta. Företag och privatpersoner har därför deponerat likvider på skattekontot, <i>vilket är förklaringen till statens bokföringsmässiga överskott under 2016. </i><br /><i><br /></i> <b>Av statens överskott på 60 miljarder beror 50 miljarder av sparande på skattekonto, som i själva verket är en skuld staten har till medborgarna.</b><br /><br /></div><div><a href="http://www.ericsoniubbhult.se/">Jan Ericson (m), ledamot av finansutskottet i riksdagen, skriver på sin blogg</a>:</div><div><blockquote class="tr_bq"><i>"[H]ela statens överskott beror på att skattebetalarna använt Skattekontot som bank. Det är inte riktiga skatteintäkter som staten får behålla. Nu har regeringen dessutom beslutat att sätta räntan till noll, och därmed förväntas överlikviditeten på skattekontot minska igen, och Riksgälden spår att 2017 blir betydligt sämre. "Underskottet i statsbudgeten väntas bli 20 miljarder kronor 2017" skriver man i sitt pressmeddelande."</i></blockquote>Siffrorna kommer bland annat från <a href="https://www.riksgalden.se/sv/For-investerare/Aktuellt/Nyheter-och-pressmeddelanden/Pressmeddelande/2017/Lagre-underskott-for-staten-2017-ger-minskad-upplaning/">Riksgäldens pressmeddelande i januari</a>.</div><div><blockquote class="tr_bq"><i>"Tolkningen av statsfinanserna försvåras fortsatt av de överinsättningar som finns på skattekontot. Riksgäldens bedömning är att de i dag uppgår till cirka 50 miljarder kronor, vilket är samma bedömning som i oktober. Detta innebär att både Riksgäldens lånebehov och den redovisade statsskulden blir lägre än vad de skulle varit utan överinsättningarna på skattekontot."</i></blockquote><b>Riksgälden förväntar sig nu ett <i>underskott</i> på 20 miljarder kronor för 2017, eller 80 miljarder i skillnad mot de felaktiga siffror som regeringen slänger sig med för 2016.</b><br /></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+ 32
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-4090588541343199995
+ 2017-03-02T21:51:00.000+01:00
+ 2017-03-02T21:54:53.141+01:00
+
+
+
+
+ Läs: Patrik Oksanen exponerar SVR och RISS operationer mot Sverige
+ Patrik Oksanen har i en massiv <i>tour de force</i> exponerat en av den ryska utländska underrättelsetjänsten SVR och dess informationskrigsdel RISS operationer mot Sverige. Detta är obligatorisk läsning och inkluderar hur Vänsterpartiets ledamot i inte bara försvarsutskottet och försvarsberedningen utan även det svenska kontraspionagets politiska insynsråd anser att SVR har större rätt att finnas i Sverige än Säpo.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-B5Xqt3_JLtQ/WLiD6c8CF3I/AAAAAAAAqcw/84l8GCPOysgunY_92GaQtb10-7YT_z85ACLcB/s1600/personer_patrik_oksanen.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://3.bp.blogspot.com/-B5Xqt3_JLtQ/WLiD6c8CF3I/AAAAAAAAqcw/84l8GCPOysgunY_92GaQtb10-7YT_z85ACLcB/s640/personer_patrik_oksanen.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Patrik Oksanen.</td></tr></tbody></table><a name='more'></a>Det finns inte så mycket att anmärka på <a href="http://www.helahalsingland.se/opinion/ledare/stig-henrikssons-v-markliga-omsorg-om-rysk-underrattelsetjanst">Oksanens ledartext, annat än att det är en lång och obligatorisk läsning</a> som skildrar hur SVR/RISS alltså bedriver sk <i>reflexiv kontroll</i> rätt in i försvarsutskottet och även kontraspionaget Säpos politiska insynsråd.<br /><div><br /></div><div>Anmärkningsvärt är att Vänsterpartiets Stig Henriksson (v) alltså anser att Säpo inte får närvara i Sverige, men väl ryska underrättelsetjänsten SVR och dess informationskrigsdel RISS. </div><div><br /></div><div><b>Dessutom är det nu dokumenterat att Stig Henriksson öppet talar om vad som diskuterats i Säpos insynsråd och alltså publikt diskuterar vad svenskt kontraspionage sysslar med.</b><br /><div><blockquote class="tr_bq"><i>"Och det är på Sveavägen 41 som Stig Henriksson, riksdagsledamot för Vänsterpartiet, ledamot i Säpos insynsråd, i en direktsändning bekräftar uppgifterna att den som Säpo syftat på i intervjun med DN är just chefen för RISS:s rådgivargrupp, Vladimir Kozin."</i></blockquote></div><div><div><a href="http://www.helahalsingland.se/opinion/ledare/stig-henrikssons-v-markliga-omsorg-om-rysk-underrattelsetjanst">Ni hittar alltså texten här</a>. Obligatorisk läsning!<br /><br />Under kalla kriget hölls Vänsterpartiet på mils avstånd från försvarsutskott etc. Kanske dags att överväga detta igen. Det är inte så konstigt att Försvarsmakten är ovilliga att informera försvarsutskottet om saker av hemlig natur, vilket gör att utskottet får problem att fatta rätt beslut.</div></div></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 49
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-676086801069462893
+ 2017-03-02T14:16:00.000+01:00
+ 2017-03-02T14:16:02.561+01:00
+
+
+
+ USA:s Constant Phoenix spanade efter strålning utanför Kaliningrad
+ Det ena amerikanska Boeing WC-135C <i>Constant Phoneix</i> spanade igår efter strålning utanför den Ryska Federationens exklav i Königsberg<sup>1.</sup> vid Östersjön. Detta efter att <a href="http://cornucopia.cornubot.se/2017/02/constant-phoenix-soker-av-barents-hav.html">tidigare spanat efter strålning vid norska gränsen mot Ryssland</a> och Barents Hav.<br /><div style="text-align: justify;"></div><div><blockquote class="twitter-tweet" data-lang="en"><div dir="ltr" lang="en">West of <a href="https://twitter.com/hashtag/Kaliningrad?src=hash">#Kaliningrad</a> over the Baltic Sea <br /><br />🇺🇸 USAF RC135W 62-4138 ABIL087 <a href="https://t.co/etRAbbCQTm">pic.twitter.com/etRAbbCQTm</a></div>— CivMilAir ✈ 🚁 (@CivMilAir) <a href="https://twitter.com/CivMilAir/status/836988425467281410">March 1, 2017</a></blockquote><script async="" charset="utf-8" src="//platform.twitter.com/widgets.js"></script></div><div><a name='more'></a>Officiellt heter det fortfarande att WC-135C <i>Constant Phoenix</i> är i Europa för att mäta upp en normalbild. Samtidigt har de första två flygningarna varit riktade mot ryska gränsen mot svenska grannländer som Norge eller Polen.</div><div><br /></div><div>Man kan bara spekulera i hur känsliga instrumenten ombord på flygplanet är - kan det t ex detektera närvaron av kärnvapen? Det känns högst tveksamt, då dessa normalt finns i skyddade lager, men det är möjligt att <i>flytt</i> av kärnvapen i det öppna, t ex vid lastning på vapenbärare eller omgruppering, skulle kunna ge spår av joniserande strålning. Detta känns dock osannolikt.</div><div><br /></div><div><i>Constant Phoenix</i> närvaro i Europa har kopplats till upptäckten av jod-131, men med tanke på ämnets halveringstid finns det knappast kvar något att mäta just nu.</div><div><br /></div><div><b>En annan hypotes är att <a href="http://cornucopia.cornubot.se/2017/02/har-ryssland-brutit-mot.html">spana efter spår av kärnvapenprov</a>, som ju släpper ut jod-131, men dessa sker inte i Königsberg. Att flyga specifikt till gränsen till Königsberg handlar <i>specifikt</i> om att mäta någon form av rysk kärnvapenrelaterad aktivitet. Hade man bara viljat ha ett normalläge hade man inte <i>enbart</i> spanat av vid gränsen till Königsberg respektive rysk-norska gränsen tidigare.</b><br /><b><br /></b>Därtill flög man alltså an mot den ryska örlogs- och militärbasen vid Baltijsk och inte inne över Polens territorium för att komma närmare andra baseringar i Kaliningrad. Mätningen framstår därmed som inriktad mot främst flottan.</div><div><br />Ryssland har ett antal kärnvapenlager i Königsbergexklaven, bedömt främst avsett för taktiskt bruk, t ex till Iskanderrobotar, eller som kryssningsrobotar eller bomber på attackflyg. Några strategiska kärnvapen finns inte stationerade i exklaven, annat än teoretiskt ombord på kryssningsrobotutrustade örlogsfartyg, likt de Kalibr-bestyckade korvetter som nyligen omgrupperades till Östersjön. Man har dock inga strategiska robotubåtar i Östersjön. Taktiska kärnvapengranater ska sedan tidigare vara avrustade av bägge sidor.<br /><br /></div><div><sup>1. Königsberg är oftast känt som Kaliningrad. Ryssland och Kreml pratar ju om att gamla gränser ska gälla, så vi ser alla fram emot att Königsberg lämnas tillbaka till Tyskland. Dock rensade ryssarna Ostpreussen etniskt, så det finns i princip inte en enda tysk kvar. Finns en del intressant att berätta om de som rensades ut, mer om det och ett blogginlägg om besök i området vid senare tillfälle.</sup></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-TKndtlyHhCc/WLgK6xL44UI/AAAAAAAAqcg/YKaPmY4huWoFfeF1NcaJ73QYslN5DPqcACLcB/s1600/DSC_8912.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://1.bp.blogspot.com/-TKndtlyHhCc/WLgK6xL44UI/AAAAAAAAqcg/YKaPmY4huWoFfeF1NcaJ73QYslN5DPqcACLcB/s640/DSC_8912.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Parasiten mistel är mycket vanlig i forna Ostpreussen. Eget foto.</td></tr></tbody></table>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 23
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-397697348304997386
+ 2017-03-02T12:53:00.000+01:00
+ 2017-03-02T12:53:24.059+01:00
+
+
+
+
+
+ Har de svenska marknadsräntorna vänt upp?
+ SBAB höjde i dagarna sin listränta för tvååriga bolån. Man hänvisade till höjda upplåningskostnader (dvs högre räntor på bolåneobligationerna), men har svenska marknadsräntor egentligen vänt upp?<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-w18ETIDH7lo/WLgFcdwK8FI/AAAAAAAAqcQ/M277git1TkoUFT1nsNj2MX2_DOdZP2UZACLcB/s1600/rantor.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="558" src="https://2.bp.blogspot.com/-w18ETIDH7lo/WLgFcdwK8FI/AAAAAAAAqcQ/M277git1TkoUFT1nsNj2MX2_DOdZP2UZACLcB/s640/rantor.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Svenska marknadsräntor under 2016 och 2017. Källa: Sveriges Riksbank.</td></tr></tbody></table><a name='more'></a>För att finansiera bolån med fasta löptider sker <i>upplåning</i>, dvs emitterande av bolåneobligationer. Räntan på dessa styr också räntan mot slutkund. SBAB hävdade att upplåningskostnaden stigit och höjde därför sina oprutade listräntor för tvååriga obligationer.<br /><div><br /></div><div>Som man ser har generellt marknadsräntorna faktiskt stigit sedan i höstas, undantaget den statliga tvååringen. Samtidigt har räntorna fallit tillbaka sedan årsskiftet, för att precis nu ta ett skutt uppåt.</div><div><br /></div><div><b>Min hypotes är att den längre trenden med fallande räntor kan sägas brutits i höstas. Frågan blir om onsdagens skutt uppåt innebär slutet på den rekyl som gällt under delar av januari tills nu?</b></div><div><b><br /></b></div><div>Därmed är inte sagt att det är lönsamt att binda räntan idag. Det kan fortfarande exempelvis ta tre år innan rörlig ränta går över den 5-årsränta du bundit, och givet linjär uppgång kommer du då ändå inte tjäna på bundet lån under en femårsperiod.</div><div><br /></div><div>Marknadsräntorna är fortfarande negativa utom för statliga löptider på över sju år, eller 5-åriga bolåneobligationer. Till och med för tvååriga bostadslån är räntorna negativa, där investerarna alltså är beredda att betala för att få deponera sina medel hos banker som SBAB. Snacka om förtroende för att det inte finns någon svensk bostadsbubbla och att svenskarna kommer kunna betala sina räntor de kommande två åren.</div><div><br /></div><div>I övrigt är det intressant att se hur 5-åriga bolåneobligationer skuggar 10-åriga statsobligationer.</div><div><br /></div><div>Räntan på rörliga lån påverkas inte av obligationsmarknaden, utan av penningmarknaden, där upplåningsräntorna i stort sett följer Riksbankens styrränta reporäntan och tillhörande in- och utlåningsräntor. Inte exakt samma räntor, men det händer exempelvis väldigt lite med STIBOR eller statsskuldväxlar, annat än när Riksbanken ändrar reporäntan. Åtminstone inte mer än att det är ointressant att publicera grafer.</div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 29
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-410400829341017273
+ 2017-03-02T10:53:00.000+01:00
+ 2017-03-02T11:00:08.538+01:00
+
+
+
+
+ Värnplikten: Regeringen riktar bort fokus från behovet av 6.5 miljarder
+ Genom att dagen efter Försvarsmakten och ÖB lämnat sitt budgetunderlag och <a href="http://cornucopia.cornubot.se/2017/02/ob-forsvarsmakten-saknar-65-miljarder.html">konstaterat att det saknas 6.5 miljarder kronor i anslag</a>, så väljer regeringen att återinföra värnpliktsutbildning. Detta sparar inga pengar, men beslutet kommer för att rikta bort uppmärksamheten från Socialdemokraternas och Miljöpartiets ovilja att anslå ytterligare 6.5 miljarder till försvaret för de politiska beslut man redan fattat. Istället kommer vi nu få en okunnig debatt om värnplikt.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-cdz7MAcS0R8/WLfk0QEaSjI/AAAAAAAAqb0/JxA4DJdtAdMqOTKvwiOVLEtHqpB7RTeGQCLcB/s1600/DSC_8514.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://3.bp.blogspot.com/-cdz7MAcS0R8/WLfk0QEaSjI/AAAAAAAAqb0/JxA4DJdtAdMqOTKvwiOVLEtHqpB7RTeGQCLcB/s640/DSC_8514.JPG" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">"Stefan, vi behöver 6.5 miljarder kronor till för att kunna genomföra de beslut ni tagit."<br />"Det kan ni glömma. Här betalar vi inte för den försvarspolitik vi klubbat. Låt oss prata om värnplikt istället!"</td></tr></tbody></table><a name='more'></a>Försvarsmakten behöver <i>minst</i> 6.5 miljarder kronor till för att kunna genomföra den försvarspolitik regering och riksdag beslutat om. Det är ungefär som att regering och riksdag t ex beslutat om sjukförsäkringar, föräldraförsäkringar, flyktingmottagning mm, och när det visar sig bli dyrare än planerat, <b>så skjuter man till pengarna som behövs för att genomföra de politiska besluten</b>.<br /><div><br /></div><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-CTcPthSnKss/WLfmfOzZhUI/AAAAAAAAqcA/bwyRggqVbPgKyKLY0fCRZbUc7JKDuvmpgCLcB/s1600/sakine.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="96" src="https://2.bp.blogspot.com/-CTcPthSnKss/WLfmfOzZhUI/AAAAAAAAqcA/bwyRggqVbPgKyKLY0fCRZbUc7JKDuvmpgCLcB/s320/sakine.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Så här ser vänrpliktsdebatten ut.</td></tr></tbody></table><div>Men Försvarsmakten får inte dessa 6.5 miljarder kronor. För att snabbt ta bort fokus i den mediala debatten klubbar istället minoritetsregeringen igenom ett återinförande av värnpliktsutbildning, väl medvetna om att det kommer leda till en infantil och djupt okunnig debatt kring att ungdomar behöver lära sig bädda sängen och annat rent trams.</div><div><br /></div><div>Det finns bara tre frågor att ta ställning till angående värnplikten.</div><div><br /></div><div><b>Höjer värnpliktsutbildning svensk beredskap? Höjer värnpliktsutbildning krigsdugligheten hos Sveriges krigsförband? Höjer värnpliktsutbildning det svenska försvarets operativa förmåga?</b></div><div><br /></div><div>Svaret på samtliga dessa frågor är <i>nej</i>. Värnpliktsutbildningen sparar och frigör inte ens pengar, då den kommer ske på samma villkor som för frivillig personal. Försvarsmakten säger idag uttryckligen att det inte kommer vara någon skillnad på frivilliga och tvångsrekryterade.</div><div><br /></div><div>Därtill är forna tiders värnpliktssystems infrastruktor och organisation inte längre kvar. </div><div><br /></div><div>Infrastrukturen är borta. Efter GMU:n, när man går in i befattningsutbildning är det <i>bostäder</i> som gäller. Logement finns inte kvar. Istället finns motsvarande lägenheter, ibland delade mellan flera. Detta gäller t ex på övningsfälten där personalhotell upprättats. Efter tjänstedagen är slut är bostaden <i>privat</i>. Inget där någon kan komma och kräva bäddning.</div><div><br /></div><div><b>Den stora ekonomiska vinsten med forna värnplikten låg inte i att soldaterna fick några kronor i timmen i betalt under utbildningen - idag runt 20:- SEK i timmen, en intressant ingångslön att ta med sig i debatten om ingångslöner - utan i <i>grå arbetskraft</i>, som numera är olaglig.</b></div><div><br /></div><div>Dels placerades värnpliktiga som <i>depå- och bevakningssoldater</i>, även känt som <i>malajer</i>, som utförde riktigt arbete som fastighetsskötsel, tvätt, bevakning, sambandstjänst, kontorsarbete mm, medan övriga värnpliktiga lekte krig. Malajerna bar upp försvarets ekonomi. Idag är deras tjänster ersatta med kommersiella underleverantörer till marknadsmässiga priser istället för 2:50 SEK i timmen. Dels användes värnpliktiga till att utföra riktiga jobb i det skarpa försvaret, som radaroperatörer, flygplanstekniker etc, allt till några kronor i timmen i lön. Ingenjörsförbandens värnpliktiga byggde skarpa befästningar och fältarbeten, precis likt man i diktaturen <a href="http://cornucopia.cornubot.se/2017/02/vitryssland-mobiliserar-mot-ost-och.html">Vitryssland nyligen kallat in värnpliktiga för att som slavarbetskraft bygga befästningar mot ryska gränsen</a>. </div><div><br /></div><div>Eftersom grå arbetskraft är avskaffat finns inga ekonomiska vinster med värnplikt. Tvärt om kommer värnplikt utöver den andel av de 4% som ska utbildas varje år att kosta stora belopp när infrastrutkur måste återskapas.</div><div><br /></div><div><b>Det är knappast någon slump att regeringen Löfven dagen efter att Försvarsmakten begärt 6.5 miljarder kronor i extra anslag väljer att rikta bort debatten till värnplikt. Därmed kommer infantiliserade och okunniga debattörer att tro att försvarets ekonomi är löst och helt glömma bort att myndighetschefen igår krävde 6.5 miljarder kronor i tillskott.</b></div><div><br /></div><div><i>Jag gjorde värnpliktsutbildning 1991-92 och en särskild övning befäl 1995. Jag har inget negativt att säga om min egen värnpliktsutbildning, men jag var högt motiverat befäl. Jag togs ut som KB-elev för att bli ställföreträdande plutonchef på pansarskytte, men kompanichefen ansåg efter grundutbildningens gröntjänst att det var slöseri med mina förmågor och jag utbildades istället till kompanistabschef/stabstroppchef/ställföreträdande plutonchef stab- och tross. En mycket givande tjänst med ett antal kvalificerade utbildningsmoment, inklusive att jobba med skarpa C-stridsmedel. Som stabschef </i><i>(aka "pansarattackpärmbärare") </i><i>hade man ansvar för bland annat underrättelsetjänst och säkerhetstjänst, skyddstjänst (ABC/NBC idag CBRN), samband, luftförsvar, samt ledande av stridstrossen. Som stab ingick en stabsgrupp, en skydds- och spaningsgrupp och en pansarbandvagnsgrupp (kompanichefens vagn) i stabsdelarna, men i praktiken turades man om med kvartermästaren att leda hela stridstrossen, inklusive i strid, vilket även inkluderade sjukvårdsgrupp, mekgrupp (idag driftstödsgrupp) och brogrupp. En ställföreträdande kvartermästare tog hand om andra halvan av stab- och trossplutonen, vilket inkluderade kokgrupp och packgrupp, samt ibland brogruppen. </i></div><div><i><br /></i></div><div><i>På min tid gjorde ca 80-90% av alla män i en årskull värnplikten, inklusive vapenfri tjänst vid t ex FRA eller räddningstjänsten, vilket gjorde att värnplikten kunde rättfärdigas. Idag ska högst 4% av en årskull göra värnplikten, vilket gör det hela djupt orättfärdigt.</i></div><div><i><br /></i></div><div><i>Oavsett löser inte värnplikt försvarsmaktens problem, utan kommer istället leda till att debattens fokus ändras från där den borde ligga - <b>ekonomiska anslag och operativ förmåga</b>.</i></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 51
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-8850196980892351504
+ 2017-03-02T07:28:00.000+01:00
+ 2017-03-02T07:44:25.221+01:00
+
+
+
+
+
+ Regeringen beslutar om återinförd tvångsrekrytering till försvaret
+ Enligt mediauppgifter kommer regeringen idag fatta beslut om återinförande av tvångsrekrytering till det militära försvaret, sk <i>värnplikt</i>. 13% av en årskull ska genomföra mönstring och upp till 4% ska förlora ett år av sin livsinkomst och karriär medan övriga 96% slipper detta. Samtidigt är regeringen emot sänkta ingångslöner i andra sektorer, medan man alltså tvångsrekryterar till Sveriges lägst avlönade yrke - soldatyrket. Lönerna är så låga att man inte ens kan rekrytera 4 000 personer om året.<br /><div style="text-align: justify;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-wAZyuqa5VVY/WLe16r3lLyI/AAAAAAAAqbU/6PR-RD-W4N45wrs4NhlJTdkjBE1qZtEkQCLcB/s1600/svfm_p4_42mekbat.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://4.bp.blogspot.com/-wAZyuqa5VVY/WLe16r3lLyI/AAAAAAAAqbU/6PR-RD-W4N45wrs4NhlJTdkjBE1qZtEkQCLcB/s640/svfm_p4_42mekbat.jpg" width="640" /></a></div><div><a name='more'></a>Enligt mediauppgifter (<a href="http://sverigesradio.se/sida/artikel.aspx?programid=83&artikel=6642527">SR</a>) vägrar vägrar regeringen alltså höja lönerna för att göra det samhällsbärande soldatyrket attraktivt. Istället ska de 4000 utbildningsplatser som inte blir fyllda av frivilliga fyllas av tvångsrekryterade ungdomar. I praktiken <i>lönedumpning</i>.</div><div><br /></div><div><b>Det handlar alltså inte om någon upprustning eller utökning av svenskt försvar, utan bara om att slippa höja yrkets löner genom tvångsrekrytering.</b> <b>ÖB är tydlig i gårdagens budgetunderlag att <i>krigsduglighet</i> prioriteras och antalet soldater eller förband kommer inte ökas.</b></div><div><br /></div><div>De tvångsrekryterade kommer få samma utbildningsersättning som frivilliga, så det är inte heller en fråga om att spara pengar. Tvångsrekryterade ska främst ersätta de sk <i>tidvis tjänstgörande</i> (GSS/T), dit det är svårt att rekrytera. Tvångsrekryterade innebär här dock en <i>ökad kostnad</i>, eftersom deras lön vid krigsförbandsövningar (KFÖ) och repetitionsutbildningar är högre än för GSS/T.</div><div><br /></div><div>GSS/T får den låga soldatlönen på KFÖ eller repetitionsutbildningar. De tvångsrekryterade får sin SGI, dvs 80% av 97% av sin lön med ett tak. Med tvångsrekrytering och krigsplacering som sk GSS/K kommer det nu bli ännu svårare att rekrytera GSS/T.</div><div><br /></div><div><b>För att upprätthålla krigsduglighet blir alltså de tvångsrekryterade <i>dyrare</i> än yrkessoldater, och dränerar försvarsekonomin ytterligare om inte regeringen avser att höja anslagen.</b></div><div><b><br /></b></div><div>Regeringen vägrar på andra områden tillåta sk <i>lönedumpning</i> för att få in folk på arbetsmarknaden, men vill alltså inte anslå medel för att betala attraktiva löner för att riskera livet för att försvara Sveriges frihet och självbestämmande. Soldatyrket är ett av de yrken som har lägst lön i landet.</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-96y5F4nFNeg/WLe32bgJ2EI/AAAAAAAAqbk/9MkSjzgtMasFaL1lKJdlqsUZdW77lEm8QCLcB/s1600/loner.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://2.bp.blogspot.com/-96y5F4nFNeg/WLe32bgJ2EI/AAAAAAAAqbk/9MkSjzgtMasFaL1lKJdlqsUZdW77lEm8QCLcB/s640/loner.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Löner i Sverige. Soldatyrket är inringat med rött.</td></tr></tbody></table><div>Ett återinförande av tvångsrekryteringen bör ses som förberedande för att faktiskt utöka svenskt försvar. Eftersom man inte vill betala marknadsmässiga löner så lär det vara mycket svårt att utöka krigsorganisationen ytterligare. </div><div><br /></div><div><b>Det är dock viktigt att förstå att det idag inte finns någon kapacitet att utöka krigsförbanden utan att i så fall säga upp yrkessoldaterna och ersätta deras mycket krigsdugliga förband och mycket hög beredskap med tvångsrekryterade med låg beredskap.</b></div><div><b><br /></b></div><div>Förhoppningen är nu att det ska bli lättare att rekrytera och utbilda officerare framöver, så att man kan skala upp krigsorganisationen, men det kommer ta många år innan man får upp numerären som behövs för att utbilda dessa även vid tvångsrekrytering. Lönerna måste upp oavsett, vilket Sveriges framtida regeringar kommer upptäcka.</div><div><br /></div><div><b>Återigen, ett återinförande av värnplikten innebär inte ett starkare försvar utan ett dyrare försvar, utan att regeringen anslår medel för kostnadsökningarna. Alternativet är att man likt förr inte kallar in till krigsförbandsövningar och repetitionsutbildningar och väljer pappersförsvaret istället för krigsduglighet. Sveriges försvar idag är så litet att <i>krigsduglighet</i> och <i>hög beredskap</i> är helt avgörande för förmågan och man kan inte förlita sig på en köttvägg av forna tiders 100 000-tals värnpliktiga.</b></div><div><b><br /></b></div><div>Det är också djupt orättfärdigt att upp till 4% av svenska ungdomar får sin karriär och livsinkomst fördröjd med ett helt år, och kommer få lägre pension mm på grund av att de är borta från arbetsmarknaden ett extra år. Allt tjafs om att man gör <i>"män av pojkar"</i> eller att <i>"ungdomarna får lära sig hyfs"</i> är rent nonsens, då det dels är väldigt få som omfattas, och dels kommer det vara skötsamma ungdomar med fläckfritt förflutet. Med högst 4% uttag kommer man förstås välja de mest begåvade och lovande ungdomarna, speciellt som det ofta är till tjänster inom funktionförbandens specialförmågor det är svårt att rekrytera. <i>Alla vill bli jägare eller åka stridsvagn, ingen vill bli sambandssoldat. </i>Dessutom ska försvaret försvara Sverige och inte ersätta utebliven uppfostran.</div><div><i><br /></i></div><div><b>Det hade varit önskvärt att återinförd tvångsrekrytering av upp till 4% hade åtföljts av en försvarsskatt på de 96% som inte försvarar eller försvarat Sverige. Låt de som inte själva deltar i Sveriges försvar genom att aldrig varit krigsplacerade betala för försvaret.</b></div><div><b><br /></b></div><div><i>Nu återstår att se när regeringen inför tvångsrekrytering till andra offentliga bristyrken, som t ex lärare. Kom också ihåg att de flesta diktaturer har värnplikt, medan det är betydligt vanligare med yrkesförsvar i våra västerländska demokratier. Regeringens argument mot sänkta ingångslöner för personer som står långt från arbetsmarknaden har med införandet av tvångsrekrytering till försvaret nu fallit.</i></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 74
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-1921162613463663198
+ 2017-03-01T19:07:00.000+01:00
+ 2017-03-01T19:07:13.464+01:00
+
+
+
+
+ Biobränsle ständigt tio år bort - även till flyget
+ Nu pratas det om bioflygbränsle, och likt alla biobränslen ligger det alltid tio år bort. Svensk produktion av tre gånger så dyrt flygbränsle från skogsavfall <i>kan</i> vara redo om tio år. Men vi minns att <a href="http://cornucopia.cornubot.se/2013/04/ivlchalmers-11-26-fornyelsebara.html"><i>inte ett enda</i> av planerade biobränsleprojekt har blivit av</a>. Så vi kommer stå här om tio år och fortfarande ha tio år tills det blir något av biobränsle för flyget.<br /><div style="text-align: justify;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-kHjPjgMaYVY/WLcJ2WmpaaI/AAAAAAAAqbE/CGlKNr7RvmsFmg_oFPxHhSs3JNWvejeIgCLcB/s1600/flyg_air_greenland_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://3.bp.blogspot.com/-kHjPjgMaYVY/WLcJ2WmpaaI/AAAAAAAAqbE/CGlKNr7RvmsFmg_oFPxHhSs3JNWvejeIgCLcB/s640/flyg_air_greenland_2.jpg" width="640" /></a></div><div><a name='more'></a>Biobränslen (flytande dito som ersättning för fordon) i större skala är en ständigt undflyende hägring. Av tidigare <a href="http://cornucopia.cornubot.se/2013/04/ivlchalmers-11-26-fornyelsebara.html">sammanställning över större svenska projekt har inte ett enda blivit av</a>, utan har bara varit fria fantasier:</div><div><blockquote class="tr_bq"><i>"Det konstaterades dock att dessa biobränsleprojekt saknade finansiering och existerade bara i lobbyvärlden, eftersom energipriserna var för låga redan år 2013, när oljan låg ganska stabilt runt 100 USD. Dessutom väntade man på klara politiska riktlinjer, vilket man aldrig fick."</i></blockquote>Det blev inte ens något av <a href="http://cornucopia.cornubot.se/2015/09/goteborg-energis-biogassatsning-skrivs.html">den enda som verkade faktiskt bli något, Göteborg Energis Gobigas</a>.<br /><br />Gisslet för dessa stora projekt är att de aldrig hinner bli klara i tid innan man får en av de återkommande dipperna i oljepriset.<br /><br />Nu pratas det, antagligen desperat, om biobränslen i stor skala till flyget. Den aktuella flygskatten som Sverige ensidigt ska införa hotar nämligen svensk flygtrafik och hobbyprojekten för diverse kommuner som sponsrar trafik till olika flygplatser landet runt, och därför måste man vifta med att det minsann går att flyga på biobränslen. Om tio år, förstås. <a href="http://www.nyteknik.se/fordon/gront-svenskt-bransle-blir-fardigt-om-tio-ar-6827096">Ny Teknik skriver</a>:<br /><blockquote class="tr_bq"><i>"Om allt rullar på kan vi ha en demonstrationsanläggning inom sju till tio år. En fullskalig produktion av jetbränsle – det är mer än tio år innan vi är där.</i><i><br /></i><i>I dag finns inget bioflygbränsle med lignin som råvara som är godkänt för flygtrafik. Så certifieringsprocessen återstår också."</i></blockquote>Som vanligt en väldigt massa <i>om</i>. Biobränsle för flyg kostar idag ungefär tre gånger så mycket som det sinande fossila flygbränslet. Väldigt lite talar för att det blir billigare.<br /><br />Regeringen vill förstås få fram biobränslen och slänger därför en flygskatt på flyget i tron att det magiskt uppenbarar sig biobränslen då. Vad som istället kommer uppenbara sig är att alla internationella flygsträckor från Sverige, undantaget till våra direkta grannländer, kommer försvinna. Allt internationellt flyg framöver, undantaget till grannländerna, kommer gå till Köpenhamn, där man får byta till ett skattebefriat flyg vidare till andra länder.<br /><br />Så kan man fundera på hur många år efter <i>peak oil </i>vi ligger om tio år? Hela frågan om <i>peak oil</i> försvann effektivt under den nuvarande tillfälliga nedgången i oljepriset, men kommer antagligen bli medialt intressant igen när priset når 100 - 150 USD igen framöver.<br /><br />Oavsett har inte billigt flyg någon framtid, så ni kan lika gärna passa på att flyga medan ni kan göra det billigt. Så har ni något att berätta för barnbarnen om.<br /><br /><b><a href="http://cornucopia.cornubot.se/2014/03/de-tre-villfarelserna.html">Kom ihåg ihåg de tre villfarelserna</a>. Bara för att man kan framställa några kubikmeter biobränsle från frityrolja i Kalifornien så betyder det inte att man kan göra det i några volymer som spelar någon som helst roll för samhället.</b></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 44
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-3263617897821515361
+ 2017-03-01T16:14:00.002+01:00
+ 2017-03-01T16:21:08.168+01:00
+
+
+
+ Två vintrar med det smarta hemmet - överskattat och självutplånande
+ Vi fortsätter på dagens tekniktema. Jag har nu haft ett sk <i>smart hem</i> i ungefär ett och ett halvt år, inklusive två mörka vintrar och kan egentligen bara upprepa tidigare slutsatser. Det smarta hemmet är för teknofiler och nördar, men löser inga egentliga problem och är som transparent teknik något man glömmer bort och som sådan alltså är självutplånande. Däremot finns det stora vinster i robotisering <i>av faktiska problem</i>.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-FiQWUvgie9s/WLbZRCcqUfI/AAAAAAAAqa0/d6iAEB56Fj8zMXdL_HYaPfMl18c6YmnyQCLcB/s1600/IMG_2923.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://3.bp.blogspot.com/-FiQWUvgie9s/WLbZRCcqUfI/AAAAAAAAqa0/d6iAEB56Fj8zMXdL_HYaPfMl18c6YmnyQCLcB/s640/IMG_2923.JPG" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Philips Hue "smarta" spotlights. Här färgschema "Söderhavet".</td></tr></tbody></table><a name='more'></a>Det <i>"smarta hemmet"</i> handlar om uppkopplade hushållsfunktioner, som kan styras över Internet eller via appar, och förstås automatiseras. Skillnaden mot vanliga rörelsedetektorer och tidsreläer handlar just om möjligheten till extern styrning med varierande tillhörande <i>programmering</i>, felaktigt kallat <i>intelligens</i> eller <i>smarthet</i>.<br /><div><br /></div><div>I praktiken automatiserar man problem som egentligen inte finns, som att tända en lampa i ett rum. Det tar en tiondels sekund att tända lampan för hand, men att säga till Siri att tända lampan tar sin lilla tid. </div><div><br /></div><div><b>När väl man är nöjd med konfigurationen av sitt <i>smarta hem</i> så blir det i praktiken transparent och inget man tänker på och som sådant inte heller uppskattar, då det <i>smarta hemmet</i> inte löser några existerande problem.</b></div><div><br /></div><div>Utvidgar man däremot begreppet till andra uppkopplade eller robotiserade lösningar med rörliga hushållsrobotar (stationära hushållsrobotar har vi haft länge - tvättmaskiner, diskmaskiner, torktumlare mm), så finns det däremot en del vinster. Med hushållsrobotar får man mer tid över till att jobba istället för att t ex dammsuga eller klippa gräset.</div><div><br /></div><div>Men först en titt på vad som är så <i>smart</i>. </div><div><br /></div><div>Som tillbedjare av <i>Church of S:t Jobs</i> har jag valt <i>Apple Homekit</i> som lösning. Säkerheten ska vara hög, då alla produkter rent av har ett av Apples Homekit-chip i sig just för säkerheten, i bemärkelsen cyberangreppssäkerhet. '</div><div><br /></div><div><i>Detta inlägg berör inte riktiga säkerhetsfunktioner och intrångsskydd (t ex larm med åtgärd (grannar, väktare etc), extra gallergrindar, gästboende när man är bortrest (har djur så hemmet är aldrig tomt när jag är borta), larmcentralkopplad brandvarnare, övervakningskameror, dimgeneratorer (mkt effektivt - kan rekommenderas om man samtidigt har larm med åtgärd - dimman är inte försvunnen förrän åtgärd är på plats och gör hemmet helt ogenomträngligt tills dess), concertinatråd, utbildad vakthund, larmminor (rådjur ställer till det där ibland), snubbeltråd etc), som använder andra lösningar och separata system, som inte kommer beröras i några blogginlägg, ej heller detta.</i></div><div><div><br /></div></div><div>De Homekitprodukter som testats är framför allt Philips <i>Hue</i>-system med styrbar belysning, som kopplas in i form av LED-lampor i befintliga armaturer. Dessa kompletteras med ett antal Homekit-styrda reläer och sensorer från <i>Elgato Eve</i>. </div><div><br /></div><div>Ljusen löser icke-problemet med att behöva tända och släcka själv. Hue-lampor i sovrummet är kopplade till väckarklockeappen på mobilen och tonas upp när det är dags att vakna. Samtidigt slås även ljuset på på olika platser i huset om solen ännu inte gått upp. Lamporna släcks sedan när det är tillräckligt ljust.</div><div><br /></div><div>TV:n har ett Eve-relä, som ser till att den är bortkopplad nattetid.</div><div><br /></div><div>Funktioner som att släcka lamporna utifrån GPS om jag lämnar hus eller gård användes initialt, men är inte uppskattat av övriga hushållet av förklarliga skäl. Istället ges ett manuellt kommando till Siri om huset är tomt när man lämnar, så allt går in i <i>ej hemma</i>-läge.</div><div><br /></div><div>Däremot slås lampor på automatiskt om jag kommer hem (GPS-baserat) och om det sker från skymning och framåt tonas också utebelysningen, som är Hue-baserad - dock endast Hue White, upp maximalt.</div><div><br /></div><div>När man lägger sig släcks allt antingen automatiskt vid en viss tidpunkt, eller på Sirikommandot <i>god natt</i>, vilket släcker eller tonar ner alla lampor i huset. På kvällen efter det är tänkt att man ska sluta jobba (ja, jag vet att jag är skämtsam ibland) byts belysningens färger inomhus om till ett mer avslappnande ljus.</div><div><br /></div><div><b>Fast vid normala rutiner behöver man aldrig röra en lampa, utom där det inte finns Huestöd pga icke kompatibla installationer. Allt tänds och släcks automatiskt vid behov. Man glömmer bort systemets existens och det blir alltså självutplånande. Det går lika bra med en vanlig timer för t ex golvvärme i badrummet.</b></div><div><b><br /></b></div><div>En del saker används i princip inte alls. Det t ex finns ett Everelä på vattenkokaren. Tanken är att ha vattenkokaren fylld med vatten och påslagen, men bortkopplad med relät, och sedan slå på det när man närmar sig hemmet för att ha varmt vatten redo. Eller på morgonen. Används sällan, rent av nästan aldrig. Det är inte speciellt jobbigt att sätta på vatten själv när man vill ha kaffe eller te - <i>man måste ändå fylla på vatten och sätta vattenkokaren och reläet i rätt läge</i>. Det handlar bara om <i>när</i> man förbereder sitt varma vatten - f<i>öre</i> man går och lägger sig eller lämnar hemmet, eller <i>efter </i>man vaknat eller kommer hem. Arbetsinsatsen är den samma och man löser inga problem.</div><div><br /></div><div>Sedan kan det vara kul att göra olika ljussättningar med Huelampornas färgmöjligheter, eller med ett ord till mobilen ställa om huset till partyläge eller filmläge, eller kanske läsbelysning. Men det löser som sagt inga faktiska problem.</div><div><br /></div><div>Överlag rätt oanvändbart. Visst, det är väl skönt att inte behöva programmera om tidreläer för utebelysning i takt med årstiderna.</div><div><br /></div><div>Väderstationen, som inte kör Homekit, utan är Netatmobaserad och ett separat system, är förstås roande om man är en datanörd (data som i faktapunkter, inte som i datorer) som jag, men löser sällan några speciella problem. </div><div><br /></div><div><b>Det som faktiskt är användbart är rörliga hushållsrobotar, som dammsugarrobot, mopprobot och gräsklipparrobot. De löser till skillnad mot det <i>smarta hemmet</i> faktiska problem, eller åtminstone sådant som annars tar bort värdefull arbetstid. </b></div><div><b><br /></b></div><div>Utvärdering av ett och ett halvt år med städrobotar kommer i ett senare inlägg. Sammanfattningsvis kan jag konstatera att jag aldrig har för avsikt att gå tillbaka till manuell damsugning och moppning igen. Det samma gäller gräsklippande. Däremot måste man underhålla robotarna och byta en del slitagedelar, men frånvaron av t ex dammsugarpåsar kompenserar detta kostnadsmässigt.</div><div><br /></div><div><b>Men övrig hemautomation tilltalar antagligen bara en teknofil och nörd, men löser inte några egentliga problem. För de flesta skulle vanliga dumma timers, rörelsedetektorer eller ljusreläer lösa problematiken, men då har man förstås inte någon app att styra dem med. Kort sagt kommer <i>smarta hem</i> knappast vara någon storsäljare idag.</b></div><div><b><br /></b></div><div><a href="http://cornucopia.cornubot.se/2017/01/gartners-hypecykel-ny-teknik-tar-lang.html">Som med all teknik gäller <i>hypecykeln</i> även de smarta hemmen</a>. Smarta hem lever inte upp till någon hype, löser inte några existerande problem. De kommer säkert vara allerstädes närvarande någon gång i framtiden när man hittat <i>vad de faktiskt ska användas till</i>. Men där är vi inte idag. Dagens smarta hem fyller ingen funktion och löser inga problem. <a href="http://cornucopia.cornubot.se/2015/07/fredagsmys-vad-ska-vi-med-smarta-hem.html">Min slutsats från juli 2015 gäller alltså fortfarande</a>. </div><div><br /></div><div>Idag kan man antagligen rent tekniskt göra <i>vad som helst</i> med ett smart hem om leverantörer och kunder ville. Men med tanke på att problemen är icke-existerande och därmed behoven icke-existerande så har inte det smarta hemmet fått något genomslag. Jag kan inte heller se hur det ska få något genomslag i närtid heller, om nu ingen uppfinner en verklig <i>killer app</i>. Och det finns inte idag.</div><div><br /></div><div><i>Tvättroboten (Miele) totalhaverarde nyligen efter 16 års felfri drift, då trumman lossnade och det började ryka lite. Enligt servicetekniker per telefon skulle det kosta lika mycket att byta trumma och lager som att köpa en ny. Vid besök på Mediamarkt för akut inköp av en ny Miele fanns det uppkopplade appstyrda tvättrobotar från t ex LG och Samsung. Bland säljargumenten uppsatta på skyltar över dessa fanns t ex "få en notifiering på din mobil över vad som gått fel"</i>. <i>Öh, nej, jag vill inte ha en tvättrobot där något går fel. Jag vill ha ren tvätt. Så det blev en dum Miele av enklaste modell. Visade sig hantera sju kilo tvätt mot fyra kilo på den gamla, till samma pris som en reparation, så nyinköp gav bättre produkt än reparation. Enda andra skillnaden var en display som visade hur lång tid det är kvar på tvätten. Det behövs inte någon app och Wifiuppkopplng för det. Vad skulle man ha en "smart tvättrobot" till? Starta maskinen via en app? Men man stoppar ju ändå in tvätten för hand och det är inget problem att starta den själv därefter. Fast visst, någon av de uppkopplade tvättrobotarna kunde ge fina grafer som visade var i tvättcykeln din maskin befann sig...</i></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 50
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-6795704712126181336
+ 2017-03-01T11:03:00.001+01:00
+ 2017-03-01T15:18:07.122+01:00
+
+
+
+
+
+
+
+ Prepping: Automatisk Internet-redundans med failover till mobilt bredband
+ Jag har nu på grund av återkommande driftsavbrott för min DSL-uppkoppling, införskaffat automatisk failover till mobilt bredband om den fasta förbindelsen till Internet går ner. Tillsammans med avbrottsfri kraft ger detta goda möjligheter att kunna fortsätta leverera blogguppdateringar även vid infrastrukturstörningar utan att behöva lämna hemmet. Även tillgången till Internet sorterar jag ner under <i>prepping</i>. Jämförande förbindelsetest nedan skvallrar lite om hur mobilt bredband står sig mot DSL på landsbygden, nu när Telia river kopparnäten.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/--Qsf2dTqWgs/WLaU9-9kY9I/AAAAAAAAqZ4/mfbpWzWoEq0lErimUyi3-hZZqHfP4P5oQCLcB/s1600/asus.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="510" src="https://3.bp.blogspot.com/--Qsf2dTqWgs/WLaU9-9kY9I/AAAAAAAAqZ4/mfbpWzWoEq0lErimUyi3-hZZqHfP4P5oQCLcB/s640/asus.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Huvudskärmen för <a href="http://clk.tradedoubler.com/click?p=46&a=1559424&url=https://cdon.se/hemelektronik/asus-4g-ac55u-p36527252">Asus 4G-AC55U</a>. Den fasta WAN-anslutningen är aktiv och det mobila bredbandet står redo att ta över. Notera att uppkopplingen är LTE, dvs 4G och inte 3G.</td></tr></tbody></table><div><a name='more'></a><div style="text-align: justify;"></div>Eftersom mitt fasta bredband slutar att fungera några gånger om året, vilket stör produktionen av blogguppdateringar, så har jag nu införskaffat en <a href="http://clk.tradedoubler.com/click?p=46&a=1559424&url=https://cdon.se/hemelektronik/asus-4g-ac55u-p36527252">Asus 4G-AC55U</a>. Det är en bredbandsrouter med inbyggt 3G/4G (LTE)-modem och WAN-port för uppkoppling mot fast bredband via gigabit ethernet. Efter i mitt fall tio sekunders avbrott på det fasta bredbandet går routern istället över till mobilt "bredband" och sedan tillbaka igen när den fasta uppkopplingen fungerar.<br /><div><br /></div><div>Man upplever en kortare paus i uppkopplingen och i mitt fall sedan en något förändrad hastighet. Lägre nedladdningshastighet med mobilt bredband, men snabbare uppladdning, som delvis kompenserar upplevelsen och även sänker svarstiderna.<br /><div><br /></div><div>Mobilt bredband är förstås ingen långsiktigt hållbar lösning, då jag för över mellan 20 och 100 gigabyte data per dygn normalt. Men det ger en viss redundans och yrkesmässigt är det förstås helt avgörande med en uppkoppling. </div></div><div><br /></div><div>Sedan finns det åtminstone en hel del överföringskapacitet i beredskap. I den sparade potten på mitt mobilabonnemang hos Telia ligger det drygt 80 gigabyte av maximalt 100 och väntar. Med ett extra SIM-kort för data går det att använda i Asusroutern och mobilen samtidigt. Jag har även via något erbjudande från Telia fått ett <i>gratis</i> 20 gigabytes mobilt bredbandsabonnemang med än så länge 40 gig i potten av maximalt 100. Därtill finns ett <i>gratis </i>5 gigabytes mobilt bredbandsabonnemang, där man för 199:- SEK kan fylla på med 100 gigabyte i nödfall. I värsta fall får man successivt byta SIM-kort i routern, och fördelen är också att man förstås kan välja SIM-kort från olika leverantörer. Telia har dock klart bäst täckning där jag bor.</div><div><br /></div><div>Routern har inget eget DSL-modem, utan där används Telias "gratis" (=inbakat i abonnemangskostnaden) DSL-router/modem, som körs i DMZ-läge (http://192.168.1.1/dmz.lp) istället för bryggat läge. Genom att köra i DMZ-läge istället för bryggat får jag fortfarande tillgång till administratörsfunktioerna på Teliaroutern, men bara brandväggsfunktionerna hos Asus-routern används för att skydda övriga nätet. En fördel med frånvaron av DSL-modem och bara en gigabit ethernetport som WAN är att samma uppsättning sömlöst kan flyttas över till fiberuppkopplingen, som kommer senare under året.</div><div><br /></div><div>Routrarna sitter på en liten väggmonterad <a href="https://ad.zanox.com/ppc/?39804462C1841175593&ulp=[[dator-natverk/datortillbehor/ups/apc-es-700-va-ups-p44097?utm_source=zanox_%23%23WebsiteID%23%23&utm_medium=affiliate&utm_content=text&utm_campaign=aff_1_2015]]">APC Back-UPS ES700</a> som avbrottsfri kraft, som vid testkörning visat sig ge ungefär två timmars strömförsörjning och med det Internet. Bärbara datorer idag har upp till tolv timmars batteri och behöver knappast köras på UPS:en. Viktigt är att välja en korrekt dimensionerad UPS, som kan köra på de mycket låga strömförbrukningarna som två routrar ger. Det finns UPS:ar med betydligt mer batteri, men de kräver ofta större förbrukning för att köra.</div><div><br /></div><div>Med 300 W sinusväxelriktare och flera sk <i>fritidsbatterier</i> stående på laddning finns det gott om tid att inom två timmar koppla in reservkraft till den avbrottsfria kraften. Ett fulladdat sådant 75 Ah fritidsbatteri bör kunna köra routrarna i ungefär två dygn, men vid det laget kan det bli nödvändigt att även ladda datorer.</div><div><br /></div><div><b>Mobilt bredband <i>fungerar</i> hyfsat, men är hastigheten kan variera stort beroende på andra brukare. Listade "säljhastigheter" är som bekant helt teoretiska. Största problemet är att man inte likt fast förbindelse har fri överföring. Nedan följer mätningar av skillnaden i överföringskvalitet.</b></div><div><b><br /></b></div><div>Vi börjar med att titta på det mobila bredbandet. Samtliga mätningar har skett med samma nätverksuppsättning och går från en dator över gigabit ethernet till routern, och sedan vidare över Telia DSL 12-30 Mbit/s eller Telia mobilt bredband.</div><div><br /></div><div>Uppkopplingen är LTE, dvs 4G även om hastigheterna mer är 3G i praktiken.</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-m5aYDoQHLcQ/WLaUhiMRa3I/AAAAAAAAqZs/fTBOlCEzliYqyuLgw3xbs4Nn33UP-RcpQCLcB/s1600/mobil_kvalitet.png" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="402" src="https://3.bp.blogspot.com/-m5aYDoQHLcQ/WLaUhiMRa3I/AAAAAAAAqZs/fTBOlCEzliYqyuLgw3xbs4Nn33UP-RcpQCLcB/s640/mobil_kvalitet.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Uppkopplingens kvalitet med tillhörande förkortningar för den intresserade.</td></tr></tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-Vza48wjlsBY/WLaWhQDTI3I/AAAAAAAAqaI/ukC_4dH5IwwhoO3zOgJhVktiXIscLy1agCLcB/s1600/mobilt_ping.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://3.bp.blogspot.com/-Vza48wjlsBY/WLaWhQDTI3I/AAAAAAAAqaI/ukC_4dH5IwwhoO3zOgJhVktiXIscLy1agCLcB/s640/mobilt_ping.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Svarstider från en egen server på Internet. IP-adressen har dolts av förklarliga skäl. Som man märker är inte pingtiderna stabila, utan varierar stort. Detta beror på andra brukare av det mobila bredbandet, då man inte ser denna variation med DSL (se nedan).</td></tr></tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-7TLEoLiYFw4/WLaW2cLALCI/AAAAAAAAqaM/9f6Itb75opIiRQYniaxwcyDzO5yn-e-VACLcB/s1600/mobilt_bredbandskollen.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="640" src="https://2.bp.blogspot.com/-7TLEoLiYFw4/WLaW2cLALCI/AAAAAAAAqaM/9f6Itb75opIiRQYniaxwcyDzO5yn-e-VACLcB/s640/mobilt_bredbandskollen.png" width="392" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Mätning med Bredbandskollens app på MacOS, som identifierar Stockholmsservern som den nätverksmässigt närmaste servern. Telia kör sin marknadsföring med <b><i>"Surfa med upp till 300 Mbit/s"</i>. </b>Ovanstående 11.42 Mbit/s är verkligheten i mitt fall med cirka 1.5 kilometer till basstationen, men få som knör i samma cell. Uppladdningshastigheten är dock avsevärt snabbare än DSL, och snabbare uppåt ger också lägre svarstider än DSL.</td></tr></tbody></table><div>Nedan följer motsvarande för DSL-uppkopplingen, som inte har några överföringsbegränsningar. </div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-mkBjo6hV2Q4/WLaXnOy7VwI/AAAAAAAAqaU/a3aJrIQqxi4j0y5H3zzkn9x_XAeL5DxUACLcB/s1600/dsl.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="458" src="https://4.bp.blogspot.com/-mkBjo6hV2Q4/WLaXnOy7VwI/AAAAAAAAqaU/a3aJrIQqxi4j0y5H3zzkn9x_XAeL5DxUACLcB/s640/dsl.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Kvalitet på DSL-kopplingen, som är såld som en 12-30 Mbit/s DSL. Lyckas förhandla fram drygt 18 Mbit/s nedåt, vilket får anses vara väntat med två kilometer kabel till DSLAM i telestationen. Notera 387 gigabyte nedladdning på tre dygn och fem timmar, eller drygt 100 gigabyte per dygn.</td></tr></tbody></table><div><br /></div><div class="separator" style="clear: both; text-align: center;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-ir3O9VnDAWM/WLaYNjuYl1I/AAAAAAAAqac/b9AgFnWNucMPsYQz7C_Q_tCpDo4_MvV-QCLcB/s1600/dsl_ping.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="520" src="https://3.bp.blogspot.com/-ir3O9VnDAWM/WLaYNjuYl1I/AAAAAAAAqac/b9AgFnWNucMPsYQz7C_Q_tCpDo4_MvV-QCLcB/s640/dsl_ping.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Avsevärt stabilare ping mot extern server (IP dolt även här). Dock är svarstiderna längre än de kortaste svarstiderna på det mobila bredbandet, vilket förklaras av den högre hastigheten uppåt på mobilt bredband.</td></tr></tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-ZMJuzNWZ18Y/WLaYfRuDtbI/AAAAAAAAqag/-OftqTht_AoG1JIBC2_A0x5z0LPEAou7QCLcB/s1600/dsl_bredbandskollen.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="640" src="https://1.bp.blogspot.com/-ZMJuzNWZ18Y/WLaYfRuDtbI/AAAAAAAAqag/-OftqTht_AoG1JIBC2_A0x5z0LPEAou7QCLcB/s640/dsl_bredbandskollen.png" width="394" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Mätning med Bredbandskollens app på MacOS. Här identifieras Göteborgsservern som närmast nätverksmässigt. Högre nedladdningshastighet, men sämre uppåt och längre svarstider.</td></tr></tbody></table><div>Telia klipper nu kopparkablarna på landsbygden och man kan konstatera att <i>i ovanstående exempel</i> är mobilt bredband någorlunda jämförtbart med DSL. Detta är även utan externt monterade riktantenner, men jag har alltså relativt nära till Telias basstation. Personer som får sin kopparledning och DSL klippt nu kan dock bo längre bort från än jag, som ändå bor bara någon kilometer utanför en större by.</div><div><br /></div><div>Problemet är att inte ens 100 gigabyte per månad är tillräckligt <i>för att kunna jobba</i> över Internet idag. Klippandet av kablarna på landsbygden omöjliggör kvalificerat distansarbete och nyttjandet av moderna tjänster. Det inkluderar t ex backuplösningar och fillagring i <i>molnet</i>, videokonferenser, research över onlinevideo mm. Idag synkas t ex bilder automatiskt från din telefon och upp i molnet, en telefon som också backas upp automatiskt till molnet. Naturligtvis går sådant att stänga av, men det innebär alltså att man inte kan nyttja moderna lösnignar.</div></div><div><br /></div><div>Ett hushåll om fyra där alla har iPrylar får en rätt hårt smäll vid mjukvaruuppdateringar. Det samma gäller datorer där man kan ha en uppsjö programvaror som regelbundet slukar gigabyte i uppdateringar.</div><div><br /></div><div>Senare under året kommer <i>civilsamhället</i> leverera fiber via en fiberförening och det interna gigabitethernetet kommer få en adekvat uppkoppling mot omvärlden. Då kommer det mobila bredbandet som backuplösning inte ha en chans i jämförelse. Det är dock inte poängen med det mobila bredbandet. Poängen är att ha en flexibel och automatisk redundans, så jag kan leverera blogguppdateringar även vid infrastrukturavbrott.</div><div><br /></div><div><b>Flaskhalsen ligger nu som jag ser det bortom min kontroll och handlar om strömförsörjning hos leverantörernas telestation och mobilbassationer. Med dubbla uppkopplingar, avbrottsfri kraft och reservkraft för några dygn har jag gjort vad jag kan.</b></div><div><b><br /></b></div><div><a href="http://clk.tradedoubler.com/click?p=46&a=1559424&url=https://cdon.se/hemelektronik/asus-4g-ac55u-p36527252">Asus 4G-AC55U kostar 2049:- SEK hos CDON</a>. Lösningen kan fungera för det mindre företaget, men för större arbetsplatser finns det förstås lösningar med högre kapacitet på brandväggen. Det är också tveksamt om en större arbetsplats skulle klara sig på den låga överföringskapaciteten mobilt bredband innebär.</div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 47
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-4496493817615883723
+ 2017-03-01T09:17:00.001+01:00
+ 2017-03-01T09:17:17.691+01:00
+
+
+
+
+
+ Socialdemokraterna tänker nu skrota PPM - oavsett vad oppositionen tycker
+ Regeringen med statsminister Stefan Löfven (s) och socialförsäkringsminister Annika Strandhäll (s) avser nu skrota premiepensionssystemet, oavsett vad oppositionen tycker. Degen ska in och premiepensionerna är satta åt sidan till skillnad mot övriga pensionsinbetalningar.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-uWOSiZG6MTI/WLaBX2Yzp3I/AAAAAAAAqZE/B94TD83Z4gYgfaa9hTeerUONGZky1yKlwCLcB/s1600/personer_stefan_lofven.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://4.bp.blogspot.com/-uWOSiZG6MTI/WLaBX2Yzp3I/AAAAAAAAqZE/B94TD83Z4gYgfaa9hTeerUONGZky1yKlwCLcB/s640/personer_stefan_lofven.JPG" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Läs mina läppar: Du blir lurad. Av mig.</td></tr></tbody></table><a name='more'></a>Socialdemokraterna har tröttnat på att den sk premiepensionen förvaltas av spararna själva och faktiskt finns avsatta som existerande pensionskapital. Man vill därför avskaffa premiepensionssystemet.<br /><div><br />Socialförsäkringsminister Strandhäll säger <a href="https://www.svd.se/s-redo-overge-premiepensionen/om/allras-usla-avkastning">enligt SvD</a>:</div><div><blockquote class="tr_bq"><i>"Visst det var en bärande del av pensionsöverenskommelsen när det nya pensionssystemet kom på plats, men vi kommer inte framåt kunna stå bakom en konstruktion som utsätter våra sparare för en så här stor risk [...] Det här är ett extremt system och vi har en situation som ingen har kunnat förutse."</i></blockquote><div>Beskedet är tydligt. Premiepensionssystemet ska bort.<br /><blockquote class="tr_bq"><i>"Om de borgerliga inte är beredda att förändra systemet med premiepension i grunden, så är Socialdemokraterna beredda att överge systemet, som de aldrig varit riktigt förtjusta i."</i></blockquote>Kort sagt kommer Socialdemokraterna skrota PPM oavsett vad oppositionen säger. Så var det med den leken. Vi är rätt många som inte tagit premiepensionssystemet på allvar, väl medvetna om att det kommer avskaffas. Pensionssystemet är ständigt bara ett riksdagsbeslut från att göras om, och oppositionen orkar väl inte rösta emot avskaffandet.<br /><br />Lustiga är när Stefan Löfven säger följande:<br /><blockquote class="tr_bq"><i>"Ingen ska riskera att bli lurad i vårt allmänna pensionssystem"</i></blockquote>Samtidigt lurar man alltså bort premiepensionerna. I ett första steg ska man inte få förvalta dem hur man vill. Nästa steg kommer blir att de helt avskaffas och går in i statskassan likt övriga pensionsinbetalningar och man får en skuldsedel undertecknad Stefan Löfven istället. För socialdemokraterna har ju aldrig lurat någon...<br /><br /><b>Ett pensionssystem är och förblir alltid en syltburk för politikerna att stoppa sina giriga fingrar i - det handlar om enorma belopp och därmed frestelser som är alldeles för stora.</b><br /><b><br /></b>I dagarna sägs många ha fått sitt sk orange kuvert. Jag har inte fått det, eller så har jag som vanligt reflexmässigt slängt det oläst i pappersåtervinnen, väl medveten om att jag som 70-talist aldrig kommer få någon statlig pension värd namnet. Fast det sägs finnas någon siffran <i>hur länge man måste jobba</i>. Kan ju vara spännande att se hur den siffran kryper upp ett år varje år...</div></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 124
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-2878655652206236271
+ 2017-02-28T21:13:00.003+01:00
+ 2017-02-28T21:15:19.066+01:00
+
+
+
+ Komplettering om sjukhusbäddar - psykiatrireformen och äldrevården
+ Några korta kompletteringar kring antalet minskade sjukhusbäddar. Till modernisering och effektivisering av medicin och kirurgi, så kommer även psykiatrireformen och äldrevårdsreformerna, som minskat antalet sjukhusbäddar rejält. Det betyder inte att dessa inte får vård.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-lVqkdjndM1M/WLXYXH2g2gI/AAAAAAAAqYw/KXrXfscSOlMzj0jyp4QJhUEZMDQyPclaACLcB/s1600/1000.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="442" src="https://1.bp.blogspot.com/-lVqkdjndM1M/WLXYXH2g2gI/AAAAAAAAqYw/KXrXfscSOlMzj0jyp4QJhUEZMDQyPclaACLcB/s640/1000.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Antalet sjukhusbäddar per 100 invånare i Norden 1960 - 2012.</td></tr></tbody></table><a name='more'></a>I förra inlägget påtalade jag moderniseringen av vården (avseende kirurgi och medicin) som stor anledning till minskade antal sjukhusbäddar. Men antagligen minst lika viktiga är psykiatrireformen och tillhörande förbättrade mediciner (främst SSRI antar jag), samt reformerna av äldrevården.<br /><div><br /></div><div>Som bekant innebar psykiatrireformen att endast särskilt ömmande fall vårdas inlagda på sk <i>slutenvård</i>. Övriga under psykiatrisk behandling bor på egen hand och tillsammans med betydligt bättre mediciner med tillhörande självmedicinering har det faktiska behovet av institutionsvård av psykiatriska patienter minskat rejält. Det är knappast en förlust att sjukhusbäddar minskat, när man istället fått ut patienterna till att vara (i varierande grad) fungerande människor i samhället istället för på institution. I mänsklig värdighet och livskvalitet har öppenvården antagligen hjälpt många patienter, relativt hur det hade varit på 80-talet eller tidigare. Naturligtvis finns det mer eller mindre tragiska anekdoter om motsatsen.</div><div><br /></div><div>Det samma gäller äldre, som i allt högre grad kan bo kvar i hemmet och få vård där. Den sk <i>långvården</i> finns inte kvar. Även det är antagligen en rejäl livskvalitetshöjning jämfört med att ligga på institution. Men det finns förstås även här mer eller mindre tragiska anekdoter om motsatsen.</div><div><br /></div><div>Kom bara ihåg att anekdoter inte nödvändigtvis ger en korrekt bild av helheten. <a href="http://cornucopia.cornubot.se/2015/06/fakta-vs-anekdoter-medellivslangd-och.html">Exempelvis dör endast 2.8% av männen vid medellivslängden</a>. Det är ett medel, men det är inte vanligt.</div><div><br /></div><div><b>Det går inte att stirra sig blind på sjukhusbäddar som kvalitetsmätare på svensk sjukvård. Det är säkerligen så att antalet faktiska sjukhusbäddar på medicin och kirurgi inte ökat i samma takt som befolkningen, kanske rent av minskat, men det finns inget självändamål i att ha fem gånger så många sjukhusbäddar som idag.</b></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 21
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-521715775671809281
+ 2017-02-28T13:33:00.000+01:00
+ 2017-02-28T17:10:26.959+01:00
+
+
+
+
+
+
+
+
+ Antalet sjukhusbäddar ner 78% sedan 1990
+ Antalet sjukhusbäddar per capita i Sverige har sedan 1990 minskat med 78% och 83% sedan början av 70-talet. Det är dock inte någon unik svensk utveckling, utan beror främst på förändrade vårdmetoder. Sverige har dock lägst antal bäddar per capita i Norden, men undantaget Finland är skillnaden inte speciellt stor.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-0iybL4jJXw0/WLWg1iyDxwI/AAAAAAAAqYg/c7UjOhhDrGczAPRNe_KWnFofBfUJ6hO_QCLcB/s1600/1000.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="442" src="https://2.bp.blogspot.com/-0iybL4jJXw0/WLWg1iyDxwI/AAAAAAAAqYg/c7UjOhhDrGczAPRNe_KWnFofBfUJ6hO_QCLcB/s640/1000.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Antalet sjukhusbäddar per 1 000 invånare i Norden 1960 - 2012. Källa: Världsbanken</td></tr></tbody></table><br /><a name='more'></a><br />Det framhävs ofta hur antalet sjukhusbäddar per capita minskat kraftigt, vilket i sig stämmer. Sedan toppen på 70-talet har antalet bäddar per capita fallit med 83% och sedan 1990 med 78%. Just 1990 är intressant, då året inledde den sk <i>90-talskrisen</i>, där Sverige fick göra upp med det gamla så kallade välfärdssamhället, som levde på skuldsättning och devalveringar av en fast växelkurs. Som bekant fick sedan svensk välfärd ställas om till att faktiskt vara finansierad av skatteintäkter och inte av lån.<br /><div><br /></div><div>Men den stora anledningen till neddragningarna handlar om <i>modernisering av sjukvården</i>. Det finns inget självändamål i att patienter ska ligga kvar över natten för att de har fått eller ska få kirurgi. Istället har man gått över till <i>dagkirurgi</i> och att skicka hem patienter till vad som oftast är ett betydligt bättre boende i hemmet. Dock läggs man faktiskt ibland in även idag, även om man cyniskt annars kan konstatera att <i>sjukhusbäddar har bytts ut till korridorsovande</i>. För med reducerat antal bäddar finns ingen redundans vid stora skadeutfall, smittoutbrott eller t ex medicinskt stängande av avdelningar pga t ex smittorisk.</div><div><br /></div><div><b>Att det handlar om modernisering av sjukvården och inte om någon svensk <i>systemkollaps</i> påvisas av att bäddar per capita har gått ner även hos våra mer funktionsdugliga nordiska fränder. </b></div><div><br /></div><div>Kvaliteten på den svenska vården har faktiskt blivit bättre, och även om vi har minst antal sjukhusbäddar per capita i Norden så har vi bäst canceröverlevnad. <a href="http://cornucopia.cornubot.se/2014/05/sverige-bast-pa-cancervard-i-norden.html">Cancervården är inte perfekt, långt ifrån, men den är alltså bäst i Norden</a>. Man ska komma ihåg att den som fått vård vederbörande är nöjd med inte får några rubriker hos Aftonbladet. </div><div><br /></div><div><b>Sverige har dock minst antal bäddar per capita i Norden. Ja, Sverige är sämst i Norden på antalet sjukhusbäddar per capita, och även om det delvis beror på faktiska neddragningar av välfärden till en finansierad nivå så handlar det i mycket om en modernisering som speglas hos våra grannländer.</b></div><div><b><br /></b></div><div><div>2012 hade Sverige 2.7 bäddar per 1 000 invånare. Island var nere på 3.2 efter att till synes fått reducera rejält i spåren av skuldkrisen, likt Sverige gjorde på 90-talet. Norge ligger på 3.3, Danmark på 3.5 och Finland sticker ut med 5.5.</div></div><div><br /></div><div>Man kan konstatera att Norge och Danmark aldrig hade det höga antalet bäddar per capita som Sverige, Island och Finland hade, och förändringen av vården kanske därmed inte <i>upplevs</i> lika dramatisk i de länderna.<br /><br /><b>Att skicka hem sjuka människor är inte en systemkollaps, utan en avsiktlig och fullt medveten förändring av vården. Sedan kan hemskickandet mycket väl ha gått för långt, men det kan inte avgöras av rubriker om tragiska anekdoter i kvällspressen.</b></div><div><br /></div><div><i>Världsbankens siffror sträcker sig till 2012 och säger inget om utvecklingen sedan dess. Då data fram till 90-talet inte förekommer med varje år - även sporadiskt för Island hela tiden - så har senaste statistiken upprepats fram till nästa datapunkt - ingen extrapolering har skett. Det gör t ex att Islands bäddar ser ut att krascha 2002, men det handlar antagligen snarare om en linjär nedgång. Den svenska utvecklingen har dock data år för år sedan 90-talet. Extrapolerade grafer lämnas som en övning åt läsaren.</i></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 38
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-4926042377853741565
+ 2017-02-28T10:44:00.000+01:00
+ 2017-02-28T11:00:37.382+01:00
+
+ ÖB: Försvarsmakten saknar 6.5 miljarder kronor - anskaffning luftvärn skjuts upp
+ <blockquote class="tr_bq"><i>"Marginalerna är borta. Ekonomi som inte finns på 6.5 miljarder kronor." - </i>Överbefälhavare Micael Bydén</blockquote>Försvarsmakten saknar enligt ÖB Micael Bydén 6.5 miljarder kronor och måste dra ner på och försena ett antal projekt och förmågor. Ett antal viktiga investeringar måste skjutas på framtiden och aktuellt försvarsbeslut kan alltså inte genomföras i tid. Därtill viker oavsett förmågan efter 2020. Bland annat kommer inget medelräckviddigt luftvärn anskaffas om inte pengar skjuts till.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-F0aE1Vfv6mE/WLVGWhsEvkI/AAAAAAAAqYQ/u9pf2OgiERgCQUsPyXMicjqz8N6rUYT8ACLcB/s1600/svfm_micael_byden_fofrk_4.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://2.bp.blogspot.com/-F0aE1Vfv6mE/WLVGWhsEvkI/AAAAAAAAqYQ/u9pf2OgiERgCQUsPyXMicjqz8N6rUYT8ACLcB/s640/svfm_micael_byden_fofrk_4.JPG" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ÖB Micael Bydén.</td></tr></tbody></table><a name='more'></a>Främst får man skjuta upp investeringar till efter 2020, vilket innebär att ett antal system måste skjutas upp. Bland annat skjuter man rent konkret upp ledningssystem för brigad.<br /><div style="text-align: justify;"></div><div><br /></div><div>Regeringen har fått ett dokument på vad för brister och neddragningar man behöver göra, men handlingarna är av förklarliga skäl hemligstämplade då det avslöjar det svenska försvarets brister.<br /><br /><a href="http://www.forsvarsmakten.se/sv/aktuellt/2017/02/hart-arbete-kravs-for-starkt-formaga/">Försvarsmakten skriver på sin hemsida</a>:<br /><blockquote class="tr_bq"><i>"Urholkningseffekt och kostnadsökningar för underhåll och vidmakthållande av materielsystem medför att Försvarsmakten behöver <b>ta bort, reducera eller skjuta fram tidigare planerade åtgärder för drygt 6,5 miljarder</b>."</i></blockquote><b>I budgetunderlaget (<a href="http://www.forsvarsmakten.se/siteassets/4-om-myndigheten/dokumentfiler/budgetunderlag/budgetunderlag-2018/fm2016-10870-28-huvuddokument-bu-18.pdf">PDF</a>) nämns uttryckligen att <i>medelräckviddigt luftvärn inte kan anskaffas om inte man får mer pengar. </i></b><br /><blockquote class="tr_bq"><i>"Den hittills genomförda beredningen indikerar dock att anskaffningen av [medelräckviddigt luftvärn] är så omfattande att ekonomiska tillskott under perioden 2018 - 2020 erfordras."</i></blockquote>Kort sagt skjuter man upp anskaffningen av modernt luftvärn, istället för våra nuvarande HAWK-system från initialt 1960.</div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 31
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-2487564271668296642
+ 2017-02-28T09:12:00.001+01:00
+ 2017-02-28T10:11:04.607+01:00
+
+
+
+
+
+ Rysk infiltration av Miljöpartiets riksdagskansli - diskutera i små grupper
+ Enligt Aftonbladet får nu SD sällskap av Miljöpartiet, som också utsatts för infiltration av ryska intressen i riksdagskansliet. En hög politisk tjänsteman hos Miljöpartiet påstås ha fått sparken på grund av att vederbörande agerat inflytelseagent åt ryska ambassaden. Tjänstemannen förnekar allt och ingen vill offentligt säga något i ärendet.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-RIXmqMXpTVc/WLUuYR0oKfI/AAAAAAAAqXg/Vq_RWiIlx-ssdNqaQkxM4azEEYVJJQOdgCLcB/s1600/valurna.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="332" src="https://2.bp.blogspot.com/-RIXmqMXpTVc/WLUuYR0oKfI/AAAAAAAAqXg/Vq_RWiIlx-ssdNqaQkxM4azEEYVJJQOdgCLcB/s640/valurna.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Genomskinlig rysk valurna på ryska ambassaden med fönster för möjlighet att titta på vad individer röstar på. <a href="http://cornucopia.cornubot.se/2016/09/skenvalet-pa-ryska-ambassaden-i.html">Från Dumaskenvalet i höstas</a>.</td></tr></tbody></table><div><a name='more'></a>En hög fd politisk tjänsteman hos Miljöpartiets riksdagskansli har alltså fått sparken sedan vederbörande enligt uppgifter till Aftonbladet har gått ryska ambassadens ärenden i försök att få Miljöpartiet att acceptera diktaturen i Kremls linjer i internationell politik. Detta rimligtvis inklusive stöd för invasionen av Krim och Sydöstra Ukraina, samt hävande av sanktioner mot diktaturen och dess kreatur.</div><div><br /></div><div>Den fd höge (och då menas i organisationen och inte, ja, ni vet ... svamp och diverse örter) politiske tjänstemannen <a href="http://www.aftonbladet.se/nyheter/samhalle/a/PQdBJ/mp-mannen-om-anklagelserna-det-kan-jag-inte-tro">förnekar allt</a> och det påstås istället handla om en sprucken kärleksrelation mellan personer i organisationen. Alla inblandade förnekar allt och <a href="http://www.aftonbladet.se/nyheter/samhalle/a/epGjy/miljopartiet-vagrar-kommentera-uppgifterna">vägrar kommentera officiellt</a>, men anonymt är man <a href="http://www.aftonbladet.se/nyheter/samhalle/a/1aM2e/hog-mp-tjansteman-fick-sparken--efter-misstankta-rysskopplingar">väldigt tydliga till Aftonbladet</a>.</div><div><blockquote class="tr_bq"><i>"Men flera källor - både riksdagsledamöter och högt uppsatta MP-politiker - bekräftar för Aftonbladet att det i själva verket handlade om att mannens chef ansåg att han utgjorde en säkerhetsrisk. [...] Syftet med de ryska kontakterna var enligt Aftonbladets uppgiftslämnare att få partiet att ändra inställning till Ryssland och anamma en mer vänlig Rysslandspolitik. Men det fanns också farhågor att han försökt lämna uppgifter till Ryssland"</i></blockquote></div><div>Med tanke på de Kreml- och diktaturvänliga åsikterna hos vissa riksdagsledamöter hos Miljöpartiet är det förstås föga överraskande, men får ändå sägas vara positivt att man alltså gav mannen sparken. Han ska också sedan försökt få jobb på UD, men nekats på grund av att <i>"det finns en mapp på honom"</i>.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-w7GGEEFwXZc/WLUyyyc68eI/AAAAAAAAqXs/YhIWe1A2HEc-EbKKUlCtyV3wPnhrKRoHACLcB/s1600/IMG_0744.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="350" src="https://4.bp.blogspot.com/-w7GGEEFwXZc/WLUyyyc68eI/AAAAAAAAqXs/YhIWe1A2HEc-EbKKUlCtyV3wPnhrKRoHACLcB/s640/IMG_0744.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Ryska ambassaden på Gjörwellsgatan på Kungsholmen i Stockholm.</td></tr></tbody></table>Expressen har mer information. Bland annat ska tjänstemannen fått ersättning från ambassaden i form av presentkort (=transaktionerna kan inte spåras). Får man betalt av främmande makt kallas man för <i>agent</i> eller om man får betalt för att lämna uppgifter för <i>spion</i>. <a href="http://www.expressen.se/nyheter/mp-tjansteman-fick-sluta--var-sakerhetsrisk/">Expressen</a>:<br /><blockquote class="tr_bq"><i>"Tjänstemannen har haft kontakter med den ryska ambassaden och även fått gåvor därifrån i form av presentkort, säger en uppgiftslämnare.</i><i><br /></i><i>Syftet bakom de täta kontakterna med Rysslands ambassad ska ha varit att få MP att ändra riktning till en mer ryssvänlig inställning. Tjänstemannen har tidigare uttalat sig för sitt partis räkning i frågor som rör Nato och synen på Ryssland, och bland annat hävdat att närområdet är stabilt och att Sverige inte skulle ha något mer mervärde av ett medlemskap utan konstaterat att Ryssland skulle ha känt sig trängt av en sådan Natoexpansion."</i></blockquote>Samtidigt väcker förstås detta funderingar kring vilka inflyteleoperationer som går oupptäckta. Det är även intressant att Kreml och Ryssland alltså genomför dessa inflytelseoperationer rakt in i svenska riksdagen och mot ett regeringsparti. Genom sin fientlighet mot samarbete med västerländska demokratier inom NATO och EU har Miljöpartiet förstås öppnat upp för att på detta vis utsättas för yttre påverkan från diktaturen i Kreml.<br /><br />Sedan blir det otroligt roande när Aftonbladet först skriver och rubriksätter Ryssland för att i intervju sedan låta <a href="http://www.aftonbladet.se/nyheter/kolumnister/a/moKbl">Lena Mellin prata om <i>främmande makt</i></a>. Rent löjeväckande, men det är förstås positivt att Aftonbladet för en gångs skull faktiskt granskar ett av de två socialistiska regeringspartierna.<br /><br />Diskutera i små grupper.</div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 39
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-2244965555964456356
+ 2017-02-28T07:52:00.001+01:00
+ 2017-02-28T07:54:17.500+01:00
+
+
+
+
+ Trängselskatten höjs i Stockholm - igen
+ Dagens Industri glädjer oss alla med att trängselskatterna ska höjas igen i Stockholm. Trafikverket vänder på varje sten för att få ut mer pengar ur de som fortfarande envisas med att köa på Essingeleden eller andra trevliga platser runt Stockholm.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-gR8_YVhd7mc/WLUc6kooDyI/AAAAAAAAqXI/1BxsYddznzI8Gv3JOlok18745QG3CFXEACLcB/s1600/IMG_4986.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://4.bp.blogspot.com/-gR8_YVhd7mc/WLUc6kooDyI/AAAAAAAAqXI/1BxsYddznzI8Gv3JOlok18745QG3CFXEACLcB/s640/IMG_4986.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Skattebetalare.</td></tr></tbody></table><a name='more'></a><div><a href="http://di.se/nyheter/trangselskatten-hojs-igen">Dagens Industri skriver följande</a>:</div><div><blockquote class="tr_bq"><i>"Skatten på Essingeleden höjs från 30 till 35 kronor under rusningstid.</i><i><br /></i><i>Skatt införs även på vissa dagar före helgdagar, som i dag är skattebefriade.</i><i><br /></i><i>Skatten tas ut redan från klockan 6 på morgonen, i stället som i dag från 6.30."</i></blockquote></div><div>Pengarna ska användas till att bygga en ny spårvagnslinje och att bygga ut tunnelbanan. DI skriver också vad argumentet var för införande av trängselskatt ursprungligen var:<br /><blockquote class="tr_bq"><i>"Även om trängselskatten är en viktig finansieringskälla är det ursprungliga syftet med skatten att minska utsläppen och öka framkomligheten på vägarna."</i></blockquote>Som bekant har det inte blivit så - vare sig i Göteborg eller Stockholm, utan effekterna varade högst tillfälligt tills bekvämlighet och tillvänjning infann sig.<br /><br /><b>Trängselskatt är numera endast ett sätt att få in mer pengar till statskassan och har inget med <i>trängsel</i> att göra. Korrekt benämning är <i>vägtullar</i> och inte något med trängsel. Höjningarna för att finansiera andra projekt visar tydligt att det handlar om <i>beskattning</i> och inget annat.</b><br /><b><br /></b>Något slut på intäktskällans existens finns inte heller. I Norge har man haft vägtullar specifikt för att uttryckligen finansiera specifika projekt. När tullarna har dragit in önskat belopp har de sedan avskaffats, men i Sverige är detta nu en permanent försörjningsväg för staten. Vilket är synd, då det gör att man inte vill bli av med biltrafiken på riktigt, för då blir man av med inkomsterna.</div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 57
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-4647589022017093930
+ 2017-02-27T16:26:00.001+01:00
+ 2017-02-27T16:28:29.928+01:00
+
+
+
+ MÖP-måndag: Casio G-Shock - när operatören själv får välja
+ Så var det dags för MÖP-måndag igen, och idag konstaterar vi att Casio G-Shock är det som gäller när Försvarsmaktens specialoperatörer själva får välja. Om ni funderat på vad det är för klocka som syns på Försvarsmaktens senaste SOG-film, så behöver ni inte fundera på vilken längre. Modellnummer följer i artikeln nedan, och priset är endast cirka 1000:- SEK.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-4-FtacihO9E/WLRBV1w3x6I/AAAAAAAAqWs/N3wKUPCOwxsxJl-L-fumsVYH8swW-KV5wCLcB/s1600/IMG_2467.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://2.bp.blogspot.com/-4-FtacihO9E/WLRBV1w3x6I/AAAAAAAAqWs/N3wKUPCOwxsxJl-L-fumsVYH8swW-KV5wCLcB/s640/IMG_2467.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Casio G-Shock Mudman på ärmen hos en civilklädd men beväpnad operatör i tjänst hos Försvarsmakten.</td></tr></tbody></table><a name='more'></a><div>Ända sedan det enligt reportaget och boken Black Hawk Down visade sig att amerikanska <i>Delta Force:s</i> operatörer använde prisvärda Casio G-Shock, har klockan fått en allt större spridning hos militärer och även svansen av MÖP:ar. Men också hos t ex blåljusmyndigheterna.</div><div><br /></div><div><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-VFP4heAAWYI/WLRC-_hv1NI/AAAAAAAAqW4/Pg-oxuI1hl8hAS01YeH3iNbmwAcQ9qLpACLcB/s1600/ber.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="116" src="https://3.bp.blogspot.com/-VFP4heAAWYI/WLRC-_hv1NI/AAAAAAAAqW4/Pg-oxuI1hl8hAS01YeH3iNbmwAcQ9qLpACLcB/s200/ber.png" width="200" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">G-Shock GD-100-1BER.<br /><a href="https://www.youtube.com/watch?v=xsZUcShUzRQ">Från 5:25 in i SOG-filmen</a>. Syns även<br />vid fler tillfällen.</td></tr></tbody></table>Senast syntes klockvarumärket i SOG-filmen, <a href="http://cornucopia.cornubot.se/2016/12/film-pa-sog-bekraftar-lwrci-ic-som-ny.html">där man visade upp Särskilda Operationsgruppens nya automatkarbiner</a>, som ni tidigare <a href="http://cornucopia.cornubot.se/2016/11/mop-nytt-ny-m4-baserad-automatkarbin.html">kunde läsa om här på bloggen</a>. Nu kan man förvisso välja vad man vill betala för sin G-Shock, men i SOG-filmen lägger MÖP:en mäkre till den enklare <a href="http://www.casio-europe.com/se/produkter/armbandsur/g-shock/gd-100-1ber/">G-Shock GD-100-1BER</a>, som kostar runt 1000:- SEK att köpa.<br /><br />Dyrare utgåvor inom G-Shockserien är t ex Rangeman för ca 3000 - 5000:- SEK, Mudmaster för 3000 - 8000:- SEK, Frogman för 11000 - 12000:-, Gravitymaster för 3000 - 12000:-, Gulfmaster för 5000 - 12000:- SEK och Waveman för upp till 22 000:-. Mudmanmodellen ovan är alltså lite dyrare än en tusenlapp.<br /><br />Men för fältbruk (eller åtminstone bordning av en passagerarfärja) går det uppenbarligen lika bra med en G-Shock för runt tusenlappen, om man ska lita på kofösarna i Särskilda operationsgruppen. Antagligen får man mycket hållbarhet för pengarna i det nedre prisintervallet.<br /><br /><i>Ingen form av ersättning har utgått för detta blogginlägg, som alltså bara är MÖP:erier och inte reklam.</i></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 52
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-7572191339310713232
+ 2017-02-27T12:04:00.004+01:00
+ 2017-02-27T13:32:17.282+01:00
+
+
+
+
+
+
+ Patrik Fältström: Bygg inte ett eget statligt mobilt bredband
+ <div>Svenska staten har stoppat utbyggnaden av nästa generations mobilnät, 5G, eftersom staten vill ha 700 Mhz-bandet för sig själva för en ersättare till Rakel. Det blir en dyrare, sämre och mindre redundant lösning än att låta staten vara en <i>virtuell operatör</i> som använder alla kommersiella aktörers nät samtidigt. Den svenske Internetpionjären Patrik Fältström är mycket kritisk.<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-rHpzaYv1jDw/WLQHrQEMFeI/AAAAAAAAqWc/YGs1tK4qhfcIub1KIcC03fgKYr-LO22OQCLcB/s1600/infrastruktur_teracom_mast_satila.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://2.bp.blogspot.com/-rHpzaYv1jDw/WLQHrQEMFeI/AAAAAAAAqWc/YGs1tK4qhfcIub1KIcC03fgKYr-LO22OQCLcB/s640/infrastruktur_teracom_mast_satila.JPG" width="640" /></a></div><br /></div><div><a name='more'></a>Kriskommunikationsradiosystemet Rakel kostar enbart i drift cirka 600 MSEK om året för staten. Till detta kommer abonnemangskostnader för de olika kundernas 60 000 användare.</div><div><br /></div><div>Rakel har dock inte tillräckliga funktioner för moderna datatjänster och staten vill därför bygga ett nytt kriskommunikationssystem, som ska ta upp 700 Mhz-bandet som i övriga världen ska användas för 5G - nästa generation mobilt bredband.</div><div><br /></div><div>Den legendariske svenska Internetpionjären <a href="http://sverigesradio.se/sida/artikel.aspx?programid=83&artikel=6639973">Patrik Fältström är mycket kritisk och menar att det vore bättre om staten skapar en virtuell operatör</a> som fungerar i samtliga kommersiella nät.</div><div><blockquote class="tr_bq"><i>"Den bästa lösningen är att man skapar en virtuell operatör som ledar ut sim-kort och så köper den virtuella operatören plats i alla nätägarens nät. Precis på samma sätt som Telia hyrde in sig Tele2:s 3G-nät, så skulle den här speciella virtuella operatören kunna finnas i alla nät i Sverige"</i></blockquote></div><div>Därmed får man inte bara tillgång till ett eget nät som kommer vara en prioriterad måltavla för en angripare - både frekvenserna och infrastrukturen - utan man får tillgång till fyra kommersiella nät med massivt bättre redundans. Behovet av kryptering sköts via en APN+VPN-lösning och man kan också ha system för trafikprioritering där den statliga virtuella operatören prioriteras i ett krisläge, så trängseln är inte ett problem.<br /><br />Därtill vill inte en angripare i hybridkriget slå ut befolkningens mobilkommunikation, eftersom informationsoperationer och desinformation via sociala medier inte fungerar då. Det minskar angreppsviljan mot de kommersiella näten, i ett försök att slå ut kriskommunikationen för blåljusmyndigheterna.<br /><br /><b>Det ter sig självklart att det är billigare att hyra in sig i fyra nät byggda för att hantera åtta miljoner kunder än att bygga ett eget nät för 60 000 användare. Med tanke på svensk upphandlingskompetens blir det ännu värre att bygga själv. Därtill kommer det statliga virtuella nätet fungera med vanliga kommersiella standardutrustning direkt från hyllan, istället för att likt med Rakel ta fram speciella terminaler i för branschen mycket små (och dyra) serier.</b><br /><b><br /></b>Naturligtvis får man välja 5G-terminaler som uppfyller säkerhetskraven, men likt inom 3G och 4G kommer det existera en uppsjö av sådana. Framför allt handlar det om mjukvara för kommunikationen. Man kommer oavsett vara beroende av externa leverantörer för utrustning, routrar, fiberanslutningar etc om man bygger ett eget nät. Man kommer oavsett behöva kryptering etc.</div><div><br />Istället hamnar nu Sverige rejält på efterkälken vad gäller 5G och den allmänna teknik- och samhällsutvecklingen.<br /><br /><b>En lösning med virtuell operatör i samtliga kommersiella nät kommer vara billigare, gå snabbare och ha högre redundans och bättre täckning än att bara ha tillgång till ett eget nät. Gör inte om de dyrbara misstagen med Rakel.</b></div>
+
+
+
+
+
+
+ Cornucopia?
+ http://www.blogger.com/profile/14678368642345396163
+ noreply@blogger.com
+
+
+
+ 59
+
+
+ tag:blogger.com,1999:blog-8354057230547055221.post-3545665673284073678
+ 2017-02-27T09:39:00.000+01:00
+ 2017-02-27T11:34:13.198+01:00
+
+
+
+
+
+ Författar- och vinintervju med mig
+ Emma Kreü på <a href="http://bykw.se/2017/02/27/bykw-intervjuar-lars-wilderang/">podden <i>Because You Know Wines</i>, inriktad på litteratur och vin</a>, har gjort en författarintervju med mig nu när jag var i Stockholm förra veckan. Ni hittar den nedan. Pratar bland annat om Höstsol och TV-serien av Stjärnklart. Tipsar också om vin.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-BGqJPet6Ac0/WLQAbuwDaiI/AAAAAAAAqWM/w8Tf1K5rxhYMLrFht8s9nV7a3Kx5YVcvACLcB/s1600/17016349_10154886956080569_912489904_o.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://3.bp.blogspot.com/-BGqJPet6Ac0/WLQAbuwDaiI/AAAAAAAAqWM/w8Tf1K5rxhYMLrFht8s9nV7a3Kx5YVcvACLcB/s640/17016349_10154886956080569_912489904_o.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Selfie med Emma Kreü och Lars Wilderäng. Foto: Emma Kreü</td></tr></tbody></table><div class="separator" style="clear: both; text-align: center;"></div><div><div style="text-align: justify;"></div><div><a name='more'></a></div><div>Ljudet lämnar väl en del att önska, men dra upp volymen maximalt så bör ni höra vad jag säger utom när jag sluddrar.</div><div><iframe allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/JrPmuN8d_6A" width="640"></iframe></div></div>
+
+
+
+
+
+
+Cornucopia?
+http://www.blogger.com/profile/14678368642345396163
+noreply@blogger.com
+
+
+
+25
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_cowboy.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_cowboy.xml
new file mode 100644
index 000000000..942c59f3d
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_cowboy.xml
@@ -0,0 +1,1806 @@
+
+
+
+ http://localhost:1313/
+ Cowboy Programmer on Cowboy Programmer
+ 2016-09-28T22:57:21+02:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ Hugo -- gohugo.io
+ Recent content in Cowboy Programmer on Cowboy Programmer
+ http://localhost:1313/css/images/logo.png
+ Powered by [Hugo](//gohugo.io) and [Icarus Theme](http://themes.gohugo.io/theme/hugo-icarus/).
+
+
+
+ http://localhost:1313/2016/09/reboot_machine_on_wrong_password/
+
+ Rebooting on wrong password
+ 2016-09-28T22:57:21+02:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ Having an encrypted hard drive is all well and good, but chances are
+that if someone is gonna steal your laptop, it’s probably not going to
+be turned off. Most likely, it will be stolen in a powered-on
+state. And so your encrypted hard drive doesn’t increase your security
+at all since it’s currently unlocked.
+
+
In my mind, it’s a slight improvement if the computer somehow can
+shutdown if someone is trying to gain access to it. That way, the hard
+drive is no longer accessible and the number of possible attack
+vectors go down drastically. And so, if you type the wrong password 3
+times on my laptop, it shuts down.
+
+
This is accomplished by using PAM, and its ability to invoke an
+arbitrary script as part of the login flow via pam_exec.so. The
+script itself looks like this:
+
#!/bin/bash
+# Do not add -eu, you need to allow empty variables here!
+
+# To be used with PAM. Look in /etc/pam.d for the script that your
+# screensaver etc uses. Typically it references common-account and common-auth.
+#
+# In common-auth, add this as the first line
+#auth optional pam_exec.so debug /path/to/wrongpassword.sh
+#
+# In common-account, add this as the first line
+#account required pam_exec.so debug /path/to/wrongpassword.sh
+#
+
+COUNTFILE="/var/log/failed_login_count"
+
+# Make sure file exists
+if[ ! -f "${COUNFILE}"];then
+ touch "${COUNTFILE}"
+ chmod 777"${COUNTFILE}"
+fi
+
+# Read value in it
+COUNT=$(cat "${COUNTFILE}")
+# Increment it
+COUNT=$((COUNT+1))
+echo"${COUNT}" > "${COUNTFILE}"
+
+# if authentication
+if["${PAM_TYPE}"=="auth"]; then
+ # The count will be at 4 after 3 wrong tries
+ if["${COUNT}" -ge 4]; then
+ # Shutdown in 1 min
+ #/usr/bin/shutdown --no-wall -h +1
+ # This is a hack because the line above gives a segfault in logind
+ echo"0" > "${COUNTFILE}"
+ systemctl poweroff
+ fi
+# If authentication succeeded, and we are now in account phase
+elif["${PAM_TYPE}"=="account"]; then
+ echo"0" > "${COUNTFILE}"
+ # Cancel shutdown which was just issued
+ shutdown -c
+fi
+
+exit0
+
+
+
On my Debian system, PAM ends up looking at /etc/pam.d/common-auth
+and /etc/pam.d/common-account. These are invoked in different parts
+of the authentication flow. In common-auth, add this as the first
+line:
You can try it immediately if it works. Lock your screen, and type the
+wrong password 4 times. If it works, your computer should shut down.
+
+
WARNING: DO NOT ENABLE ON SERVERS
+
+
This is NOT something you want to do on any machine. Most notably,
+it’s probably a huge mistake to copy this verbatim on a machine which
+accepts remote connections. In that case, you essentially enable
+anyone to DOS you by entering the wrong password via SSH or
+similarly. So don’t do this if you allow remote connections to your
+machine (which shouldn’t be a thing on a laptop).
+]]>
+
+
+
+ dummy-id-to-distinguis-from-alternate-link
+
+ Compress all the images!
+ 2016-08-26T13:17:40+02:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ Update 2016-11-22: Made the Makefile compatible with BSD sed (MacOS)
+
+
One advantage that static sites, such as those built by Hugo,
+provide is fast loading times. Because there is no processing to be
+done, no server side rendering, no database lookups, loading times are
+just as fast as you can serve the files that make up the page. This
+means that bandwidth becomes the primary bottleneck, which
+incidentally is
+one of the factors used by Google to calculate your search ranking. See
+also
+Pagespeed Insights.
+
+
Compressing images
+
+
Because the largest pieces of a page typically consist of images, it
+stands to reason that if we can make the images smaller, we can make
+the page load faster. Luckily there exists methods that can compress
+images losslessly. That means that the quality stays exactly the
+same, the page only loads faster. That seemed like a no-brainer to me
+so I compressed all the images on the site using PNGout as
+advised by Jeff Atwood. I mean, who doesn’t
+like free bandwidth?
+
+
A new algorithm called Zopfli (open sourced by Google,
+also mentioned by Jeff) claims even better
+results than PNGout though. Results on this site’s images confirm
+those claims. Running the tool on images already compressed by
+PNGout gives output such as this:
+
./zopflipng --prefix="zopfli_" static/images/2014/Dec/Screenshot-from-2014-12-29-13-28-29.png
+Optimizing static/images/2014/Dec/Screenshot-from-2014-12-29-13-28-29.png
+Input size: 89420 (87K)
+Result size: 90361 (88K). Percentage of original: 101.052%
+Preserving original PNG since it was smaller
+
+./zopflipng --prefix="zopfli_" static/images/2014/Jun/Jenkins_install_git.png
+Optimizing static/images/2014/Jun/Jenkins_install_git.png
+Input size: 189406 (184K)
+Result size: 166362 (162K). Percentage of original: 87.834%
+Result is smaller
+
+./zopflipng --prefix="zopfli_" static/images/2014/Jun/jenkins_batch.png
+Optimizing static/images/2014/Jun/jenkins_batch.png
+Input size: 21933 (21K)
+Result size: 16255 (15K). Percentage of original: 74.112%
+Result is smaller
+
+./zopflipng --prefix="zopfli_" static/images/2014/Jun/jenkins_build_step.png
+Optimizing static/images/2014/Jun/jenkins_build_step.png
+Input size: 8184 (7K)
+Result size: 6809 (6K). Percentage of original: 83.199%
+Result is smaller
+
+./zopflipng --prefix="zopfli_" static/images/2014/Jun/jenkins_config_git.png
+Optimizing static/images/2014/Jun/jenkins_config_git.png
+Input size: 57897 (56K)
+Result size: 47164 (46K). Percentage of original: 81.462%
+Result is smaller
+
+
+
The first result in the example output shows a case where Zopfli would
+actually have made the file bigger (because it was already compressed
+by PNGout, remember). This is nothing you have to worry about because
+it’s actually smart enough that it simply copies the original file in
+that case.
+
+
Comparing to both before any compression, and PNGout, yielded the
+following results:
And this is with the default arguments. It is possible squeeze yet a
+couple of more bytes out of this if you’re willing to wait longer.
+
+
Automate it with Make
+
+
Another joy of using a simple static site is that it is possible to
+compose regular tools to do useful things. Tools like
+Make. And we can use Make to build the site, as well as
+compressing images which have not already been compressed. You could
+do it manually for each new image that you add of course but be
+honest, you know that you’re gonna forget to do it at some point. So
+let’s automate it instead!
+
+
This is the Makefile that I use to build this site with, note that
+public depends on $(PNG_SENTINELS), so I literally can’t forget to
+compress any new images added:
+
.PHONY: help build server server-with-drafts clean zopfli
+
+PNG_SENTINELS:=$(shell find . -path ./public -prune -o -name '*.png' -print | sed 's|\(.\+/\)\(.\+.png\)|\1.\2.zopfli|g')
+
+help:## Print this help text
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$'$(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
+
+server:## Run hugo server
+ hugo server
+
+server-with-drafts:## Run hugo server and include drafts
+ hugo server -D
+
+build: public ## Build site (will also compress images using zopfli)
+
+zopfli:$(PNG_SENTINELS)## Compress new images using zopfli
+
+clean:## Remove the built directory
+ @rm -rf public
+
+public:$(PNG_SENTINELS)
+ @rm -rf public
+ hugo
+
+# Zopfli sentinel rule, assumes zopflipng binary is in the same folder
+.%.png.zopfli: %.png
+ ./zopflipng --prefix="zopfli_" $<
+ @mv $(dir $<)zopfli_$(notdir $<) $<
+ @touch $@
+
+
+
For best performance, run make with parallel jobs (change 4 to your
+number CPUs): make -j4 zopfli.
+
+
To know which files have already been compressed without actually
+running Zopfli on it again (which takes a while), sentinel files are
+created with this pattern: .<imgfilename>.zopfli. Thus, the next
+time around, zopfli is only invoked for files which have not already
+been compressed, making it a one-time operation. And when everything
+has already been compressed, you’ll just get this:
+
make: Nothing to be done for 'zopfli'.
+
+]]>
+
+
+
+ http://localhost:1313/2016/07/migrating_from_ghost_to_hugo/
+
+ Migrating from Ghost to Hugo
+ 2016-07-25T23:55:38+02:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ So I recently migrated this site from Ghost to Hugo
+after reading a nice article about the Hugo in
+Linux Voice #20 (funnily enough, the same issue also
+features an article about Ghost). I originally made the switch to
+Ghost from Jekyll back in 2014 or so mainly because I could
+not find a good theme to use. Ghost also seemed to have a lot of cool
+features and it’s fun to try new things.
+
+
I think it’s safe to say that I am hardly a prolific blogger. I mainly
+write about stuff which I personally cannot find on the web which I
+think should exist, because I will likely need it myself sometime in
+the future. So it’s hardly a surprise that I am not in the target
+audience for Ghost.
+
+
Things about Ghost which annoy me
+
+
+
It’s written in NodeJS — people who think JS is a good server
+language also tend to think that it’s a good idea to depend on just
+about any package, and download it in every single build. Which
+becomes really funny sometimes.
+
Poor selection of themes — this is subjective of
+course, but it seems to me that the free options don’t have much in
+terms of diversity. Heck, they even call it a marketplace which
+rubs me the wrong way.
+
Themes end up being quite reliant on JS if you want necessary
+features like syntax highlighting on code snippets — I often
+browse with JS disabled and should be able to view my own site.
+
Markdown parser treats newlines as significant — meaning you can’t
+have properly aligned paragraphs in your editor.
+
+
+
That last point irritates me deeply but it’s not as bad as the next point.
+
+
+
You can effectively lock an account by entering the wrong password 3
+times.
+
+
+
This requires some explanation. So Ghost, targeting teams of bloggers
+really, naturally have an account system much like Wordpress. Now, as
+I was surveying the security status of other services I am running, I
+was wondering how Ghost handled someone trying to brute force your
+account and decided to simply try it out. Type the wrong password once
+too many, and this happens:
+
+
+
+
It doesn’t lock it for a single IP address (I tried from several), it
+locks the entire account. Effectively, someone can just set up a
+script to try an account indefinitely simply with the intention to
+block someone from logging in.
+
+
The log doesn’t even show login attempts, so there is no way to
+implement sensible blocking strategies using something like fail2ban.
+
+
The whole thing left a bad taste my mouth so it was a very suitable timing to read an article on Hugo.
+
+
Things about Hugo which excite me
+
+
+
Markdown parser treats newlines correctly
+
It’s a static site generator and not a service — this meant 100MB
+(10%) of RAM became available on my server and there is no account
+to hack (or block).
+
Supports everything of Ghost (that I am aware of).
Can do server side syntax highlighting using Pygments.
+
Some really nice themes are available, and they are
+all free.
+
+
+
Migrating all data from Ghost
+
+
Migrating from Ghost also turned about to be really painless. There
+were several scripts around for exactly this but they all turned out
+to be written in odd languages, and did not actually
+migrate all the metadata in Ghost. So I wrote my own in Python with
+these killer features:
+
+
+
Migrates tags.
+
Migrates dates.
+
Migrates drafts as drafts.
+
Creates aliases in your posts which makes sure that old permalinks
+will still work!
+
Migrates cover pictures as banner images, just select a theme which
+support them.
+
Rewrites all relative links so they all still work (this includes
+images).
+
Code blocks with language definitions like ```language-java
+are changed to ```java.
+
+
#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+'''
+A simple program which migrates an exported Ghost blog to Hugo.
+It assumes your blog is using the hugo-icarus theme, but should
+work for any theme. The script will migrate your posts, including
+tags and banner images. Furthermore, it will make sure that
+all your old post urls will keep working by adding aliases to them.
+
+The only thing you need to do yourself is copying the `images/`
+directory in your ghost directory to `static/images/` in your hugo
+directory. That way, all images will work. The script will rewrite
+all urls linking to `/content/images` to just `/images`.
+'''
+
+importargparse
+importjson
+fromdatetimeimport date
+fromosimport path
+fromcollectionsimport defaultdict
+importre
+
+_post ='''
++++
+date = "{date}"
+draft = {draft}
+title = """{title}"""
+slug = "{slug}"
+tags = {tags}
+banner = "{banner}"
+aliases = {aliases}
++++
+
+{markdown}
+'''
+
+
+defmigrate(filepath, hugodir):
+ '''
+ Parse the Ghost json file and write post files
+ '''
+ withopen(filepath, "r") as fp:
+ ghost = json.load(fp)
+
+ data = ghost['db'][0]['data']
+
+ tags = {}
+ for tag in data["tags"]:
+ tags[tag["id"]] = tag["name"]
+
+ posttags = defaultdict(list)
+
+ for posttag in data["posts_tags"]:
+ posttags[posttag["post_id"]].append(tags[posttag["tag_id"]])
+
+ for post in data['posts']:
+ draft ="true"if post["status"] =="draft"else"false"
+ ts =int(post["created_at"]) /1000
+
+ banner =""if post["image"] isNoneelse post["image"]
+ # /content/ should not be part of uri anymore
+ banner = re.sub("^.*/content[s]?/", "/", banner)
+
+ target = path.join(hugodir, "content/post",
+ "{}.md".format(post["slug"]))
+
+ aliases = ["/{}/".format(post["slug"])]
+
+ print("Migrating '{}' to {}".format(post["title"],
+ target))
+
+ hugopost = _post.format(markdown=post["markdown"],
+ title=post["title"],
+ draft=draft,
+ slug=post["slug"],
+ date=date.fromtimestamp(ts).isoformat(),
+ tags=posttags[post["id"]],
+ banner=banner,
+ aliases=aliases)
+
+ # this is no longer relevant
+ hugopost = hugopost.replace("```language-", "```")
+ # /content/ should not be part of uri anymore
+ hugopost = hugopost.replace("/content/", "/")
+ hugopost = re.sub("^.*/content[s]?/", "/", hugopost)
+
+ withopen(target, 'w') as fp:
+ print(hugopost, file=fp)
+
+
+defmain():
+ parser = argparse.ArgumentParser(
+ description="Migrate an exported Ghost blog to Hugo")
+ req = parser.add_argument_group(title="required arguments")
+ req.add_argument("-f", "--file", help="JSON file exported from Ghost",
+ required=True)
+ req.add_argument("-d", "--dir", help="Directory (root) of Hugo site",
+ required=True)
+
+ args = parser.parse_args()
+
+ migrate(args.file, args.dir)
+
+
+if__name__=="__main__":
+ main()
+
+
+
Next post, I might write about what changes I made to the theme, and
+some nifty Nginx tricks you can use to stay compatible with old links.
+]]>
+
+
+
+ http://localhost:1313/2016/05/set-refresh-rate-of-screen-from-script/
+
+ Set refresh rate of screen from script
+ 2016-05-18T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ Getting a great new 100 Hz Ultra Wide monitor does not come without its share of tweaking. So it turns out that the refresh you set on your monitor in Nvidia settings (as explained in a previous post does not apply to all the display ports. They apparently count as different screens with different settings or something.
+
+
So, here’s a handy script which you can add to your window manager’s autostart applications to set the refresh rate and resolution of your screen, regardless of which actual port you use:
+
#!/bin/bash -eu
+RES="3440x1440"
+RR="100"
+
+# Do for every output, so that it doesn't matter where you plug in
+# your monitor.
+for output in $(xrandr | grep "DP-" | sed -e "s/\(DP-.\).*/\1/"); do
+ echo"Trying to set mode on $output"
+ if xrandr --output "$output" --mode "$RES" -r "$RR"; then
+ echo"Success: $RES$RR Hz set on $output"
+ fi
+done
+
+
+
It iterates over all the display ports on your graphics card, so it doesn’t matter where you plug your monitor in.
+
+
In XFCE, you’d add this script to Application Autostart:
+
+
+]]>
+
+
+
+ http://localhost:1313/2016/04/fixing-the-up-button-in-python-shell-history/
+
+ Fixing the up button in Python shell history
+ 2016-04-02T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ In case your python/ipython shell doesn’t have a working history, e.g. pressing ↑ only prints some nonsensical ^[[A, then you are missing either the readline or ncurses library.
+
+
+
+
Ipython is more descriptive that something is wrong, but if you’re in the habit of mostly using python as a quick calculator, you might never notice:
+
+
+]]>
+
+
+
+ http://localhost:1313/2016/03/nvidia-gsync-on-linux/
+
+ Nvidia G-Sync and Linux
+ 2016-03-05T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ After getting a fancy new monitor with G-Sync support, I was eager to try it out in my Linux gaming setup. While Nvidia fully supports G-Sync in their Linux drivers, it turns out that other components of the system can get in the way. As explained by a post on the Nvidia forums:
+
+
+
For G-SYNC to work, the application has to be able to flip and the symptoms you’re describing here sound like it’s not able to flip in your configuration. There are a variety of reasons why flipping might not be working, but the most likely culprits here are either the compositor getting in the way, or the game not being completely full-screen. The full-screen requirement includes the game being completely unoccluded, so if your window manager is drawing something on top of the game, even just by one pixel, it will prevent flipping. Full-screen also means that it has to cover the entire X screen, which includes both monitors if you have them both enabled.
+
+
Can you please try a different window manager / desktop environment to see if the behavior changes?
+
+
+
Since only a minority of PC-gamers are actually on Linux, and only a minority of those actually have G-Sync capable monitors, Googling for assistance was… challenging. So, for any other Linux gamers out there, here is a short guide on how to enable G-Sync and verify that it works. Some of the steps are XFCE specific, as this is my window manager of choice on my gaming PC. If you are using a different window manager, you’ll have to look through your options to find the equivalent settings.
+
+
Nvidia settings
+
+
+
Sync to VBlank: Optional
+
Allow Flipping: Required
+
Allow G-SYNC: Required
+
Enable G-SYNC Visual Indicator: Optional
+
+
+
The only two required settings are flipping and G-Sync, the others are optional. Enabling Sync to VBlank (VSync) in combination with G-Sync only prevents the GPU from generating an FPS beyond your monitor’s max refresh rate (which you can’t see anyway). It is turned off below the max refresh rate when G-Sync is enabled.
+
+
The visual indicator is useful here to see that G-Sync is working. If all goes well, you should see a green “G-SYNC” text in the corner when running a game.
+
+
+
+
Disable compositor
+
+
As mentioned in the forum post, a compositor will prevent G-Sync from activating because essentially something is rendering above the game. The same reason prevents G-Sync from working in Window mode (unlike Windows, where G-Sync does not require fullscreen).
+
+
For XFCE, go to Window Manager Tweaks under Settings
+
+
+
Then under the Compositor tab, make sure the compositor is disabled
+
+
+
In addition, depending on your setup, make sure you don’t have things like Compton or Compiz enabled.
+
+
Start a game in fullscreen
+
+
As mentioned, you must run the game in fullscreen mode. G-Sync does not work with window mode in Linux.
+
+
I did notice that there are games which do not enable G-Sync. One example is “Cities: Skylines”. So make sure to try several games if you don’t see the G-Sync logo.
+
+
A good candidate here is Dota 2 since it is free to play. Dota 2 running in “Desktop-Friendly Fullscreen” does enable G-Sync. As does Portal 2 and XCOM 2.
+]]>
+
+
+
+ http://localhost:1313/2014/12/encrypt-a-btrfs-raid5-array-in-place/
+
+ Encrypt a BTRFS RAID5-array in-place
+ 2014-12-28T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ When I decided I needed more disk space for media and virtual machine (VM) images, I decided to throw some more money at the problem and get three 3TB hard drives and run BTRFS in RAID5. It’s still somewhat experimental, but has proven very solid for me.
+
+
RAID5 means that one drive can completely fail, but all the data is still intact. All one has to do is insert a new drive and the drive will be reconstructed. While RAID5 protects against a complete drive failure, it does nothing to prevent a single bit to be flipped to due cosmic rays or electricity spikes.
+
+
BTRFS is a new filesystem for Linux which does what ZFS does for BSD. The two important features which it offers over previous systems is: copy-on-write (COW), and bitrot protection. See, when running RAID with BTRFS, if a single bit is flipped, BTRFS will detect it when you try to read the file and correct it (if running in RAID so there’s redundancy). COW means you can take snapshots of the entire drive instantly without using extra space. Space will only be required when stuff change and diverge from your snapshots.
+
+
See Arstechnica for why BTRFS is da shit for your next drive or system.
+
+
What I did not do at the time was encrypt the drives. Linux Voice #11 had a very nice article on encryption so I thought I’d set it up. And because I’m using RAID5, it is actually possible for me to encrypt my drives using dm-crypt/LUKS in-place, while the whole shebang is mounted, readable and usable :)
+
+
Some initial mistakes meant I had to actually reboot the system, so I thought I’d write down how to do it correctly. So to summarize, the goal is to convert three disks to three encrypted disks. BTRFS will be moved from using the drives directly, to using the LUKS-mapped.
+
+
Unmount the raid system (time 1 second)
+
+
Sadly, we need to unmount the volume to be able to “remove” the drive. This needs to be done so the system can understand that the drive has “vanished”. It will only stay unmounted for about a minute though.
+
+
sudo umount /path/to/vol
+
+
+
This is assuming you have configured your fstab with all the details. For example, with something like this (ALWAYS USE UUID!!)
+
+
# BTRFS Systems
+UUID="ac21dd50-e6ee-4a9e-abcd-459cba0e6913" /mnt/btrfs btrfs defaults 0 0
+
+
+
Note that no modification of the fstab will be necessary if you have used UUID.
+
+
Encrypt one of the drives (time 10 seconds)
+
+
Pick one of the drives to encrypt. Here it’s /dev/sdc:
+
+
sudo cryptsetup luksFormat -v /dev/sdc
+
+
+
Open the encrypted drive (time 30 seconds)
+
+
To use it, we have to open the drive. You can pick any name you want:
+
+
sudo cryptsetup luksOpen /dev/sdc DRIVENAME
+
+
+
To make this happen on boot, find the new UUID of /dev/sdc with blkid:
+
+
sudo blkid
+
+
+
+
+
So for me, the drive has a the following UUID:f5d3974c-529e-4574-bbfa-7f3e6db05c65. Add the following line to /etc/crypttab with your desired drive name and your UUID (without any quotes):
The final step is to remove the old drive. We can use the special name missing to remove it:
+
+
sudo btrfs device delete missing /path/to/vol
+
+
+
This can take a really long time, and by long I mean ~15 hours if you have a terrabyte of data. But, you can still use the drive during this process so just be patient.
+
+
+
+
For me it took 14 hours 34 minutes. The reason for the delay is because the delete command will force the system to rebuild the missing drive on your new encrypted volume.
+
+
Next drive, rinse and repeat
+
+
Just unmount the raid, encrypt the drive, add it back and delete the missing. Repeat for all drives in your array. Once the last drive is done, unmount the array and remount it without the -o degraded option. Now you have an encrypted RAID array.
+]]>
+
+
+
+ http://localhost:1313/2014/08/making-an-rss-reader-app/
+
+ Making an RSS reader app
+ 2014-08-28T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ So I’ve been busy building my own RSS reader for the last few weeks. My motivation to make this app is because I got angry at gReader for displaying fullscreen-ads. The source is available on GitHub.
+
+
I started with an idea of targeting Android-L, but because it’s only in preview any app targeting L will be completely incompatible with earler versions. Hence I was forced to refrain from using the new RecyclerView which I really liked. In general I’ve been stealing as much code as possible from the Google-IO app.
+
+
It’s early still, but here are two screenshots of current progress:
+
+
+
+
+
+
To parse RSS feeds I have forked Simplistic-RSS by ShirwaM. To display images I am using Picasso by Square (awesome library). I don’t have any intention of uploading this app to the Play store at this time, at least not until I feel that it is fairly stable and feature complete. I am building it all for myself as this is the only kind of app which I actually use everyday. I figure I can talk about the difficulties that I encounter and how to solve them. So today’s topic will be:
+
+
Displaying formatted text with images
+
+
RSS feeds generally have stories formatted in HTML. For example, see the RSS feed of this blog. This is good because it means all we need to do is decode it and display it. You could use a WebView, but that would be unacceptably ugly and disgusting for an app of mine. A nicer solution is to use a normal TextView. You can actually format HTML easily and display it with:
This simple act gets you most of the way. Here’s what a story looks like with this:
+
+
+
+
+
+
Notice that in the first image, the image is missing and you don’t see that there is a list in the beginning. In the second image, the source code has no special formatting and it’s hard to tell when it starts or stops.
+
+
fromHtml is great, but it is missing functionality to handle some tags. Lucky for us, it is possible to hand it some tagHandlers for those cases. Because I am downloading images, I do the formatting in a background thread using a Loader. To this end I created the ImageTextLoader. What it does instead is:
Where the imageHandler is really simple (notice that I use Picasso to get the image from the network):
+
imgThing =new Html.ImageGetter(){
+ /**
+ * This methos is called when the HTML parser encounters an
+ * <img> tag. The <code>source</code> argument is the
+ * string from the "src" attribute; the return value should be
+ * a Drawable representation of the image or <code>null</code>
+ * for a generic replacement image. Make sure you call
+ * setBounds() on your Drawable if it doesn't already have
+ * its bounds set.
+ *
+ * @param source
+ */
+ @Override
+ public Drawable getDrawable(final String source){
+ Drawable d =null;
+ try{
+ final Bitmap b = Picasso.with(appContext).load(source).get();
+ // Get original size
+ int w = b.getWidth();
+ int h = b.getHeight();
+ // Shrink if big
+ if(w > maxSize.x|| h > maxSize.y){
+ Point newSize = scaleImage(w, h);
+ w = newSize.x;
+ h = newSize.y;
+ }
+ // Need to return a drawable
+ d =new BitmapDrawable(appContext.getResources(), b);
+ d.setBounds(0,0, w, h);
+ }catch(IOException e){
+ Log.e("JONAS",""+ e.getMessage());
+ }
+ return d;
+ }
+ };
+
+
+
The tag handler contains a bit more code, and I won’t paste all of it here. The tags which are handled can be seen in handleTag:
Note that fromHtml only notifies your handler about img-tags when they have ended, so I use that to insert a newline after each image. I would have liked to use it to get the configured size of the image, but that will have to wait for another day. For code-tags, I reduce the size of the text and make it Monospace:
+
// Source code
+privatevoidhandleCode(final Editable text,
+ finalboolean start){
+ // Should be monospace
+ if(start){
+ start(text,new Monospace());
+ start(text,new RelativeSize());
+ }else{
+ end(text, Monospace.class,
+ new TypefaceSpan("monospace"));
+ end(text, RelativeSize.class,
+ new RelativeSizeSpan(0.8f));
+ }
+}
+
+
+
The start and end methods were simply stolen straight from android.Html.
+
+
Result
+
+
Here’s the result using the added tagHandlers:
+
+
+
+
+
+
Handling clicks on links
+
+
Thankfully I had already solved the issue of clickable spans in NoNonsense Notes. See [ReaderFragment]() for this:
+
// Catch clicks on links
+mBodyTextView.setOnTouchListener(new View.OnTouchListener(){
+ @Override
+ publicbooleanonTouch(final View v,
+ final MotionEvent event){
+ TextView widget =(TextView) v;
+ Object text = widget.getText();
+ if(text instanceof Spanned){
+ Spanned buffer =(Spanned) text;
+
+ int action = event.getAction();
+
+ if(action == MotionEvent.ACTION_UP||
+ action == MotionEvent.ACTION_DOWN){
+ int x =(int) event.getX();
+ int y =(int) event.getY();
+
+ x -= widget.getTotalPaddingLeft();
+ y -= widget.getTotalPaddingTop();
+
+ x += widget.getScrollX();
+ y += widget.getScrollY();
+
+ Layout layout = widget.getLayout();
+ int line = layout.getLineForVertical(y);
+ int off = layout.getOffsetForHorizontal(line, x);
+
+ ClickableSpan[] link =
+ buffer.getSpans(off, off, ClickableSpan.class);
+
+ // Cant click to the right of a span,
+ // if the line ends with the span!
+ if(x > layout.getLineRight(line)){
+ // Don't call the span
+ }elseif(link.length!=0){
+ link[0].onClick(widget);
+ returntrue;
+ }
+ }
+ }
+ returnfalse;
+ }
+ });
+
+
+
Thus clicking on links in the TextView will open them in the browser. You could do whatever you want instead of calling link[0].onClick() however.
+
+
That’s it for today. I’ll write more about other pieces of the app soon. Things like how the database is structured or how to use ExpandableListView.
+]]>
+
+
+
+ http://localhost:1313/2014/06/building-python-wheels-for-windows/
+
+ Building Python wheels for Windows
+ 2014-06-04T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ One group in particular suffers from lack of package management in Windows (as I griped about here): developers. This post will largely be a big howto on how to build Python packages with Fortran/C-extensions (especially Fortran extensions seem problematic on Windows). You’d think that something like that would be clearly explained somewhere. So did I, and I was wrong. So here is my guide to building Python packages with native extensions (both C and Fortran) on Windows.
+
+
Installing Python packages
+
+
The lack of a compiler means most Windows users can’t do what *nix users do when faced with a package containing some c or fortran extensions:
+
+
python setup.py install
+
+
+
Or if it’s publicly available on PyPi for example:
+
+
pip install package
+
+
+
pip will download the source, and on any system with a compiler, compile it, then install it. So it becomes necessary to provide pre-built binaries for Windows users who don’t have a compiler. Something which no one offers a concise explanation of… until now that is. If you upload your package to PyPi, once you have followed this guide, even Windows users will be able to do pip install package.
+
+
1. Set up a Windows machine
+
+
To build Windows binaries you will need access to a Windows machine. If you don’t have a copy of Windows lying around to install in a virtual machine, you can create a free virtual machine on Amazon with Windows Server 2012. Selecting the most basic options will be fine and the machine will be free for atleast a year, at which point you can pay the few dollars per year or register for another free account.
+
+
Another note: make sure to use 64-bit Windows (Server 2012 only comes in 64-bit versions).
+
+
2. Install 32-bit compilers
+
+
Don’t ask me why Microsoft didn’t want to ship the 64-bit compiler together with the 32-bit one… The versions here are final. You cannot use newer compilers. In other words, don’t get Visual Studio 2012 and expect it to work… It’s a simple fact that you need to compile your packages with the same compiler as was used to build Python itself.
+
+
Install Visual C++ 2010 Express (for Python3)
+
+
Python3.3⁄3.4 is built with 2010 and hence all extensions must be as well.
For building Python2.7, 2008 version is required. Google for “Visual C++ 2008 Express” or try this link
+
+
3. Install 64-bit compilers
+
+
Why did you do this Microsoft, why?!
+
+
Install the Windows SDK for Visual Studio 2010 (for Python 3)
+
+
The free Visual C++ 2010 Express compiler does not include 64-bit support. That is what we need the SDK to provide. Google for “Microsoft Windows SDK for Windows 7 and .NET Framework 4” or try this link. You need the Windows 7 SDK even if you are running Windows 8. And make sure it is the version with .NET Framework 4, the one with .NET Framework 3 is for Visual Studio 2008.
+
+
Note: if you have C++ 2010 Redistributables installed, you might have
+to uninstall them first or this install might fail. It might work even if some parts of the installer fails since you only need the compiler bits.
+
+
Install the Windows SDK for Visual Studio 2008 for (Python 2.7)
+
+
Same story for Visual C++ 2008 Express which is used for Python2.7. Find “Microsoft Windows SDK for Windows 7 and .NET Framework 3.5” or try this link
Download both the 32-bit and 64 bit versions. Python2 or Python3 versions do not matter as we will be using conda environments, but you do need both 32-bit and 64-bit versions! During the installation procedure, I recommend you select the following:
+
+
+
Install for current user only (this is the default)
+
Install into: Users\YOURNAME\Anaconda and Users\YOURNAME\Anaconda-64 respectively
+
Do NOT modify the PATH, this will be done explicitly in the build script
+
Do NOT make it the default Python, we need to be able to switch easily
+
+
+
5. Create the environments
+
+
Do this for both the 32-bit and 64-bit versions.
+
+
Open a command line window and navigate to Users\YOURNAME\Anaconda\Scripts (and same for Anaconda-64 later) (Protip: use the file browser to get to the directory then shift-click
+somewhere and select ‘open command line here’).
Remember to repeat that process for the 64-bit/32-bit version as well!
+
+
6. Install git
+
+
This has nothing to do with the build process, but I will assume that you want to do git clone at some point. Download it here. In this case you absolutely DO want it to modify your PATH.
+
+
Actually building stuff
+
+
Believe it or not, but you are actually ready to compile your package. Due to multiple compilers and all that, I have made a bat-file which builds wheels for Python 2.7, 3.3 and 3.4, both for 32-bit and 64-bit:
+
+
+
+
Edit the information at the top. Now assuming everything was installed in the right place, you should just have to double click the bat-file and have built the wheel files which you can then upload to PyPi.
+
+
Building wheels automatically on commits
+
+
Having to do this manually is a drag and so I have also come up with a fully automated solution using Jenkins, a continuous integration system which monitors your git-repo and clones, builds new files as changes are committed.
+
+
Install Jenkins
+
+
Just download the native package from [jenkins-ci.org]().
+
+
Configure Jenkins
+
+
Once Jenkins is installed, it will start itself as a Windows service. Open you web browser and head to [http://localhost:8080](). You then want to go to Manage Jenkins, followed by Manage Plugins:
+
+
+
+
Go to the available tab, and filter on “GIT plugin” (already installed in the screenshot):
+
+
+
+
OK, now go back to the top (click Jenkins in upper left) and create a New Item. You want to select “free-style software project” and give it a name:
+
+
+
+
First thing you need to configure is the git source. Scroll down to Source Code Management, select git, and fill in the repo-address. If you input a public GitHub address you don’t need any credentials:
+
+
+
+
I also recommend you add one Additional behaviour: Clean before checkout to guarantee that builds do not affect each other:
+
+
+
+
Next you can setup the automatic behaviour. The easiest way is to have Jenkins poll GitHub every X minutes and check if there’s a change. Here I have configured Jenkins to check every 15 minutes:
+
+
+
+
So Jenkins knows what to do when it detects a change, you want to add a Build step, specifically Execute a Windows batch file:
+
+
+
+
In the box, just copy paste the batch file I included above. Fill in the paths to your Anaconda installs and set the repo to:
+
+
set PKG_REPO=.
+
+
+
+
+
Jenkins will handle the cloning and simply execute the script in the correct directory. As a final configuration step, tell Jenkins to archive build artifacts under Post-Build Actions since you want to be able to download the wheel files:
+
+
+
+
If you don’t upload wheels to PyPi, then you can install wheels with pip from anywhere with:
Now you’re all done. You can manually trigger builds in the left menu. Each build will have links for you to download the wheelfiles and the job’s main page will always display the links to the latest artifacts.
+
+
+
+
There are so many plugins and options available for Jenkins so play around if you want even more stuff. Some things you can do include:
+
+
+
Automatically uploading artifacts to an FTP/SSH-server.
+
Sending E-mail notifications on success/failures.
+
Build only specific branches/tags.
+
Make the server public and tie login to GitHub accounts.
+]]>
+
+
+
+ http://localhost:1313/2014/05/people-have-been-trained-to-install-malware/
+
+ People have been trained to install malware
+ 2014-05-11T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ disclaimer: I get angry when I have to fix Windows. Expect explicit content. You have been warned.
+
+
Being computer literate can be something of a curse. Anyone with even the most rudimentary skill set has probably sometime gotten asked if they could help someone with their computer. The other day I got asked if I could help, let’s call him Roger, as he was having some problems with Windows Update. The initial symptoms could be clearly relayed by Roger:
+
+
+
The update gets to 30% then it just stops and reboots.
+
+
+
First step is always to recreate the problem and see it in action. No problem there. Telling Windows Update to proceed resulted in precisely the described result, after a fair bit of time waiting for a frigging restore point to be created. I’d read about the failing 8.1 upgrade so I half expected it to be Microsoft’s fault, even though this machine was running Windows 7. Roger didn’t need anything from the update so worst case I thought, I’ll just disable Windows Update entirely.
+
+
First things first
+
+
Once I had confirmed that there was a problem, I begun by clearing out various crapware that was installed, mainly different kinds of toolbars and some video player that seemed to be a repackaging of VLC mainly. It’s hard to see why this software is installed or where it came from. Roger uses only Word and the browser. I figure he’s the sort that clicks on various malicious ads for some reason. At least Roger has been coerced into using Chrome instead of IE…
+
+
So I uninstall everything I don’t recognize and reboot, because rebooting is something you do a lot in Windows land… OK, maybe the update will work now without all the crap installed. It’s worth a try at least.
+
+
+
Initiate the update… It creates a restore point… wait… wait… wait…. Reboot. Update still fails at 30%.
+
+
+
Trial and error
+
+
Now the real work begins. Maybe Microsoft screwed up their patches or something? There were 5 security patches waiting to be installed so let’s try them one by one.
+
+
+
First one fails.
+
Second one fails.
+
Everyone but the first and second one fails.
+
+
+
OK… Let’s just do the damn IE patches first. They also fail. And for every try, I’m forced to wait for Windows to create another damn restore point which takes several minutes. This on an almost brand new Intel NUC with an SSD.
+
+
Bored…
+
+
While waiting for the damn restore points, I am seriously considering if I can just wipe the machine and force Roger to use Linux instead. All he needs is Word. So I decide to download LibreOffice and see how their docx support is these days. Downloading 200MB takes a while on the effectively 2MBit connection. Still quicker than the now cancelled restore point. So I click through the installer, get to the progress bar, and wait. And wait. And wait.
+
+
+
Why the fuck isn’t the progress bar moving?
+
+
+
Instinctively, I open the task manager to see what the hold up is. Apparently nothing. No CPU is being used. No memory is consumed. It’s an SSD so disk speed is not an issue. Change to the services tab and same thing, nothing obvious. I try disabling the antivirus (Microsoft’s own so should be compatible right?). Good try chump, still no difference.
+
+
Second time in the task manager, I notice something though. A service which doesn’t really sound very official: safetynut. I find out where safetynut.exe lives and sure enough, it lives in something like:
+
+
+
C:\Program Files (x86)\Movie Toolbar\Safetynut
+
+
+
But I uninstalled that! Fine.. End process. To which Windows replies:
+
+
+
You don’t have permission to end this process
+
+
+
W T F
+
+
OK computer, I’m going to stop you right there. I am the administrator. I am your GOD. And as said deity, I command you to end that process!
+
+
+
God or no god, you still don’t have permission to do that
+
+
+
OK, fine, be that way. Delete C:\Program Files (x86)\Movie Toolbar\Safetynut.
+
+
+
Could not delete safetynut.dll as it is in use
+
+
+
Shaka, when the walls fell…
+
+
It’s an amazing “feature” in Windows that a program can lock a file and thus prevent you from deleting it. It’s also an amazing “feature” that the administrator can be refused the permission to do something. No recourse left but to reboot into safe mode.
+
+
To safe mode we go!
+
+
First, I go into the normal safe mode with a desktop. Still can’t delete the dll file though as it is “in use”. Time to open regedit and delete all references to safetynut from the registry. Search, delete. Rince, repeat…
+
+
Next reboot to safe mode with only a command line window. Navigate to the folder and delete the file and the folder, then reboot.
+
+
Success!
+
+
No more safetynut. Let’s try Windows Update again. Ooh, that’s a mighty fast restore point creation! And the update succeeds!
+
+
So apparently, safetynut was actively preventing Windows Update from proceeding. Roger promptly got a stern talking to about installing any software or clicking on ads/popups (I also installed adblock plus in Chrome). But it got me thinking about malware in general..
+
+
Most people are trained to install malware
+
+
In my view, none of this is the user’s fault. The fact is that Microsoft has trained everyone to install shitty software from untrusted sources. Let’s go back a few years, to the days of yore, in the time of Windows 98 and Windows 2000. If you reinstalled Windows back then, and I did a lot, then you very quickly got a routine for downloading the software you needed once Windows was installed.
+
+
First obvious things to install were the drivers for your network card, sound card and graphics card. You even possibly needed to install SATA-drivers during the actual install or the installer wouldn’t find your disk. If you did not have that on a floppy, you were screwed. But OK, you had your floppy, and you had your drivers on CD. Next you needed:
+
+
+
A browser, because Internet Explorer is still a gaping security hole
+
A firewall, because even up to XP, being exposed to the internet directly meant instant infection
+
Antivirus, anything that wasn’t Norton would do…
+
PDF-reader
+
zip/rar-extractor
+
+
+
I’d like to draw your attention to the last item. Something so mundane as a zip-extractor was not built in to Windows. XP was the first version (if I remember correctly) to include a built in zip-extractor. This specific flaw trained everyone to download Winzip or Winrar. Quite possibly, they would resort to getting a pirated serial key as well. The problem? Now users are trained to go to any website their 10-year old neighborhood tech support kid tells them to and click Download.
+
+
Here’s a screenshot of the pirate bay to illustrate (to clarify, do NOT download your software from torrent sites. It’s just an example of this behavior). The big download buttons will lead to ads, online poker or who knows. We can be quite sure that they will lead to endless evil. On the internet, never FUCKING EVER press a big styled button with the text “Download”. The link you want is the smaller green text: “get this torrent”.
+
+
+
+
Now, assuming you managed to avoid the big download buttons to download your program, you have your completely unverified .exe file or .msi file, you double click on it, and what do you get? More fucking bullshit. Here’s a screenshot of the Winzip (totally unnecessary program today) installer. Right after you agree to the Winzip Terms of Service, you get another license agreement.
+
+
+
+
How the screaming fuck are ordinary users supposed to understand that pressing Next will lead to untold horrors and pressing Decline is the way to install the software they want? They won’t of course. That’s the whole point!
+
+
I bet this is the source of 99% of all malware on Windows. And the problem is that this is a perfectly acceptable way of getting software. Macs have the same problem to some minor extent. They are also being trained to download strange files from various pages. It is NOT accepted on Linux. The reason you don’t need antivirus on Linux is not because the system is more secure. All software is brittle and insecure. The vital difference is in how Linux users get their software.
+
+
The way it should be
+
+
Here’s a screenshot of the package manager in Debian:
+
+
+
+
Now let’s say I need a c++ compiler and one was not installed already. I search for “c++ compiler” and there’s clang. To this day, I have no idea how I can get a compiler on Windows.
+
+
+
+
Installing 99% of all software is super easy and reliable on Linux. All of these packages have been checked by the people working on the distro. If any package were to install a toolbar or other malware, you can bet your ass that it would be removed from the official sources. And because this is how Linux users are trained to install their software, they will have some degree of suspicion against download links on unknown websites. Installing malware becomes notably harder than installing good software.
+
+
The coming app stores
+
+
Both OS X and Windows are trying to push their users to use their “app stores”. While I have many negative things to say about them, they should hopefully reduce the included malware problem and train users to only install garbage from trusted sources.
+]]>
+
+
+
+ http://localhost:1313/2014/04/are-ipads-retarding-us/
+
+ Are iPads actually a step back?
+ 2014-04-26T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ Think what you will of the iPad, but it has been a huge success for Apple and people love it. It’s one of the few products that appealed (past-tense) to both the geeks and _hoi polloi_.
+
+
I remember watching the keynote where the iPhone was introduced and immediately I thought that’s the pad from Star-Trek TNG! I had to have it.
+Apple’s initial carrier exclusivity deals meant I had to wait for the iPhone 3g. Not only that, but because they partnered with a company I am sworned to destroy, I payed a guy in Italy to buy one unlocked and ship it to me for 7500SEK. Funny thing is that at the time I was a developer at Sony Ericsson, who did not think kindly of Apple entering their mobile domain. I got a lot of weird looks a work…
+
+
Then came the iPad. Again I’m thinking holy shit that’s awesome. At this point I had upgraded to an Android device (an HTC Legend) and had come to the conclusion that Android was far more interesting as a platform because of Apple’s restrictions on what apps can do. The customizability and capabilities on Android were far greater and as a developer, you appreciate that. However, there were no Android tablets. And there wouldn’t be for a long time.
+
+
I kept my cool though and managed to hold on to my money until the iPad 2 was released. I left early from work and lined up with other enthusiasts at the electronics store. At the time most people had no idea what they were going to do with it, me included, but I had to have it. I think my extended family clearly demonstrates how successful a product the iPad was. That same year I saw 3 iPads being gifted away (3 in a group of around 9 people!). By the next year, 3 more iPads were acquired. Everyone had to have one. It was one of those cases where you don’t get it until you see it for yourself.
+
+
From revolutionary to evolutionary
+
+
It is both a sign of how good the original product was and how little has changed that I never felt a reason to upgrade from the iPad 2.
+
+
+
The battery life was fantastic.
+
The screen size just right.
+
The resolution was good enough.
+
The speed was fine (until recently).
+
+
+
Hardware-wise, it was feature complete. The rest could be fixed in software. They never did though. The problem is iOS. Just as I abandoned the iPhone for Android, I now abandoned the iPad for a Nexus 7. There was so much potential being held back by the limitations of iOS.
+Stratechery explains some of my frustrations well. He means it as a defense in iOS’s favor though. But there is actually more to it than the limitations of iOS. Something inherent in the touch screen and the current mobile paradigm.
+
+
Limitations of the touch screen
+
+
I was playing R-Type 2 on my Nexus 10 and kept dying on the boss in the second level. And I realized that while I might get lucky and finish the level, I would never be able to play the game well due to the touch screen.
+
+
+
+
See, R-Type is a classic side-scrolling shoot-em-up. You pilot a spaceship and have to avoid enemy fire, hordes of enemies, and not crash into the roof or ceiling. It is a game based entirely on mastering the controls. You can see a good example of what I mean in this clip of a similar game called Gradius for the NES.
+
+
+
+
The problem I was having was that I kept crashing into the floor as I tried to manouever around the boss. Having played for and hour or two (and still being stuck on level 2!) I came to realize that it wasn’t I that sucked, it was the controls. I had reached the limit of what was possible (precision-wise) with a touch screen.
+
+
Noobs forever
+
+
And this is where the back-stepping begins. Growing up with NES, SNES, and a PC, I remember many older relatives noting the dexterity and precision in the thumbs of kids due to all the gaming. Video games required:
+
+
+
hand-eye-coordination
+
hand dexterity
+
concentration
+
+
+
To beat these games you needed mastery and focus. Not only was mastery required, it was the reward. The games suitable for touch screens can require neither. So tablet games will remain at a level no more advanced than snake or scrabble. (As a side note, what really can work is turn-based strategy games.)
+
+
No such thing as a touch typist
+
+
Just as serious gaming becomes impossible due to the touch interface, serious productivity suffers from the same limitations. It’s funny to see things like Microsoft Office being released for the iPad because it’s impossible to work with. Serious productivity requires the efficient inputting of language, be it English or Python. The touch keyboard is unable to let you do that. There is no such thing as a touch typist. On a tablet, everyone goes back to tapping with two fingers. There is nothing to master here (due to the lack of feedback) and so everyone will remain as noobs forever.
+
+
The dark age begins
+
+
Maybe you’re thinking to yourself:
+
+
+
so what if a touch screen isn’t ideal for everything, no input device is!
+
+
+
If you are, then I agree. Nothing can be great at everything. You use the right tool for the right job. The problem is the tremendous success of the tablet. This is where I think the geeks have a different view of where we are headed.
+
+
Geeks see the benefits of the touch screen. Its strengths, but also its weaknesses. They use it when it’s convenient. For more serious work, they move to their workstation, with keyboard and screen.
+
+
Non-geeks see the tablet as “the future”. They never liked their PC to begin with. It was just something they were forced to acquire to be able to pay their bills. They see the tablet as liberating. Geeks see the tablet as confining.
+
+
The success of the tablet amongst geeks and non-geeks combined means companies are scrambling to push everything into tablet interfaces. Apple is clearly moving towards iOS as OSX is evolving. Microsoft has already gone too far:
+
+
+
+
+
But it’s not just the tablet interface. It’s the whole mobile paradigm that is spreading. With it comes the app stores, where every app is pre-approved by the benevolent corporation that owns your soul apps and music. The corporation reserves the right to remove any app or in-app purchase it deems unworthy of your attention. Amazon did it, Apple does it all the time, and same for Microsoft.
+]]>
+
+
+
+ http://localhost:1313/2014/04/advertising-thats-not-intrusive-orly/
+
+ Advertising, that's not intrusive. Orly?
+ 2014-04-07T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ When you have apps in Google Play (and I imagine, other App stores as well), the amount of spam you receive instantly goes up by a factor of 10. Google’s spam filters are pretty well trained but every now and again something gets through.
+
+
Advertising opportunity
+
+
Today’s piece of bullshyt (I really meant to spell it like that) reads as follows (my emphasis):
+
+
+
Our premium advertisers are currently looking to buy android traffic at a very high price in apps like Nononsense Notes.
+
+
We think you can generate up to $10 CPM with their full screen ads, which are very clean. Indeed, most of our advertisers are willing to pay, on average, between $1 and $3 per installation. You’re free to display these ads whenever you want in your app so that it’s not intrusive.
+
+
+
Ads are by definition intrusive. That’s how they nag you into buying their stupid stuff. And it doesn’t matter how clean your ads are. Displaying them fullscreen is beyond intrusive. It is down right offensive.
+
+
I uninstall anything that displays obnoxious ads, be they fullscreen or notifications, and promptly give the app a one star review. I sincerely hope others afford me the same “courtesy” for my apps.
+]]>
+
+
+
+ http://localhost:1313/2014/04/convert-to-android-studio-and-gradle-today/
+
+ Convert to Android Studio and Gradle today!
+ 2014-04-07T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ Took the plunge and converted NoNonsense Notes from Ant and Eclipse to Gradle and Android Studio. It took some googling and a fair bit of frustration but in the end it was very much worth it.
+
+
+
+
Eclipse has been broken for me for about 6 months or so. So very little of it’s powerful features were available during development. The ant build worked fine but Eclipse uses its own which is mysterious and requires constant refreshes and cleaning. Often in a particular order on each library project which was a dependency.
+
+
With gradle on the other hand, if it builds in the console then it will build in Android Studio. Once again I am able to use a debugger!
+
+
I can warmly recommend people to take a day and setup some build.gradle files.
+]]>
+
+
+
+ http://localhost:1313/2014/04/dark-themes-everywhere/
+
+ Dark themes everywhere
+ 2014-04-07T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ I have come to really appreciate dark themes in the programs that I
+use. Be it any of my Android devices or my real computers, I prefer
+dark themes. In Emacs, it’s as easy as M-x load-theme wombat. And
+wombat is probably my current favourite dark theme. Dark greys
+combined with nice shades of blue, green and red. This entire web site
+is (at the time of this post) presented in the wombat colors.
+
+
Of course, a lot of time is spent in the web browser and I have come
+to understand that most web designers don’t share my love for the
+darkness. Long have I suffered in the depressing and blinding white
+backgrounds of the “Web 2.0”.
+
+
N O - M O R E
+
+
I have just come into the possession of some writings that magically
+destroys the light infestation in my life. Now I can enjoy the dark
+majestic background that is #202020 everywhere.
+
+
+
+
This is naturally possible to do in most browsers but I’ll talk about
+conkeror specifically. What’s most interesting is probably the CSS
+so you don’t have to write that yourself.
Conkeror is a web browser based on the same
+underlying tech as Firefox. What makes it unique is its Emacs-like interface. It is essentially what you imagine a good browser in Emacs would be like. Like Emacs, tweaks can be made by adding code (javascript) to its configuration files.
+
+
By default, it loads all .js files in ~/.conkerorrc/. So what you want to do is download the color-theme.js and site-css
+files/folders from Scott’s repo and put that in your .conkerorrc dir. That’s basically it, but a few additional tweaks can be done.
+
+
Fixing GitHub diff colors
+
+
GitHub must have updated their styles since Scott’s post. To fix the diff colors, the following works (replace the existing GitHub entry with this):
I always want the dark theme enabled by default. This is the main theme function (I removed all themes but the dark one as well):
+
function global_color_theme(name, key, styles) {
+ interactive_cmd ="toggle-"+ name +"-mode";
+ // Enable by default here
+ for(x in styles) {
+ register_user_stylesheet(styles[x]);
+ }
+ color_theme_toggle[name] =true;
+ // Add toggle function
+ interactive(interactive_cmd, "",
+ function (I) {
+ if (color_theme_toggle[name]) {
+ for(x in styles) {
+ unregister_user_stylesheet(styles[x]);
+ }
+
+ color_theme_toggle[name] =false;
+ } else {
+ for(x in styles) {
+ register_user_stylesheet(styles[x]);
+ }
+ color_theme_toggle[name] =true;
+ }
+ });
+ // Add a disable function
+ interactive("disable-"+name+"-theme","", function() {
+ for(x in styles) {
+ unregister_user_stylesheet(styles[x]);
+ }
+ color_theme_toggle[name] =false;
+ });
+ // Add an enable function
+ interactive("enable-"+name+"-theme","", function() {
+ for(x in styles) {
+ register_user_stylesheet(styles[x]);
+ }
+ color_theme_toggle[name] =true;
+ });
+ // I don't care for a keybinding for this
+ //define_key(default_global_keymap, key, interactive_cmd);
+ }
+
+
+
Make the Wombat theme even darker
+
+
I prefer an even darker background than the one provided. I have also learned the importance of the !important tag and semicolons in css (damn you!!!). This is incidentally the wombat css that I’m using for syntax highlighting here on the site. If you change anything don’t forget to make sure the line ends with !important (and semicolon in case of multiple attributes) or the css won’t take.
+
+
The changes are pretty much in the upper section but I re-formatted the file to make it more readable:
+]]>
+
+
+
+ http://localhost:1313/2014/04/getting-adblock-to-work-in-conkeror/
+
+ Getting Adblock to work in Conkeror
+ 2014-04-07T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ Conkeror supports firefox addons to varying degrees. I found that a good indicator is if the addon has support for Firefox 3. This means you can use Adblock 2.0. But, the GUI for selecting a filter subscription will not show. Hence the need to install Adblock 1.3 first. To get Adblock up and running in Conkeror, do the following:
+
+
+
In your rc-file, set:
+javascript
+session_pref("xpinstall.whitelist.required", false);
+
Go into preferences for Adblock and subscribe to a list, like
+Easylist. The list might complain about requiring Adblock 2 for
+some filters, which is fine since we will fix that next.
+
Now go back and download/install version 2.0.1.
+
Enjoy the web again.
+
+]]>
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_hnapp.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_hnapp.xml
new file mode 100644
index 000000000..99a901ba2
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_hnapp.xml
@@ -0,0 +1,342 @@
+
+
+ type:story score>36 -bitcoin -ethereum -cryptocurrency -blockchain -snowden -hiring -ask – hnapp
+ http://hnapp.com/rss?q=type%3Astory%20score%3E36%20-bitcoin%20-ethereum%20-cryptocurrency%20-blockchain%20-snowden%20-hiring%20-ask
+ 2018-02-15T04:47:18Z
+
+
+
+ via hnapp
+
+ hnapp
+
+ 37 – Spectre Mitigations in Microsoft's C/C++ Compiler
+ https://news.ycombinator.com/item?id=16381978
+ 2018-02-15T04:47:18Z
+ 2018-02-15T04:47:18Z
+
+
+ ENOTTY
+
+ <p>37 points, <a href="https://news.ycombinator.com/item?id=16381978">1 comment</a></p>
+
+
+ 94 – How to find hidden cameras (2002) [pdf]
+ https://news.ycombinator.com/item?id=16381592
+ 2018-02-15T02:58:15Z
+ 2018-02-15T02:58:15Z
+
+
+ lainon
+
+ <p>94 points, <a href="https://news.ycombinator.com/item?id=16381592">8 comments</a></p>
+
+
+ 39 – Intel Expands Bug Bounty Program
+ https://news.ycombinator.com/item?id=16381447
+ 2018-02-15T02:19:14Z
+ 2018-02-15T02:19:14Z
+
+
+ taspeotis
+
+ <p>39 points, <a href="https://news.ycombinator.com/item?id=16381447">16 comments</a></p>
+
+
+ 75 – Kotlin/Native v0.6 is Here
+ https://news.ycombinator.com/item?id=16381375
+ 2018-02-15T01:59:36Z
+ 2018-02-15T01:59:36Z
+
+
+ adamnemecek
+
+ <p>75 points, <a href="https://news.ycombinator.com/item?id=16381375">17 comments</a></p>
+
+
+ 101 – Magic Leap One Video – Diffractive Waveguides Confirmed
+ https://news.ycombinator.com/item?id=16380767
+ 2018-02-14T23:58:06Z
+ 2018-02-14T23:58:06Z
+
+
+ IntronExon
+
+ <p>101 point, <a href="https://news.ycombinator.com/item?id=16380767">42 comments</a></p>
+
+
+ 52 – Startup Fathers Need to Start Taking Parental Leave
+ https://news.ycombinator.com/item?id=16380509
+ 2018-02-14T23:21:57Z
+ 2018-02-14T23:21:57Z
+
+
+ coloneltcb
+
+ <p>52 points, <a href="https://news.ycombinator.com/item?id=16380509">7 comments</a></p>
+
+
+ 40 – Deep CNNs for Image Classification: A Comprehensive Review
+ https://news.ycombinator.com/item?id=16380412
+ 2018-02-14T23:09:18Z
+ 2018-02-14T23:09:18Z
+
+
+ gwern
+
+ <p>40 points, <a href="https://news.ycombinator.com/item?id=16380412">0 comments</a></p>
+
+
+ 600 – Email is your electronic memory
+ https://news.ycombinator.com/item?id=16380345
+ 2018-02-14T22:59:19Z
+ 2018-02-14T22:59:19Z
+
+
+ brongondwana
+
+ <p>600 points, <a href="https://news.ycombinator.com/item?id=16380345">142 comments</a></p>
+
+
+ 71 – Netflix is getting huge, but can it get great?
+ https://news.ycombinator.com/item?id=16380288
+ 2018-02-14T22:52:32Z
+ 2018-02-14T22:52:32Z
+
+
+ jv22222
+
+ <p>71 point, <a href="https://news.ycombinator.com/item?id=16380288">129 comments</a></p>
+
+
+ 263 – MPEG-2 Patents Have Expired
+ https://news.ycombinator.com/item?id=16379939
+ 2018-02-14T22:06:37Z
+ 2018-02-14T22:06:37Z
+
+
+ symisc_devel
+
+ <p>263 points, <a href="https://news.ycombinator.com/item?id=16379939">125 comments</a></p>
+
+
+ 42 – Capitalism will eat democracy, unless we speak up
+ https://news.ycombinator.com/item?id=16379838
+ 2018-02-14T21:56:40Z
+ 2018-02-14T21:56:40Z
+
+
+ monsieurpng
+
+ <p>42 points, <a href="https://news.ycombinator.com/item?id=16379838">4 comments</a></p>
+
+
+ 78 – Facebook is pushing its data-tracking Onavo VPN within its main mobile app
+ https://news.ycombinator.com/item?id=16379464
+ 2018-02-14T21:18:49Z
+ 2018-02-14T21:18:49Z
+
+
+ evo_9
+
+ <p>78 points, <a href="https://news.ycombinator.com/item?id=16379464">20 comments</a></p>
+
+
+ 165 – Utility poles
+ https://news.ycombinator.com/item?id=16379340
+ 2018-02-14T21:03:17Z
+ 2018-02-14T21:03:17Z
+
+
+ pavel_lishin
+
+ <p>165 points, <a href="https://news.ycombinator.com/item?id=16379340">162 comments</a></p>
+
+
+ 62 – Algorithms, Etc. (2015)
+ https://news.ycombinator.com/item?id=16379236
+ 2018-02-14T20:50:01Z
+ 2018-02-14T20:50:01Z
+
+
+ sarosh
+
+ <p>62 points, <a href="https://news.ycombinator.com/item?id=16379236">6 comments</a></p>
+
+
+ 57 – Tesla confirms having produced its 300,000th electric car
+ https://news.ycombinator.com/item?id=16378989
+ 2018-02-14T20:17:20Z
+ 2018-02-14T20:17:20Z
+
+
+ fmihaila
+
+ <p>57 points, <a href="https://news.ycombinator.com/item?id=16378989">27 comments</a></p>
+
+
+ 442 – Facebook spamming users via their 2FA phone numbers
+ https://news.ycombinator.com/item?id=16378888
+ 2018-02-14T20:04:59Z
+ 2018-02-14T20:04:59Z
+
+
+ pinewurst
+
+ <p>442 points, <a href="https://news.ycombinator.com/item?id=16378888">271 comments</a></p>
+
+
+ 238 – The FBI, CIA and NSA say American citizens shouldn't use Huawei phones
+ https://news.ycombinator.com/item?id=16378846
+ 2018-02-14T20:00:06Z
+ 2018-02-14T20:00:06Z
+
+
+ daegloe
+
+ <p>238 points, <a href="https://news.ycombinator.com/item?id=16378846">218 comments</a></p>
+
+
+ 175 – FBI Says Chinese Operatives Active at Scores of U.S. Universities
+ https://news.ycombinator.com/item?id=16378493
+ 2018-02-14T19:20:59Z
+ 2018-02-14T19:20:59Z
+
+
+ meri_dian
+
+ <p>175 points, <a href="https://news.ycombinator.com/item?id=16378493">172 comments</a></p>
+
+
+ 690 – Let's Learn About Waveforms
+ https://news.ycombinator.com/item?id=16378458
+ 2018-02-14T19:17:35Z
+ 2018-02-14T19:17:35Z
+
+
+ tomduncalf
+
+ <p>690 points, <a href="https://news.ycombinator.com/item?id=16378458">93 comments</a></p>
+
+
+ 134 – Monero Declares War on ASIC Manufacturers
+ https://news.ycombinator.com/item?id=16378417
+ 2018-02-14T19:12:51Z
+ 2018-02-14T19:12:51Z
+
+
+ Osiris
+
+ <p>134 points, <a href="https://news.ycombinator.com/item?id=16378417">120 comments</a></p>
+
+
+ 46 – Google Will Block Spammy Ads (Just Not Many of Its Own)
+ https://news.ycombinator.com/item?id=16378296
+ 2018-02-14T19:01:04Z
+ 2018-02-14T19:01:04Z
+
+
+ rayuela
+
+ <p>46 points, <a href="https://news.ycombinator.com/item?id=16378296">22 comments</a></p>
+
+
+ 151 – Ad Companies Love Google’s Ad Blocker, but Hate Apple’s Privacy Features
+ https://news.ycombinator.com/item?id=16378001
+ 2018-02-14T18:27:53Z
+ 2018-02-14T18:27:53Z
+
+
+ artsandsci
+
+ <p>151 point, <a href="https://news.ycombinator.com/item?id=16378001">114 comments</a></p>
+
+
+ 128 – SpaceX hits two milestones in plan for low-latency satellite broadband
+ https://news.ycombinator.com/item?id=16377970
+ 2018-02-14T18:24:39Z
+ 2018-02-14T18:24:39Z
+
+
+ rbanffy
+
+ <p>128 points, <a href="https://news.ycombinator.com/item?id=16377970">93 comments</a></p>
+
+
+ 42 – Ember 3.0 Released
+ https://news.ycombinator.com/item?id=16377850
+ 2018-02-14T18:12:22Z
+ 2018-02-14T18:12:22Z
+
+
+ chadhietala1
+
+ <p>42 points, <a href="https://news.ycombinator.com/item?id=16377850">4 comments</a></p>
+
+
+ 234 – Launch HN: SheerlyGenius (YC W18) – Indestructible Tights from Bulletproof Fiber
+ https://news.ycombinator.com/item?id=16377751
+ 2018-02-14T17:59:34Z
+ 2018-02-14T17:59:34Z
+
+
+ kathomuth
+
+ <p>234 points, <a href="https://news.ycombinator.com/item?id=16377751">125 comments</a></p>
+
+
+ 143 – Rainbow Deployments with Kubernetes
+ https://news.ycombinator.com/item?id=16377649
+ 2018-02-14T17:48:19Z
+ 2018-02-14T17:48:19Z
+
+
+ bdimcheff
+
+ <p>143 points, <a href="https://news.ycombinator.com/item?id=16377649">36 comments</a></p>
+
+
+ 151 – Pineapple Fund Drops $1M on the Sustainable Ocean Alliance
+ https://news.ycombinator.com/item?id=16377543
+ 2018-02-14T17:36:44Z
+ 2018-02-14T17:36:44Z
+
+
+ artsandsci
+
+ <p>151 point, <a href="https://news.ycombinator.com/item?id=16377543">33 comments</a></p>
+
+
+ 354 – CSS Grid for UI Layouts
+ https://news.ycombinator.com/item?id=16377534
+ 2018-02-14T17:35:42Z
+ 2018-02-14T17:35:42Z
+
+
+ jhatax
+
+ <p>354 points, <a href="https://news.ycombinator.com/item?id=16377534">87 comments</a></p>
+
+
+ 96 – The next billion users are the future of the internet
+ https://news.ycombinator.com/item?id=16377448
+ 2018-02-14T17:26:33Z
+ 2018-02-14T17:26:33Z
+
+
+ artsandsci
+
+ <p>96 points, <a href="https://news.ycombinator.com/item?id=16377448">73 comments</a></p>
+
+
+ 83 – Show HN: A Punny 3D Interactive Valentine's Card
+ https://news.ycombinator.com/item?id=16377432
+ 2018-02-14T17:24:45Z
+ 2018-02-14T17:24:45Z
+
+
+ mcat
+
+ <p>83 points, <a href="https://news.ycombinator.com/item?id=16377432">8 comments</a></p>
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_research_rsc.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_research_rsc.xml
new file mode 100644
index 000000000..f0fadf978
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_research_rsc.xml
@@ -0,0 +1,164 @@
+
+ research!rsc
+ tag:research.swtch.com,2012:research.swtch.com
+
+ 2017-04-24T10:01:00-04:00
+
+ Russ Cox
+ https://swtch.com/~rsc
+ rsc@swtch.com
+
+
+ Glob Matching Can Be Simple And Fast Too
+ tag:research.swtch.com,2012:research.swtch.com/glob
+
+ 2017-04-24T10:00:00-04:00
+ 2017-04-24T10:01:00-04:00
+ Regular expression exponentials in another form.
+ <p class=lp>Here’s a straightforward benchmark.
Time how long it takes to run <code>ls</code> (<code>a*</code>)<sup><i>n</i></sup><code>b</code>
in a directory with a single file named <code>a</code><sup>100</sup>,
compared to running <code>ls</code> <code>|</code> <code>grep</code> (<code>a.*</code>)<sup><i>n</i></sup><code>b</code>.
Superscripts denote string repetition and parentheses are for grouping only,
so that when <i>n</i> is 3, we’re running <code>ls</code> <code>a*a*a*b</code> in a directory containing the single file <code>aaa</code>…<code>aaa</code> (100 <code>a</code>’s),
compared against <code>ls</code> <code>|</code> <code>grep</code> <code>a.*a.*a.*b</code> in the same directory.</p>
<div class=fig>
<center>
<table cellspacing=0 cellpadding=0 border=0>
<tr><td valign=bottom>
<svg width="234pt" height="151pt" viewBox="0 0 234 151"
xmlns="http://www.w3.org/2000/svg">
<defs>
<clipPath id="grid"><rect x="36.00" y="7.20" width="180.00" height="108.00"/></clipPath></defs>
<path d="M 36.00 115.20 L 36.00 7.20 M 36.00 115.20 L 216.00 115.20 M 36.00 115.20 L 36.00 120.20 M 58.50 115.20 L 58.50 120.20 M 81.00 115.20 L 81.00 120.20 M 103.50 115.20 L 103.50 120.20 M 126.00 115.20 L 126.00 120.20 M 148.50 115.20 L 148.50 120.20 M 171.00 115.20 L 171.00 120.20 M 193.50 115.20 L 193.50 120.20 M 216.00 115.20 L 216.00 120.20 M 36.00 115.20 L 31.00 115.20 M 36.00 100.30 L 31.00 100.30 M 36.00 85.41 L 31.00 85.41 M 36.00 70.51 L 31.00 70.51 M 36.00 55.61 L 31.00 55.61 M 36.00 40.72 L 31.00 40.72 M 36.00 25.82 L 31.00 25.82 M 36.00 10.92 L 31.00 10.92 " fill="transparent" stroke="black"/>
<text x="36.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">0</text>
<text x="58.50" y="120.20" dy="1em" text-anchor="middle" font-size="10">1</text>
<text x="81.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">2</text>
<text x="103.50" y="120.20" dy="1em" text-anchor="middle" font-size="10">3</text>
<text x="126.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">4</text>
<text x="148.50" y="120.20" dy="1em" text-anchor="middle" font-size="10">5</text>
<text x="171.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">6</text>
<text x="193.50" y="120.20" dy="1em" text-anchor="middle" font-size="10">7</text>
<text x="216.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">8</text>
<text x="31.00" y="115.20" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">0</text>
<text x="31.00" y="100.30" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">1</text>
<text x="31.00" y="85.41" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">2</text>
<text x="31.00" y="70.51" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">3</text>
<text x="31.00" y="55.61" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">4</text>
<text x="31.00" y="40.72" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">5</text>
<text x="31.00" y="25.82" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">6</text>
<text x="31.00" y="10.92" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">7</text>
<text x="126.00" y="115.20" text-anchor="middle" font-size="11" dy="2.5em">pattern size <tspan style="font-style: italic">n</tspan></text>
<g transform="translate(36.00 61.20) rotate(-90)"><text x="0" y="0" text-anchor="middle" font-size="11" dy="-2em">time (minutes)</text></g>
<g clip-path="grid">
<path d="M 36.00 115.20 L 58.50 115.20 L 81.00 115.20 L 103.50 115.20 L 126.00 115.20 L 148.50 115.16 L 171.00 114.60 L 193.50 106.44 L 216.00 8.14" fill="transparent" stroke="#c00" stroke-width="2.0"/>
</g>
<text x="193.50" y="25.82" text-anchor="end" dy="0.3em" font-size="11"><tspan style="font-family: 'Inconsolata', monospace">ls</tspan></text>
</svg>
<td width=20>
<td valign=bottom>
<svg width="234pt" height="151pt" viewBox="0 0 234 151"
xmlns="http://www.w3.org/2000/svg">
<defs>
<clipPath id="grid"><rect x="36.00" y="7.20" width="180.00" height="108.00"/></clipPath></defs>
<path d="M 36.00 115.20 L 36.00 7.20 M 36.00 115.20 L 216.00 115.20 M 36.00 115.20 L 36.00 120.20 M 45.00 115.20 L 45.00 118.20 M 54.00 115.20 L 54.00 120.20 M 63.00 115.20 L 63.00 118.20 M 72.00 115.20 L 72.00 120.20 M 81.00 115.20 L 81.00 118.20 M 90.00 115.20 L 90.00 120.20 M 99.00 115.20 L 99.00 118.20 M 108.00 115.20 L 108.00 120.20 M 117.00 115.20 L 117.00 118.20 M 126.00 115.20 L 126.00 120.20 M 135.00 115.20 L 135.00 118.20 M 144.00 115.20 L 144.00 120.20 M 153.00 115.20 L 153.00 118.20 M 162.00 115.20 L 162.00 120.20 M 171.00 115.20 L 171.00 118.20 M 180.00 115.20 L 180.00 120.20 M 189.00 115.20 L 189.00 118.20 M 198.00 115.20 L 198.00 120.20 M 207.00 115.20 L 207.00 118.20 M 216.00 115.20 L 216.00 120.20 M 36.00 115.20 L 31.00 115.20 M 36.00 100.30 L 31.00 100.30 M 36.00 85.41 L 31.00 85.41 M 36.00 70.51 L 31.00 70.51 M 36.00 55.61 L 31.00 55.61 M 36.00 40.72 L 31.00 40.72 M 36.00 25.82 L 31.00 25.82 M 36.00 10.92 L 31.00 10.92 " fill="transparent" stroke="black"/>
<text x="36.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">0</text>
<text x="54.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">10</text>
<text x="72.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">20</text>
<text x="90.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">30</text>
<text x="108.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">40</text>
<text x="126.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">50</text>
<text x="144.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">60</text>
<text x="162.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">70</text>
<text x="180.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">80</text>
<text x="198.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">90</text>
<text x="216.00" y="120.20" dy="1em" text-anchor="middle" font-size="10">100</text>
<text x="31.00" y="115.20" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">0</text>
<text x="31.00" y="100.30" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">1</text>
<text x="31.00" y="85.41" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">2</text>
<text x="31.00" y="70.51" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">3</text>
<text x="31.00" y="55.61" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">4</text>
<text x="31.00" y="40.72" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">5</text>
<text x="31.00" y="25.82" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">6</text>
<text x="31.00" y="10.92" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">7</text>
<text x="126.00" y="115.20" text-anchor="middle" font-size="11" dy="2.5em">pattern size <tspan style="font-style: italic">n</tspan></text>
<g transform="translate(36.00 61.20) rotate(-90)"><text x="0" y="0" text-anchor="middle" font-size="11" dy="-2em">time (ms)</text></g>
<g clip-path="grid">
<path d="M 36.00 93.76 L 37.80 93.21 L 39.60 93.10 L 41.40 92.93 L 43.20 92.66 L 45.00 92.50 L 46.80 92.28 L 48.60 92.03 L 50.40 91.81 L 52.20 91.62 L 54.00 91.35 L 55.80 91.06 L 57.60 90.90 L 59.40 90.74 L 61.20 90.32 L 63.00 90.05 L 64.80 89.95 L 66.60 89.57 L 68.40 89.44 L 70.20 89.05 L 72.00 88.75 L 73.80 88.46 L 75.60 87.87 L 77.40 87.59 L 79.20 87.39 L 81.00 87.12 L 82.80 86.91 L 84.60 86.52 L 86.40 86.22 L 88.20 85.47 L 90.00 85.26 L 91.80 85.04 L 93.60 84.61 L 95.40 84.28 L 97.20 83.87 L 99.00 83.38 L 100.80 83.05 L 102.60 82.74 L 104.40 82.29 L 106.20 81.94 L 108.00 81.48 L 109.80 81.22 L 111.60 80.53 L 113.40 80.13 L 115.20 79.52 L 117.00 79.08 L 118.80 78.61 L 120.60 78.38 L 122.40 77.72 L 124.20 77.39 L 126.00 76.75 L 127.80 76.17 L 129.60 75.98 L 131.40 75.30 L 133.20 74.48 L 135.00 74.34 L 136.80 73.88 L 138.60 73.28 L 140.40 72.81 L 142.20 71.83 L 144.00 71.47 L 145.80 70.95 L 147.60 70.50 L 149.40 69.91 L 151.20 69.51 L 153.00 68.55 L 154.80 68.14 L 156.60 67.31 L 158.40 66.57 L 160.20 66.20 L 162.00 65.24 L 163.80 64.83 L 165.60 64.31 L 167.40 63.50 L 169.20 62.77 L 171.00 62.13 L 172.80 61.15 L 174.60 60.63 L 176.40 60.05 L 178.20 58.81 L 180.00 58.23 L 181.80 57.39 L 183.60 56.55 L 185.40 56.37 L 187.20 54.85 L 189.00 54.50 L 190.80 53.73 L 192.60 52.84 L 194.40 52.14 L 196.20 50.94 L 198.00 50.67 L 199.80 49.73 L 201.60 49.34 L 203.40 48.32 L 205.20 47.57 L 207.00 46.87 L 208.80 45.99 L 210.60 44.91 L 212.40 44.19 L 214.20 43.28" fill="transparent" stroke="#00f" stroke-width="2.0"/>
</g>
<text x="193.50" y="25.82" text-anchor="end" dy="0.3em" font-size="11"><tspan style="font-family: 'Inconsolata', monospace">ls | grep</tspan></text>
</svg>
</table>
</center>
</div>
<p class=lp>For <i>n</i> = 8, <code>ls</code> takes 7.19 minutes while <code>ls</code> <code>|</code> <code>grep</code> runs in 1.56 milliseconds,
making it 276,538X faster.
If you’ve read my 2007 article “<a href="https://swtch.com/~rsc/regexp/regexp1.html">Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, …)</a>,”
those graphs may look familiar.
Clearly the <code>ls</code> command is using an exponential pattern-matching algorithm,
while the <code>ls</code> <code>|</code> <code>grep</code> command is using a nearly linear one.</p>
<h2>Shells</h2>
<p class=lp>In fact it’s the shell that evaluates the <a href="https://en.wikipedia.org/wiki/Glob_%28programming%29">glob pattern</a> in the first command, not <code>ls</code>,
so let’s repeat the experiment with a variety of shells.
All the tests were run on an HP Z440 workstation with 3.5 GHz Intel Xeon E5-1650 v3 processors
running Ubuntu 14.04.</p>
<div class=fig>
<center>
<table cellspacing=0 cellpadding=0 border=0><tr><td>
<div class=box>
<center>
<b>Time to match
(<code>a*</code>)<sup><i>n</i></sup><code>b</code>
against
<code>a</code><sup>100</sup> in shells</b>
<br>
<svg width="540pt" height="295pt" viewBox="0 0 540 295"
xmlns="http://www.w3.org/2000/svg">
<defs>
<clipPath id="grid"><rect x="54.00" y="7.20" width="378.00" height="252.00"/></clipPath></defs>
<path d="M 54.00 259.20 L 54.00 7.20 M 54.00 259.20 L 432.00 259.20 M 54.00 259.20 L 54.00 264.20 M 72.90 259.20 L 72.90 262.20 M 91.80 259.20 L 91.80 262.20 M 110.70 259.20 L 110.70 262.20 M 129.60 259.20 L 129.60 262.20 M 148.50 259.20 L 148.50 264.20 M 167.40 259.20 L 167.40 262.20 M 186.30 259.20 L 186.30 262.20 M 205.20 259.20 L 205.20 262.20 M 224.10 259.20 L 224.10 262.20 M 243.00 259.20 L 243.00 264.20 M 261.90 259.20 L 261.90 262.20 M 280.80 259.20 L 280.80 262.20 M 299.70 259.20 L 299.70 262.20 M 318.60 259.20 L 318.60 262.20 M 337.50 259.20 L 337.50 264.20 M 356.40 259.20 L 356.40 262.20 M 375.30 259.20 L 375.30 262.20 M 394.20 259.20 L 394.20 262.20 M 413.10 259.20 L 413.10 262.20 M 432.00 259.20 L 432.00 264.20 M 54.00 10.11 L 51.00 10.11 M 54.00 19.14 L 49.00 19.14 M 54.00 20.51 L 51.00 20.51 M 54.00 22.05 L 51.00 22.05 M 54.00 23.79 L 51.00 23.79 M 54.00 25.80 L 51.00 25.80 M 54.00 28.17 L 51.00 28.17 M 54.00 31.08 L 51.00 31.08 M 54.00 34.83 L 51.00 34.83 M 54.00 40.12 L 51.00 40.12 M 54.00 49.15 L 49.00 49.15 M 54.00 50.52 L 51.00 50.52 M 54.00 52.06 L 51.00 52.06 M 54.00 53.80 L 51.00 53.80 M 54.00 55.81 L 51.00 55.81 M 54.00 58.18 L 51.00 58.18 M 54.00 61.09 L 51.00 61.09 M 54.00 64.84 L 51.00 64.84 M 54.00 70.12 L 51.00 70.12 M 54.00 79.16 L 49.00 79.16 M 54.00 80.53 L 51.00 80.53 M 54.00 82.06 L 51.00 82.06 M 54.00 83.80 L 51.00 83.80 M 54.00 85.81 L 51.00 85.81 M 54.00 88.19 L 51.00 88.19 M 54.00 91.10 L 51.00 91.10 M 54.00 94.85 L 51.00 94.85 M 54.00 100.13 L 51.00 100.13 M 54.00 109.16 L 49.00 109.16 M 54.00 110.54 L 51.00 110.54 M 54.00 112.07 L 51.00 112.07 M 54.00 113.81 L 51.00 113.81 M 54.00 115.82 L 51.00 115.82 M 54.00 118.20 L 51.00 118.20 M 54.00 121.10 L 51.00 121.10 M 54.00 124.85 L 51.00 124.85 M 54.00 130.14 L 51.00 130.14 M 54.00 139.17 L 49.00 139.17 M 54.00 140.54 L 51.00 140.54 M 54.00 142.08 L 51.00 142.08 M 54.00 143.82 L 51.00 143.82 M 54.00 145.83 L 51.00 145.83 M 54.00 148.20 L 51.00 148.20 M 54.00 151.11 L 51.00 151.11 M 54.00 154.86 L 51.00 154.86 M 54.00 160.14 L 51.00 160.14 M 54.00 169.18 L 49.00 169.18 M 54.00 170.55 L 51.00 170.55 M 54.00 172.09 L 51.00 172.09 M 54.00 173.83 L 51.00 173.83 M 54.00 175.84 L 51.00 175.84 M 54.00 178.21 L 51.00 178.21 M 54.00 181.12 L 51.00 181.12 M 54.00 184.87 L 51.00 184.87 M 54.00 190.15 L 51.00 190.15 M 54.00 199.19 L 49.00 199.19 M 54.00 200.56 L 51.00 200.56 M 54.00 202.09 L 51.00 202.09 M 54.00 203.83 L 51.00 203.83 M 54.00 205.84 L 51.00 205.84 M 54.00 208.22 L 51.00 208.22 M 54.00 211.13 L 51.00 211.13 M 54.00 214.88 L 51.00 214.88 M 54.00 220.16 L 51.00 220.16 M 54.00 229.19 L 49.00 229.19 M 54.00 230.57 L 51.00 230.57 M 54.00 232.10 L 51.00 232.10 M 54.00 233.84 L 51.00 233.84 M 54.00 235.85 L 51.00 235.85 M 54.00 238.23 L 51.00 238.23 M 54.00 241.13 L 51.00 241.13 M 54.00 244.88 L 51.00 244.88 M 54.00 250.17 L 51.00 250.17 M 54.00 259.20 L 49.00 259.20 " fill="transparent" stroke="black"/>
<text x="54.00" y="264.20" dy="1em" text-anchor="middle" font-size="10">0</text>
<text x="148.50" y="264.20" dy="1em" text-anchor="middle" font-size="10">5</text>
<text x="243.00" y="264.20" dy="1em" text-anchor="middle" font-size="10">10</text>
<text x="337.50" y="264.20" dy="1em" text-anchor="middle" font-size="10">15</text>
<text x="432.00" y="264.20" dy="1em" text-anchor="middle" font-size="10">20</text>
<text x="49.00" y="19.14" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">10000 s</text>
<text x="49.00" y="49.15" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">1000 s</text>
<text x="49.00" y="79.16" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">100 s</text>
<text x="49.00" y="109.16" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">10 s</text>
<text x="49.00" y="139.17" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">1 s</text>
<text x="49.00" y="169.18" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">100 ms</text>
<text x="49.00" y="199.19" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">10 ms</text>
<text x="49.00" y="229.19" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">1 ms</text>
<text x="49.00" y="259.20" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">100 us</text>
<text x="243.00" y="259.20" text-anchor="middle" font-size="11" dy="2.5em">pattern size <tspan style="font-style: italic">n</tspan></text>
<g transform="translate(54.00 133.20) rotate(-90)"><text x="0" y="0" text-anchor="middle" font-size="11" dy="-4em">time</text></g>
<g clip-path="grid">
<path d="M 54.00 209.74 L 72.90 204.94 L 91.80 207.77 L 110.70 186.36 L 129.60 148.18 L 148.50 110.51 L 167.40 74.52 L 186.30 40.43 L 205.20 8.32" fill="transparent" stroke="#F44336" stroke-width="1.5"/>
<path d="M 54.00 228.55 L 72.90 231.02 L 91.80 229.51 L 110.70 216.70 L 129.60 179.56 L 148.50 142.02 L 167.40 105.84 L 186.30 71.66 L 205.20 38.81" fill="transparent" stroke="#FF9800" stroke-width="1.5"/>
<path d="M 54.00 218.88 L 72.90 211.48 L 91.80 213.08 L 110.70 201.35 L 129.60 181.70 L 148.50 147.79 L 167.40 112.18 L 186.30 77.89 L 205.20 45.59" fill="transparent" stroke="#FFEB3B" stroke-width="1.5"/>
<path d="M 54.00 219.59 L 72.90 211.30 L 91.80 211.19 L 110.70 206.74 L 129.60 190.17 L 148.50 153.89 L 167.40 117.20 L 186.30 82.26 L 205.20 49.22" fill="transparent" stroke="#00BCD4" stroke-width="1.5"/>
<path d="M 54.00 222.14 L 72.90 223.88 L 91.80 225.22 L 110.70 214.51 L 129.60 190.20 L 148.50 158.35 L 167.40 122.14 L 186.30 88.07 L 205.20 55.77" fill="transparent" stroke="#4CAF50" stroke-width="1.5"/>
<path d="M 54.00 221.94 L 72.90 221.31 L 91.80 219.68 L 110.70 215.59 L 129.60 196.91 L 148.50 164.89 L 167.40 127.97 L 186.30 93.09 L 205.20 60.02" fill="transparent" stroke="#009688" stroke-width="1.5"/>
<path d="M 54.00 232.71 L 72.90 236.88 L 91.80 237.09 L 110.70 234.49 L 129.60 211.28 L 148.50 173.90 L 167.40 138.01 L 186.30 103.73 L 205.20 71.05" fill="transparent" stroke="#2196F3" stroke-width="1.5"/>
<path d="M 54.00 189.23 L 72.90 189.77 L 91.80 189.62 L 110.70 185.52 L 129.60 189.65 L 148.50 189.85 L 167.40 189.90 L 186.30 189.66 L 205.20 189.65 L 224.10 189.76 L 243.00 189.53 L 261.90 188.03 L 280.80 183.99 L 299.70 189.74 L 318.60 185.46 L 337.50 189.86 L 356.40 189.72 L 375.30 185.15 L 394.20 189.75 L 413.10 189.65 L 432.00 184.47" fill="transparent" stroke="#9C27B0" stroke-width="1.5"/>
</g>
<path d=" M 223.20 8.32 L 241.20 8.32" fill="transparent" stroke="#F44336" stroke-width="1.5"/>
<text x="245.70" y="8.32" dy="0.3em" font-size="9">tcsh 6.18.01</text>
<path d=" M 223.20 31.08 L 241.20 31.08" fill="transparent" stroke="#FF9800" stroke-width="1.5"/>
<text x="245.70" y="31.08" dy="0.3em" font-size="9">ksh 93u+20120801</text>
<path d=" M 223.20 40.12 L 241.20 40.12" fill="transparent" stroke="#FFEB3B" stroke-width="1.5"/>
<text x="245.70" y="40.12" dy="0.3em" font-size="9">Plan 9 rc</text>
<path d=" M 223.20 49.15 L 241.20 49.15" fill="transparent" stroke="#00BCD4" stroke-width="1.5"/>
<text x="245.70" y="49.15" dy="0.3em" font-size="9">zsh 5.0.5</text>
<path d=" M 223.20 58.18 L 241.20 58.18" fill="transparent" stroke="#4CAF50" stroke-width="1.5"/>
<text x="245.70" y="58.18" dy="0.3em" font-size="9">rc 1.7.1</text>
<path d=" M 223.20 67.21 L 241.20 67.21" fill="transparent" stroke="#009688" stroke-width="1.5"/>
<text x="245.70" y="67.21" dy="0.3em" font-size="9">bash 4.3</text>
<path d=" M 223.20 76.25 L 241.20 76.25" fill="transparent" stroke="#2196F3" stroke-width="1.5"/>
<text x="245.70" y="76.25" dy="0.3em" font-size="9">dash 0.5.7</text>
<path d=" M 450.00 184.47 L 468.00 184.47" fill="transparent" stroke="#9C27B0" stroke-width="1.5"/>
<text x="472.50" y="184.47" dy="0.3em" font-size="9">csh 20110502</text>
</svg>
</center>
</div>
</table>
</center>
</div>
<p class=lp>Basically, the same thing is going on here as in my regular expression article:
backtracking was an obvious implementation strategy, so most implementations use it,
causing the performance cliffs.</p>
<p class=pp>The exception seems to be the original Berkeley csh, which runs in linear time (more precisely, time linear in <em>n</em>).
Looking at the source code, it doesn’t attempt to perform glob expansion itself.
Instead it calls the C library implementation <a href="https://linux.die.net/man/3/glob"><em>glob</em>(3)</a>,
which runs in linear time, at least on this Linux system.
So maybe we should look at programming language implementations too.</p>
<h2>Programming Languages</h2>
<p class=lp>Most programming languages provide some kind of glob expansion,
like C’s <code>glob</code>.
Let’s repeat the experiment in a variety of different programming languages:</p>
<div class=fig>
<center>
<table cellspacing=0 cellpadding=0 border=0><tr><td>
<div class=box>
<center>
<b>Time to match
(<code>a*</code>)<sup><i>n</i></sup><code>b</code>
against
<code>a</code><sup>100</sup> in programming languages</b>
<br>
<svg width="540pt" height="295pt" viewBox="0 0 540 295"
xmlns="http://www.w3.org/2000/svg">
<defs>
<clipPath id="grid"><rect x="54.00" y="7.20" width="378.00" height="252.00"/></clipPath></defs>
<path d="M 54.00 259.20 L 54.00 7.20 M 54.00 259.20 L 432.00 259.20 M 54.00 259.20 L 54.00 264.20 M 72.90 259.20 L 72.90 262.20 M 91.80 259.20 L 91.80 262.20 M 110.70 259.20 L 110.70 262.20 M 129.60 259.20 L 129.60 262.20 M 148.50 259.20 L 148.50 264.20 M 167.40 259.20 L 167.40 262.20 M 186.30 259.20 L 186.30 262.20 M 205.20 259.20 L 205.20 262.20 M 224.10 259.20 L 224.10 262.20 M 243.00 259.20 L 243.00 264.20 M 261.90 259.20 L 261.90 262.20 M 280.80 259.20 L 280.80 262.20 M 299.70 259.20 L 299.70 262.20 M 318.60 259.20 L 318.60 262.20 M 337.50 259.20 L 337.50 264.20 M 356.40 259.20 L 356.40 262.20 M 375.30 259.20 L 375.30 262.20 M 394.20 259.20 L 394.20 262.20 M 413.10 259.20 L 413.10 262.20 M 432.00 259.20 L 432.00 264.20 M 54.00 7.20 L 51.00 7.20 M 54.00 14.92 L 49.00 14.92 M 54.00 16.10 L 51.00 16.10 M 54.00 17.41 L 51.00 17.41 M 54.00 18.90 L 51.00 18.90 M 54.00 20.61 L 51.00 20.61 M 54.00 22.64 L 51.00 22.64 M 54.00 25.13 L 51.00 25.13 M 54.00 28.33 L 51.00 28.33 M 54.00 32.85 L 51.00 32.85 M 54.00 40.57 L 49.00 40.57 M 54.00 41.75 L 51.00 41.75 M 54.00 43.06 L 51.00 43.06 M 54.00 44.55 L 51.00 44.55 M 54.00 46.26 L 51.00 46.26 M 54.00 48.30 L 51.00 48.30 M 54.00 50.78 L 51.00 50.78 M 54.00 53.99 L 51.00 53.99 M 54.00 58.50 L 51.00 58.50 M 54.00 66.23 L 49.00 66.23 M 54.00 67.40 L 51.00 67.40 M 54.00 68.71 L 51.00 68.71 M 54.00 70.20 L 51.00 70.20 M 54.00 71.92 L 51.00 71.92 M 54.00 73.95 L 51.00 73.95 M 54.00 76.43 L 51.00 76.43 M 54.00 79.64 L 51.00 79.64 M 54.00 84.16 L 51.00 84.16 M 54.00 91.88 L 49.00 91.88 M 54.00 93.05 L 51.00 93.05 M 54.00 94.36 L 51.00 94.36 M 54.00 95.85 L 51.00 95.85 M 54.00 97.57 L 51.00 97.57 M 54.00 99.60 L 51.00 99.60 M 54.00 102.08 L 51.00 102.08 M 54.00 105.29 L 51.00 105.29 M 54.00 109.81 L 51.00 109.81 M 54.00 117.53 L 49.00 117.53 M 54.00 118.70 L 51.00 118.70 M 54.00 120.01 L 51.00 120.01 M 54.00 121.50 L 51.00 121.50 M 54.00 123.22 L 51.00 123.22 M 54.00 125.25 L 51.00 125.25 M 54.00 127.74 L 51.00 127.74 M 54.00 130.94 L 51.00 130.94 M 54.00 135.46 L 51.00 135.46 M 54.00 143.18 L 49.00 143.18 M 54.00 144.35 L 51.00 144.35 M 54.00 145.67 L 51.00 145.67 M 54.00 147.15 L 51.00 147.15 M 54.00 148.87 L 51.00 148.87 M 54.00 150.90 L 51.00 150.90 M 54.00 153.39 L 51.00 153.39 M 54.00 156.59 L 51.00 156.59 M 54.00 161.11 L 51.00 161.11 M 54.00 168.83 L 49.00 168.83 M 54.00 170.01 L 51.00 170.01 M 54.00 171.32 L 51.00 171.32 M 54.00 172.81 L 51.00 172.81 M 54.00 174.52 L 51.00 174.52 M 54.00 176.55 L 51.00 176.55 M 54.00 179.04 L 51.00 179.04 M 54.00 182.24 L 51.00 182.24 M 54.00 186.76 L 51.00 186.76 M 54.00 194.48 L 49.00 194.48 M 54.00 195.66 L 51.00 195.66 M 54.00 196.97 L 51.00 196.97 M 54.00 198.46 L 51.00 198.46 M 54.00 200.17 L 51.00 200.17 M 54.00 202.21 L 51.00 202.21 M 54.00 204.69 L 51.00 204.69 M 54.00 207.90 L 51.00 207.90 M 54.00 212.41 L 51.00 212.41 M 54.00 220.14 L 49.00 220.14 M 54.00 221.31 L 51.00 221.31 M 54.00 222.62 L 51.00 222.62 M 54.00 224.11 L 51.00 224.11 M 54.00 225.83 L 51.00 225.83 M 54.00 227.86 L 51.00 227.86 M 54.00 230.34 L 51.00 230.34 M 54.00 233.55 L 51.00 233.55 M 54.00 238.07 L 51.00 238.07 M 54.00 245.79 L 49.00 245.79 M 54.00 246.96 L 51.00 246.96 M 54.00 248.27 L 51.00 248.27 M 54.00 249.76 L 51.00 249.76 M 54.00 251.48 L 51.00 251.48 M 54.00 253.51 L 51.00 253.51 M 54.00 256.00 L 51.00 256.00 M 54.00 259.20 L 51.00 259.20 " fill="transparent" stroke="black"/>
<text x="54.00" y="264.20" dy="1em" text-anchor="middle" font-size="10">0</text>
<text x="148.50" y="264.20" dy="1em" text-anchor="middle" font-size="10">5</text>
<text x="243.00" y="264.20" dy="1em" text-anchor="middle" font-size="10">10</text>
<text x="337.50" y="264.20" dy="1em" text-anchor="middle" font-size="10">15</text>
<text x="432.00" y="264.20" dy="1em" text-anchor="middle" font-size="10">20</text>
<text x="49.00" y="14.92" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">1000 s</text>
<text x="49.00" y="40.57" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">100 s</text>
<text x="49.00" y="66.23" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">10 s</text>
<text x="49.00" y="91.88" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">1 s</text>
<text x="49.00" y="117.53" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">100 ms</text>
<text x="49.00" y="143.18" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">10 ms</text>
<text x="49.00" y="168.83" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">1 ms</text>
<text x="49.00" y="194.48" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">100 us</text>
<text x="49.00" y="220.14" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">10 us</text>
<text x="49.00" y="245.79" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">1 us</text>
<text x="243.00" y="259.20" text-anchor="middle" font-size="11" dy="2.5em">pattern size <tspan style="font-style: italic">n</tspan></text>
<g transform="translate(54.00 133.20) rotate(-90)"><text x="0" y="0" text-anchor="middle" font-size="11" dy="-4em">time</text></g>
<g clip-path="grid">
<path d="M 54.00 199.28 L 72.90 198.88 L 91.80 180.38 L 110.70 166.57 L 129.60 127.45 L 148.50 99.11 L 167.40 64.53 L 186.30 39.64 L 205.20 8.22" fill="transparent" stroke="#F44336" stroke-width="1.5"/>
<path d="M 54.00 238.18 L 72.90 225.21 L 91.80 207.56 L 110.70 170.02 L 129.60 134.58 L 148.50 101.56 L 167.40 70.56 L 186.30 41.42 L 205.20 13.88" fill="transparent" stroke="#FF9800" stroke-width="1.5"/>
<path d="M 54.00 243.95 L 72.90 217.33 L 91.80 199.58 L 110.70 164.53 L 129.60 133.23 L 148.50 101.68 L 167.40 71.58 L 186.30 42.42 L 205.20 14.93" fill="transparent" stroke="#FFEB3B" stroke-width="1.5"/>
<path d="M 54.00 217.56 L 72.90 200.27 L 91.80 198.54 L 110.70 175.66 L 129.60 143.12 L 148.50 113.77 L 167.40 84.33 L 186.30 54.80 L 205.20 26.60" fill="transparent" stroke="#777" stroke-width="1.5"/>
<path d="M 54.00 220.14 L 72.90 216.39 L 91.80 213.59 L 110.70 187.22 L 129.60 151.20 L 148.50 117.16 L 167.40 85.65 L 186.30 56.06 L 205.20 27.81" fill="transparent" stroke="#00BCD4" stroke-width="1.5"/>
<path d="M 54.00 231.33 L 72.90 216.61 L 91.80 216.30 L 110.70 215.97 L 129.60 216.69 L 148.50 216.57 L 167.40 216.52 L 186.30 216.49 L 205.20 216.21 L 224.10 216.19 L 243.00 216.33 L 261.90 216.14 L 280.80 216.57 L 299.70 216.77 L 318.60 215.66 L 337.50 216.67 L 356.40 216.46 L 375.30 216.33 L 394.20 216.29 L 413.10 216.19 L 432.00 215.89" fill="transparent" stroke="#4CAF50" stroke-width="1.5"/>
<path d="M 54.00 244.21 L 72.90 222.69 L 91.80 224.13 L 110.70 221.83 L 129.60 225.78 L 148.50 223.57 L 167.40 225.98 L 186.30 224.86 L 205.20 222.34 L 224.10 224.67 L 243.00 224.90 L 261.90 224.93 L 280.80 223.76 L 299.70 223.15 L 318.60 224.17 L 337.50 221.86 L 356.40 222.38 L 375.30 223.44 L 394.20 224.03 L 413.10 224.84 L 432.00 222.80" fill="transparent" stroke="#009688" stroke-width="1.5"/>
<path d="M 54.00 244.32 L 72.90 228.52 L 91.80 228.52 L 110.70 228.52 L 129.60 228.47 L 148.50 228.39 L 167.40 228.26 L 186.30 228.22 L 205.20 228.12 L 224.10 228.03 L 243.00 228.07 L 261.90 227.98 L 280.80 227.72 L 299.70 227.67 L 318.60 227.70 L 337.50 227.69 L 356.40 227.60 L 375.30 227.57 L 394.20 227.58 L 413.10 227.50 L 432.00 227.16" fill="transparent" stroke="#2196F3" stroke-width="1.5"/>
<path d="M 54.00 257.36 L 72.90 235.51 L 91.80 235.49 L 110.70 235.30 L 129.60 235.25 L 148.50 235.12 L 167.40 235.03 L 186.30 234.91 L 205.20 234.81 L 224.10 234.77 L 243.00 234.75 L 261.90 234.53 L 280.80 234.59 L 299.70 234.51 L 318.60 234.33 L 337.50 234.27 L 356.40 234.26 L 375.30 234.19 L 394.20 234.03 L 413.10 233.72 L 432.00 233.98" fill="transparent" stroke="#9C27B0" stroke-width="1.5"/>
</g>
<path d=" M 223.20 8.22 L 241.20 8.22" fill="transparent" stroke="#F44336" stroke-width="1.5"/>
<text x="245.70" y="8.22" dy="0.3em" font-size="9">Java 8</text>
<path d=" M 223.20 17.00 L 241.20 17.00" fill="transparent" stroke="#FF9800" stroke-width="1.5"/>
<text x="245.70" y="17.00" dy="0.3em" font-size="9">Perl 5.18.2</text>
<path d=" M 223.20 25.79 L 241.20 25.79" fill="transparent" stroke="#FFEB3B" stroke-width="1.5"/>
<text x="245.70" y="25.79" dy="0.3em" font-size="9">BSD libc</text>
<path d=" M 223.20 34.57 L 241.20 34.57" fill="transparent" stroke="#777" stroke-width="1.5"/>
<text x="245.70" y="34.57" dy="0.3em" font-size="9">Python 3.4.3</text>
<path d=" M 223.20 43.36 L 241.20 43.36" fill="transparent" stroke="#00BCD4" stroke-width="1.5"/>
<text x="245.70" y="43.36" dy="0.3em" font-size="9">Tcl 8.6.1</text>
<path d=" M 450.00 211.52 L 468.00 211.52" fill="transparent" stroke="#4CAF50" stroke-width="1.5"/>
<text x="472.50" y="211.52" dy="0.3em" font-size="9">Rust 1.16.0</text>
<path d=" M 450.00 220.30 L 468.00 220.30" fill="transparent" stroke="#009688" stroke-width="1.5"/>
<text x="472.50" y="220.30" dy="0.3em" font-size="9">Go 1.8</text>
<path d=" M 450.00 229.09 L 468.00 229.09" fill="transparent" stroke="#2196F3" stroke-width="1.5"/>
<text x="472.50" y="229.09" dy="0.3em" font-size="9">Ruby 1.9.3</text>
<path d=" M 450.00 237.87 L 468.00 237.87" fill="transparent" stroke="#9C27B0" stroke-width="1.5"/>
<text x="472.50" y="237.87" dy="0.3em" font-size="9">glibc 2.19</text>
</svg>
</center>
</div>
</table>
</center>
</div>
<p class=lp>Perhaps the most interesting fact evident in the graph
is that GNU glibc, the C library used on Linux systems,
has a linear-time <code>glob</code> implementation, but
BSD libc, the C library used on BSD and macOS systems,
has an exponential-time implementation.</p>
<p class=pp>PHP is not shown in the graph, because its
<a href="http://php.net/manual/en/function.glob.php">glob function</a> simply invokes
the host C library’s <em>glob</em>(3),
so that it runs in linear time on Linux
and in exponential time on non-Linux systems.
(I have not tested what happens on Windows.)
All the languages shown in the graph, however,
implement glob matching without using the host C library,
so the results should not vary by host operating system.</p>
<h2>FTP Servers</h2>
<p class=lp>It’s not just shells and programming languages that implement glob matching.
Although not mandated by the <a href="https://tools.ietf.org/html/rfc959">FTP RFC</a>,
most FTP servers allow glob patterns as the argument to commands
like LIST and STAT.
Let’s repeat the experiment with a variety of FTP server implementations:</p>
<div class=fig>
<center>
<table cellspacing=0 cellpadding=0 border=0><tr><td>
<div class=box>
<center>
<b>Time to match
(<code>a*</code>)<sup><i>n</i></sup><code>b</code>
against
<code>a</code><sup>100</sup> in FTP servers</b>
<br>
<svg width="540pt" height="295pt" viewBox="0 0 540 295"
xmlns="http://www.w3.org/2000/svg">
<defs>
<clipPath id="grid"><rect x="54.00" y="7.20" width="378.00" height="252.00"/></clipPath></defs>
<path d="M 54.00 259.20 L 54.00 7.20 M 54.00 259.20 L 432.00 259.20 M 54.00 259.20 L 54.00 264.20 M 72.90 259.20 L 72.90 262.20 M 91.80 259.20 L 91.80 262.20 M 110.70 259.20 L 110.70 262.20 M 129.60 259.20 L 129.60 262.20 M 148.50 259.20 L 148.50 264.20 M 167.40 259.20 L 167.40 262.20 M 186.30 259.20 L 186.30 262.20 M 205.20 259.20 L 205.20 262.20 M 224.10 259.20 L 224.10 262.20 M 243.00 259.20 L 243.00 264.20 M 261.90 259.20 L 261.90 262.20 M 280.80 259.20 L 280.80 262.20 M 299.70 259.20 L 299.70 262.20 M 318.60 259.20 L 318.60 262.20 M 337.50 259.20 L 337.50 264.20 M 356.40 259.20 L 356.40 262.20 M 375.30 259.20 L 375.30 262.20 M 394.20 259.20 L 394.20 262.20 M 413.10 259.20 L 413.10 262.20 M 432.00 259.20 L 432.00 264.20 M 54.00 7.20 L 49.00 7.20 M 54.00 8.64 L 51.00 8.64 M 54.00 10.25 L 51.00 10.25 M 54.00 12.08 L 51.00 12.08 M 54.00 14.19 L 51.00 14.19 M 54.00 16.68 L 51.00 16.68 M 54.00 19.74 L 51.00 19.74 M 54.00 23.67 L 51.00 23.67 M 54.00 29.22 L 51.00 29.22 M 54.00 38.70 L 49.00 38.70 M 54.00 40.14 L 51.00 40.14 M 54.00 41.75 L 51.00 41.75 M 54.00 43.58 L 51.00 43.58 M 54.00 45.69 L 51.00 45.69 M 54.00 48.18 L 51.00 48.18 M 54.00 51.24 L 51.00 51.24 M 54.00 55.17 L 51.00 55.17 M 54.00 60.72 L 51.00 60.72 M 54.00 70.20 L 49.00 70.20 M 54.00 71.64 L 51.00 71.64 M 54.00 73.25 L 51.00 73.25 M 54.00 75.08 L 51.00 75.08 M 54.00 77.19 L 51.00 77.19 M 54.00 79.68 L 51.00 79.68 M 54.00 82.74 L 51.00 82.74 M 54.00 86.67 L 51.00 86.67 M 54.00 92.22 L 51.00 92.22 M 54.00 101.70 L 49.00 101.70 M 54.00 103.14 L 51.00 103.14 M 54.00 104.75 L 51.00 104.75 M 54.00 106.58 L 51.00 106.58 M 54.00 108.69 L 51.00 108.69 M 54.00 111.18 L 51.00 111.18 M 54.00 114.24 L 51.00 114.24 M 54.00 118.17 L 51.00 118.17 M 54.00 123.72 L 51.00 123.72 M 54.00 133.20 L 49.00 133.20 M 54.00 134.64 L 51.00 134.64 M 54.00 136.25 L 51.00 136.25 M 54.00 138.08 L 51.00 138.08 M 54.00 140.19 L 51.00 140.19 M 54.00 142.68 L 51.00 142.68 M 54.00 145.74 L 51.00 145.74 M 54.00 149.67 L 51.00 149.67 M 54.00 155.22 L 51.00 155.22 M 54.00 164.70 L 49.00 164.70 M 54.00 166.14 L 51.00 166.14 M 54.00 167.75 L 51.00 167.75 M 54.00 169.58 L 51.00 169.58 M 54.00 171.69 L 51.00 171.69 M 54.00 174.18 L 51.00 174.18 M 54.00 177.24 L 51.00 177.24 M 54.00 181.17 L 51.00 181.17 M 54.00 186.72 L 51.00 186.72 M 54.00 196.20 L 49.00 196.20 M 54.00 197.64 L 51.00 197.64 M 54.00 199.25 L 51.00 199.25 M 54.00 201.08 L 51.00 201.08 M 54.00 203.19 L 51.00 203.19 M 54.00 205.68 L 51.00 205.68 M 54.00 208.74 L 51.00 208.74 M 54.00 212.67 L 51.00 212.67 M 54.00 218.22 L 51.00 218.22 M 54.00 227.70 L 49.00 227.70 M 54.00 229.14 L 51.00 229.14 M 54.00 230.75 L 51.00 230.75 M 54.00 232.58 L 51.00 232.58 M 54.00 234.69 L 51.00 234.69 M 54.00 237.18 L 51.00 237.18 M 54.00 240.24 L 51.00 240.24 M 54.00 244.17 L 51.00 244.17 M 54.00 249.72 L 51.00 249.72 M 54.00 259.20 L 49.00 259.20 " fill="transparent" stroke="black"/>
<text x="54.00" y="264.20" dy="1em" text-anchor="middle" font-size="10">0</text>
<text x="148.50" y="264.20" dy="1em" text-anchor="middle" font-size="10">5</text>
<text x="243.00" y="264.20" dy="1em" text-anchor="middle" font-size="10">10</text>
<text x="337.50" y="264.20" dy="1em" text-anchor="middle" font-size="10">15</text>
<text x="432.00" y="264.20" dy="1em" text-anchor="middle" font-size="10">20</text>
<text x="49.00" y="7.20" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">1000 s</text>
<text x="49.00" y="38.70" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">100 s</text>
<text x="49.00" y="70.20" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">10 s</text>
<text x="49.00" y="101.70" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">1 s</text>
<text x="49.00" y="133.20" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">100 ms</text>
<text x="49.00" y="164.70" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">10 ms</text>
<text x="49.00" y="196.20" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">1 ms</text>
<text x="49.00" y="227.70" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">100 us</text>
<text x="49.00" y="259.20" dx="-0.3em" dy="0.3em" text-anchor="end" font-size="10">10 us</text>
<text x="243.00" y="259.20" text-anchor="middle" font-size="11" dy="2.5em">pattern size <tspan style="font-style: italic">n</tspan></text>
<g transform="translate(54.00 133.20) rotate(-90)"><text x="0" y="0" text-anchor="middle" font-size="11" dy="-4em">time</text></g>
<g clip-path="grid">
<path d="M 54.00 200.58 L 72.90 201.05 L 91.80 201.44 L 110.70 194.06 L 129.60 158.13 L 148.50 119.12 L 167.40 79.33 L 186.30 42.97 L 205.20 8.51" fill="transparent" stroke="#F44336" stroke-width="1.5"/>
<path d="M 54.00 230.95 L 72.90 229.57 L 91.80 225.90 L 110.70 193.96 L 129.60 151.87 L 148.50 111.91 L 167.40 74.74 L 186.30 62.94" fill="transparent" stroke="#FF9800" stroke-width="1.5"/>
<path d="M 54.00 145.74 L 72.90 145.74 L 91.80 145.74 L 110.70 145.72 L 129.60 144.44 L 148.50 145.76 L 167.40 145.70 L 186.30 145.77 L 205.20 145.74 L 224.10 145.73 L 243.00 145.74 L 261.90 145.74 L 280.80 145.74 L 299.70 145.75 L 318.60 145.74 L 337.50 145.74 L 356.40 145.74 L 375.30 145.74 L 394.20 145.76 L 413.10 145.72 L 432.00 145.75" fill="transparent" stroke="#FFEB3B" stroke-width="1.5"/>
<path d="M 54.00 189.28 L 72.90 190.47 L 91.80 191.59 L 110.70 192.80 L 129.60 190.83 L 148.50 192.29 L 167.40 192.73 L 186.30 192.65 L 205.20 192.87 L 224.10 192.42 L 243.00 192.79 L 261.90 192.86 L 280.80 192.32 L 299.70 192.53 L 318.60 192.85 L 337.50 192.69 L 356.40 192.39 L 375.30 192.26 L 394.20 192.67 L 413.10 192.64 L 432.00 192.76" fill="transparent" stroke="#00BCD4" stroke-width="1.5"/>
<path d="M 54.00 219.38 L 72.90 213.45 L 91.80 213.73 L 110.70 213.76 L 129.60 213.99 L 148.50 214.22 L 167.40 213.92 L 186.30 214.14 L 205.20 214.30 L 224.10 214.47 L 243.00 214.49 L 261.90 213.99 L 280.80 214.05 L 299.70 212.30 L 318.60 214.06 L 337.50 214.35 L 356.40 214.39 L 375.30 213.83 L 394.20 208.13 L 413.10 210.43 L 432.00 210.91" fill="transparent" stroke="#4CAF50" stroke-width="1.5"/>
<path d="M 54.00 233.08 L 72.90 234.33 L 91.80 234.97 L 110.70 234.01 L 129.60 236.28 L 148.50 234.73 L 167.40 234.91 L 186.30 235.64 L 205.20 234.76 L 224.10 235.36 L 243.00 235.59 L 261.90 235.18 L 280.80 235.38 L 299.70 235.32 L 318.60 235.52 L 337.50 235.52 L 356.40 235.73 L 375.30 235.24 L 394.20 235.50 L 413.10 235.62 L 432.00 235.29" fill="transparent" stroke="#009688" stroke-width="1.5"/>
</g>
<path d=" M 223.20 8.51 L 241.20 8.51" fill="transparent" stroke="#F44336" stroke-width="1.5"/>
<text x="245.70" y="8.51" dy="0.3em" font-size="9">tnftpd (macOS 10.12.4)</text>
<path d=" M 223.20 62.94 L 241.20 62.94" fill="transparent" stroke="#FF9800" stroke-width="1.5"/>
<text x="245.70" y="62.94" dy="0.3em" font-size="9">Pure-FTPd 1.0.36</text>
<path d=" M 450.00 145.75 L 468.00 145.75" fill="transparent" stroke="#FFEB3B" stroke-width="1.5"/>
<text x="472.50" y="145.75" dy="0.3em" font-size="9">netkit ftpd 0.17</text>
<path d=" M 450.00 192.76 L 468.00 192.76" fill="transparent" stroke="#00BCD4" stroke-width="1.5"/>
<text x="472.50" y="192.76" dy="0.3em" font-size="9">Plan 9 ip/ftpd</text>
<path d=" M 450.00 210.91 L 468.00 210.91" fill="transparent" stroke="#4CAF50" stroke-width="1.5"/>
<text x="472.50" y="210.91" dy="0.3em" font-size="9">ProFTPD 1.3.5</text>
<path d=" M 450.00 235.29 L 468.00 235.29" fill="transparent" stroke="#009688" stroke-width="1.5"/>
<text x="472.50" y="235.29" dy="0.3em" font-size="9">vsftpd 3.0.2</text>
</svg>
</center>
</div>
</table>
</center>
</div>
<p class=lp>On Linux, Pure-FTPd would probably have run for a hundred or more seconds for <i>n</i> = 7,
but instead it died and hung up the connection after 17 seconds.
All the tests were run on the same Linux system as before, except tnftpd, which was run on a mid-2015 MacBook Pro with a 2.8 GHz Intel Core i7 processor running macOS 10.12.4.
On that Mac system, tnftpd
(which can only be enabled using the command-line, so most people don’t run it)
has no such time limit:
even if a client times out and hangs up (as the command-line ftp client does after 30 seconds),
the server side still consumes CPU until the full pattern match finishes.</p>
<p class=pp>The netkit ftpd runs quickly on Linux because it relies on the host
C library’s <code>glob</code> function.
If run on BSD, the netkit ftpd would take exponential time.
ProFTPD ships a copy of the glibc <code>glob</code>,
so it should run quickly even on BSD systems.
Ironically, Pure-FTPd and tnftpd take exponential time on Linux
because they ship a copy of the BSD <code>glob</code> function.
Presumably they do this to avoid assuming that the host C library is bug-free,
but, at least in this one case,
the host C library is better than the one they ship.</p>
<p class=pp>Obviously not many servers have a file named <code>a</code><sup>100</sup>,
but the pattern can be adapted to shorter, less unusual names.
This gives a denial of service attack against some anonymous FTP servers.
It appears that tnftpd is derived from the standard FreeBSD ftpd,
so BSD systems may be affected as well.</p>
<p class=pp>FTP servers and C libraries
have a <a href="http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=glob">long history of problems with glob patterns</a>,
including buffer and heap overflows causing crashes or even remote code execution.
But here let’s focus on CPU exhaustion issues around pattern matching.</p>
<p class=pp>In 2001, <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2001-1501">CVE-2001-1501</a> was issued for a <a href="http://marc.info/?l=bugtraq&m=98477291420305&w=2">vulnerability in ProFTPD 1.2.1</a>, because it could run for a very long time finding and recording the very many matches for a pattern like:</p>
<pre><code>ls */../*/../*/../*/../*/../*/../*/../*/../*/../*
</code></pre>
<p class=lp>In response, most <code>glob</code> implementations <a href="https://github.com/openbsd/src/commit/98e1217625a0">added a <code>GLOB_LIMIT</code> flag</a> that can be used to limit the number of matches returned, controlling both the CPU and the memory usage for such a pattern.</p>
<p class=pp>Unfortunately, a pattern like that can cause a lot of effort without finding any matches.
In 2010, <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-2632">CVE-2010-2632</a> was issued for a <a href="http://cxsecurity.com/issue/WLB-2010100135">variant with no matches</a>:</p>
<pre><code>ls */../*/../*/../*/../*/../*/../*/../*/../*blablahaha
</code></pre>
<p class=lp>In response, most <code>glob</code> implementations <a href="https://github.com/openbsd/src/commit/46df4fe576b7">expanded <code>GLOB_LIMIT</code></a> to count directory read and file stat operations in addition to matches.</p>
<p class=pp>In 2015, <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-5917">CVE-2015-5917</a> was issued for <a href="https://cxsecurity.com/issue/WLB-2013040082">the same vulnerability in OS X 10.10.5’s FTP server</a> (reported in 2013), which had its own copy of the <code>glob</code> implementation and had not been patched in 2010.
There have also been similar problems around FTP servers implementing brace expansion,
such as <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-0418">CVE-2011-0418</a> (<a href="http://cxsecurity.com/issue/WLB-2011050004">details</a>).</p>
<p class=pp>Unfortunately, none of these protections address the cost of matching a single path element of a single file name.
In 2005, <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2005-0256">CVE-2005-0256</a> was issued for a <a href="http://marc.info/?l=bugtraq&m=110935886414939&w=2">DoS vulnerability in WU-FTPD 2.6.2</a>, because it ran for a very long time finding even a single match during:</p>
<pre><code>ftp> dir ************************************************
************************************************
************************************************
**.*
</code></pre>
<p class=lp>The apparent <a href="http://marc.info/?l=bugtraq&m=110960890901497&w=2">“fix” used in some implementations</a> is
to collapse multiple adjacent stars into a single star.
That solves one test case, but not the general problem.
In particular it doesn’t help <code>a*a*a*a*a*a*a*a*b</code>.</p>
<p class=pp>The next section discusses ways to implement glob patterns efficiently,
but if you have an anonymous FTP server accepting glob patterns,
there are two more fundamental questions to ask:
Do you really need to run an anonymous FTP server anymore?
Does it really need to accept glob patterns?</p>
<p class=pp>At the very least, most FTP servers should probably reject
glob patterns with more than, say, 3 stars.
Note that glob patterns are only provided as a convenience for
command-line FTP users.
Graphical FTP clients typically use the
<a href="https://tools.ietf.org/html/rfc3659#page-23"><code>MLST</code> and <code>MLSD</code> commands</a>,
which have a machine-readable output format and are defined not to
interpret their arguments as glob patterns.</p>
<h2>Implementation Details</h2>
<p class=lp>How do these implementations work? What’s going on here?</p>
<p class=pp>The obvious implementation of glob pattern matching against a single path element
is to walk the pattern and the name together, matching letters or wildcards in the pattern
to letters in the name.
If the walk reaches the end of the pattern at the same time as the end of the name, they match.</p>
<p class=pp>Here’s a basic outline of that algorithm, in Go:</p>
<pre>
func match(pattern, name string) bool {
px := 0
nx := 0
for px < len(pattern) || nx < len(name) {
if px < len(pattern) {
c := pattern[px]
switch c {
default: // ordinary character
if nx < len(name) && name[nx] == c {
px++
nx++
continue
}
case '?': // single-character wildcard
if nx < len(name) {
px++
nx++
continue
}
case '*': // zero-or-more-character wildcard
...
}
}
// Mismatch.
return false
}
// Matched all of pattern to all of name. Success.
return true
}
</pre>
<p class=lp>In this code, <code>px</code> is the index into the pattern
and <code>nx</code> the index into the name.
The loop runs until both pattern and name are exhausted,
meaning <code>px</code> <code>==</code> <code>len(pattern)</code> and <code>nx</code> <code>==</code> <code>len(name)</code>.
If it does happen that both pattern and name are exhausted at the same time,
then we have a match (the final <code>return</code> <code>true</code>).
Inside the loop, the code must make progress (advance <code>px</code> or <code>nx</code> or both) and <code>continue</code> on each iteration.
If not, the control flow ends up at the bottom of the loop body
(marked <code>//</code> <code>Mismatch.</code>) and reports no match.</p>
<p class=pp>The only difficulty is in the implementation of the variable-length wildcard pattern (<code>case</code> <code>'*'</code>):
how much of the name should that match?
In general, the code must try all possibilities from matching nothing to matching the entire remainder of the string.
The obvious way to do that is with recursion:</p>
<pre>
<span style="color: #aaa;">func match(pattern, name string) bool {
px := 0
nx := 0
for px < len(pattern) || nx < len(name) {
if px < len(pattern) {
c := pattern[px]
switch c {
default: // ordinary character
if nx < len(name) && name[nx] == c {
px++
nx++
continue
}
case '?': // single-character wildcard
if nx < len(name) {
px++
nx++
continue
}
case '*': // zero-or-more-character wildcard<span style="color: #000; font-weight:bold;">
// Try to match at nx, nx+1, and so on.
for ; nx <= len(name); nx++ {
if match(pattern[px+1:], name[nx:]) {
return true
}
}</span>
}
}
// Mismatch.
return false
}
// Matched all of pattern to all of name. Success.
return true
}
</span></pre>
<p class=lp>If there are <i>e</i> stars that can each potentially end their matches at <i>n</i> positions in the string,
that gives <i>n</i><sup><i>e</i></sup> possibilities to explore, leading to the exponential run times observed earlier.
However, most of these possibilities are not worth exploring.
Because <code>*</code> is the only variable-sized
wildcard in the pattern syntax and therefore the only
source of possible backtracking, there’s an even easier implementation:
don’t backtrack to an earlier star.</p>
<p class=pp>Consider the pattern <code>a*bx*cy*d</code>.
If we end the first star at the first <code>bx</code>, we have the rest of the name to find the <code>cy</code> and then the <code>d</code>.
Using any later <code>bx</code> can only remove choices for <code>cy</code> and <code>d</code>; it cannot lead to a successful match
that using the first <code>bx</code> missed.
So we should implement
<code>a*bx*cy*d</code> without any second-guessing,
as
“find a leading <code>a</code>, then find the earliest <code>bx</code> after that, then find the earliest <code>cy</code> after that, then find a trailing <code>d</code>, or else give up.”</p>
<p class=pp>We can implement this algorithm by replacing the handling of the star wildcard
in our Go program:</p>
<pre>
<span style="color: #aaa;">func match(pattern, name string) bool {
px := 0
nx := 0
<span style="color: black; font-weight: bold;">nextPx := 0
nextNx := 0</span>
for px < len(pattern) || nx < len(name) {
if px < len(pattern) {
c := pattern[px]
switch c {
default: // ordinary character
if nx < len(name) && name[nx] == c {
px++
nx++
continue
}
case '?': // single-character wildcard
if nx < len(name) {
px++
nx++
continue
}
case '*': // zero-or-more-character wildcard
<span style="color: black; font-weight: bold;">// Try to match at nx.
// If that doesn't work out,
// restart at nx+1 next.
nextPx = px
nextNx = nx + 1
px++
continue</span>
}
}
<span style="color: black; font-weight: bold;">// Mismatch. Maybe restart.
if 0 < nextNx && nextNx <= len(name) {
px = nextPx
nx = nextNx
continue
}</span>
return false
}
// Matched all of pattern to all of name. Success.
return true
}</span>
</pre>
<p class=lp>Each time the code encounters a star, it implements the repeated trials needed
for that star by recording in <code>nextPx</code>, <code>nextNx</code> where to restart the search
if the current match fails.
Each subsequent star encountered overwrites the restart information
for the previous star, in effect locking in the choice made for the
previous star.
If you’d like to experiment, I’ve posted <a href="glob.go">both of these programs and a test harness</a>.</p>
<p class=pp>An alternate implementation of the algorithm would be to split the
pattern on stars and then consider each of the star-separated
subpatterns in turn, special-casing the first subpattern and the last,
which must be anchored at the start and end of the name, respectively.
Go’s <a href="https://golang.org/src/path/filepath/match.go">src/path/filepath/match.go</a>
is an example of this implementation.</p>
<p class=pp>Go’s <a href="https://golang.org/pkg/path/filepath/#Match"><code>filepath.Match</code></a>
(used by <a href="https://golang.org/pkg/path/filepath/#Glob"><code>filepath.Glob</code></a>),
glibc’s <code>glob</code>, and vsftpd’s pattern matcher
all use this algorithm.</p>
<p class=pp>A more straightforward approach is to translate the glob pattern to
a regular expression and then invoke a linear-time regular expression match.
Plan 9’s ftpd does this, as does the <code>ls</code> <code>|</code> <code>grep</code> example above.
(<a href="https://github.com/python/cpython/blob/master/Lib/fnmatch.py#L39">Python also does this</a>, but then it runs the regular expression
with an exponential-time matching engine.)</p>
<p class=pp>I have not looked at the other linear-time implementations to see what they do,
but I expect they all use one of these two approaches.</p>
<h2>Additional Reading</h2>
<p class=lp>This post is an elaboration of an informal <a href="https://plus.google.com/u/2/+RussCox-rsc/posts/8aANoDNvhie">2012 Google+ post</a>
showing that most shells used exponential-time glob expansion.
At the time, Tom Duff, the author of Plan 9’s rc shell, commented that,
“I can confirm that rc gets it wrong.
My excuse, feeble as it is, is that doing it that way meant that the code took 10 minutes to write,
but it took 20 years for someone to notice the problem.
(That’s 10 ‘programmer minutes’, i.e. less than a day.)”
I agree that’s a reasonable decision for a shell.
In contrast, a language library routine, not to mention a network server,
today needs to be robust against worst-case inputs that might be controlled
by remote attackers,
but nearly all of the code in question predates that kind of concern.
I didn’t realize the connection to FTP servers until I started doing
additional research for this post and came across a reference to
CVE-2010-2632 in <a href="https://github.com/freebsd/freebsd/blob/5b0d2af29a95/lib/libc/gen/glob.c#L100">FreeBSD’s <code>glob</code> implementation</a>.</p>
<p class=pp>Dave Presotto, the author of Plan 9’s ftpd, avoided rc’s glob implementation not
because of the algorithmic complexity but to make sure that long strings
were handled safely (using a Plan 9 library for handling long strings in C).
He wrote this comment at the top of
Plan 9’s <a href="http://plan9.bell-labs.com/sources/plan9/sys/src/cmd/ip/glob.c">/sys/src/cmd/ip/glob.c</a>,
which converts glob expressions into regular expressions:</p>
<pre><code>/*
* I wrote this glob so that there would be no limit
* on element or path size. The one in rc is probably
* better, certainly faster. - presotto
*/
</code></pre>
<p class=lp>As it turns out, this is untrue: the one in rc is certainly slower, at least in terms of
worst-case asymptotics.</p>
<p class=pp>If you liked this post, you may also like to browse
Nelson Elhage’s <a href="https://accidentallyquadratic.tumblr.com/post/113840433022/why-accidentally-quadratic">Accidentally Quadratic</a> collection.
(Of course, here the glob pattern matching is accidentally exponential.)</p>
<h2><a name="updates">Updates, as of April 28, 2017.</h2>
<p class=lp>NetBSD has an <a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/gen/glob.c.diff?r1=1.36&r2=1.37&f=h">updated glob</a>
pending for the next release.</p>
<p class=pp>Perl has an <a href="https://perl5.git.perl.org/perl.git/commitdiff/33252c318625f3c6c89b816ee88481940e3e6f95?hp=57ab6c610267dba697199c8256f4258af7d391c1">updated glob</a> pending for the next release.</p>
<p class=pp>Pure-FTPd 1.0.46 has added a <a href="https://github.com/jedisct1/pure-ftpd/commit/63d98420e2c205c40e5a0849bde142e0aab17955">check that patterns must not have more than three stars</a>.</p>
<p class=pp>Thanks to <a href="https://news.ycombinator.com/item?id=14185822">js2 on Hacker News</a> for pointing out that Python translates globs to
regular expressions.</p>
+
+
+ My Go Resolutions for 2017
+ tag:research.swtch.com,2012:research.swtch.com/go2017
+
+ 2017-01-18T09:00:00-05:00
+ 2017-01-18T09:01:00-05:00
+ What I would like to do for Go in 2017.
+ <p class=lp>’Tis the season for resolutions,
and I thought it would make sense to write a little
about what I hope to work on this year as far as Go is concerned.</p>
<p class=pp>My goal every year is to <em>help Go developers</em>.
I want to make sure that the work we do on the Go team
has a significant, positive impact on Go developers.
That may sound obvious, but there are a variety of common ways to fail to achieve that:
for example, spending too much time cleaning up or optimizing code that doesn’t need it;
responding only to the most common or recent complaints or requests;
or focusing too much on short-term improvements.
It’s important to step back and make sure we’re focusing
our development work where it does the most good.</p>
<p class=pp>This post outlines a few of my own major focuses for this year.
This is only my personal list, not the Go team’s list.</p>
<p class=pp>One reason for posting this is to gather feedback.
If these spark any ideas or suggestions of your own,
please feel free to comment below or on the linked GitHub issues.</p>
<p class=pp>Another reason is to make clear that I’m aware of these issues as important.
I think too often people interpret lack of action by the Go team
as a signal that we think everything is perfect, when instead
there is simply other, higher priority work to do first.</p>
<h2><a name="alias"></a>Type aliases</h2>
<p class=lp>There is a recurring problem with moving types
from one package to another during large codebase refactorings.
We tried to solve it last year with <a href="https://golang.org/issue/16339">general aliases</a>,
which didn’t work for at least two reasons: we didn’t explain the change well enough,
and we didn’t deliver it on time, so it wasn’t ready for Go 1.8.
Learning from that experience,
I <a href="https://www.youtube.com/watch?v=h6Cw9iCDVcU">gave a talk</a>
and <a href="https://talks.golang.org/2016/refactor.article">wrote an article</a>
about the underlying problem,
and that started a <a href="https://golang.org/issue/18130">productive discussion</a>
on the Go issue tracker about the solution space.
It looks like more limited <a href="https://golang.org/design/18130-type-alias">type aliases</a>
are the right next step.
I want to make sure those land smoothly in Go 1.9. <a href="https://golang.org/issue/18130">#18130</a>.</p>
<h2><a name="package"></a>Package management</h2>
<p class=lp>I designed the Go support for downloading published packages
(“goinstall”, which became “go get”) in February 2010.
A lot has happened since then.
In particular, other language ecosystems have really raised the bar
for what people expect from package management,
and the open source world has mostly agreed on
<a href="http://semver.org/">semantic versioning</a>, which provides a useful base
for inferring version compatibility.
Go needs to do better here, and a group of contributors have been
<a href="https://blog.gopheracademy.com/advent-2016/saga-go-dependency-management/">working on a solution</a>.
I want to make sure these ideas are integrated well
into the standard Go toolchain and to make package management
a reason that people love Go.</p>
<h2><a name="build"></a>Build improvements</h2>
<p class=lp>There are a handful of shortcomings in the design of
the go command’s build system that are overdue to be fixed.
Here are three representative examples that I intend to
address with a bit of a redesign of the internals of the go command.</p>
<p class=pp>Builds can be too slow,
because the go command doesn’t cache build results as aggressively as it should.
Many people don’t realize that <code>go</code> <code>install</code> saves its work while <code>go</code> <code>build</code> does not,
and then they run repeated <code>go</code> <code>build</code> commands that are slow
because the later builds do more work than they should need to.
The same for repeated <code>go</code> <code>test</code> without <code>go</code> <code>test</code> <code>-i</code> when dependencies are modified.
All builds should be as incremental as possible.
<a href="https://golang.org/issue/4719">#4719</a>.</p>
<p class=pp>Test results should be cached too:
if none of the inputs to a test have changed,
then usually there is no need to rerun the test.
This will make it very cheap to run “all tests” when little or nothing has changed.
<a href="https://golang.org/issue/11193">#11193</a>.</p>
<p class=pp>Work outside GOPATH should be supported nearly as well
as work inside GOPATH.
In particular, it should be possible to <code>git</code> <code>clone</code> a repo,
<code>cd</code> into it, and run <code>go</code> commands and have them work fine.
Package management only makes that more important:
you’ll need to be able to work on different versions of a package (say, v1 and v2)
without having entirely separate GOPATHs for them.
<a href="https://golang.org/issue/17271">#17271</a>.</p>
<h2><a name="corpus"></a>Code corpus</h2>
<p class=lp>I think it helped to have concrete examples from real projects
in the talk and article I prepared about codebase refactoring (see <a href="#alias">above</a>).
We’ve also defined that <a href="https://golang.org/src/cmd/vet/README">additions to vet</a>
must target problems that happen frequently in real programs.
I’d like to see that kind of analysis of actual practice—examining
the effects on and possible improvements to real programs—become a
standard way we discuss and evaluate changes to Go.</p>
<p class=pp>Right now there’s not an agreed-upon representative corpus of code to use for
those analyses: everyone must first create their own, which is too much work.
I’d like to put together a single, self-contained Git repo people can check out that
contains our official baseline corpus for those analyses.
A possible starting point could be the top 100 Go language repos
on GitHub by stars or forks or both.</p>
<h2><a name="vet"></a>Automatic vet</h2>
<p class=lp>The Go distribution ships with this powerful tool,
<a href="https://golang.org/cmd/vet/"><code>go</code> <code>vet</code></a>,
that points out correctness bugs.
We have a high bar for checks, so that when vet speaks, you should listen.
But everyone has to remember to run it.
It would be better if you didn’t have to remember.
In particular, I think we could probably run vet
in parallel with the final compile and link of the test binary
during <code>go</code> <code>test</code> without slowing the compile-edit-test cycle at all.
If we can do that, and if we limit the enabled vet checks to a subset
that is essentially 100% accurate,
we can make passing vet a precondition for running a test at all.
Then developers don’t need to remember to run <code>go</code> <code>vet</code>.
They run <code>go</code> <code>test</code>,
and once in a while vet speaks up with something important
and avoids a debugging session.
<a href="https://golang.org/issue/18084">#18084</a>,
<a href="https://golang.org/issue/18085">#18085</a>.</p>
<h2><a name="error"></a>Errors & best practices</h2>
<p class=lp>Part of the intended contract for error reporting in Go is that functions
include relevant available context, including the operation being attempted
(such as the function name and its arguments).
For example, this program:</p>
<pre><code>err := os.Remove("/tmp/nonexist")
fmt.Println(err)
</code></pre>
<p class=lp>prints this output:</p>
<pre><code>remove /tmp/nonexist: no such file or directory
</code></pre>
<p class=lp>Not enough Go code adds context like <code>os.Remove</code> does. Too much code does only</p>
<pre><code>if err != nil {
return err
}
</code></pre>
<p class=lp>all the way up the call stack,
discarding useful context that should be reported
(like <code>remove</code> <code>/tmp/nonexist:</code> above).
I would like to try to understand whether our expectations
for including context are wrong, or if there is something
we can do to make it easier to write code that returns better errors.</p>
<p class=pp>There are also various discussions in the community about
agreed-upon interfaces for stripping error context.
I would like to try to understand when that makes sense and
whether we should adopt an official recommendation.</p>
<h2><a name="context"></a>Context & best practices</h2>
<p class=lp>We added the new <a href="https://golang.org/pkg/context/">context package</a>
in Go 1.7 for holding request-scoped information like
<a href="https://blog.golang.org/context">timeouts, cancellation state, and credentials</a>.
An individual context is immutable (like an individual string or int):
it is only possible to derive a new, updated context and
pass that context explicitly further down the call stack or
(less commonly) back up to the caller.
The context is now carried through APIs such as
<a href="https://golang.org/pkg/database/sql">database/sql</a>
and
<a href="https://golang.org/pkg/net/http">net/http</a>,
mainly so that those can stop processing a request when the caller
is no longer interested in the result.
Timeout information is appropriate to carry in a context,
but—to use a <a href="https://golang.org/issue/18284">real example we removed</a>—database options
are not, because they are unlikely to apply equally well to all possible
database operations carried out during a request.
What about the current clock source, or logging sink?
Is either of those appropriate to store in a context?
I would like to try to understand and characterize the
criteria for what is and is not an appropriate use of context.</p>
<h2><a name="memory"></a>Memory model</h2>
<p class=lp>Go’s <a href="https://golang.org/ref/mem">memory model</a> is intentionally low-key,
making few promises to users, compared to other languages.
In fact it starts by discouraging people from reading the rest of the document.
At the same time, it demands more of the compiler than other languages:
in particular, a race on an integer value is not sufficient license
for your program to misbehave in arbitrary ways.
But there are some complete gaps, in particular no mention of
the <a href="https://golang.org/pkg/sync/atomic/">sync/atomic package</a>.
I think the core compiler and runtime developers all agree
that the behavior of those atomics should be roughly the same as
C++ seqcst atomics or Java volatiles,
but we still need to write that down carefully in the memory model,
and probably also in a long blog post.
<a href="https://golang.org/issue/5045">#5045</a>,
<a href="https://golang.org/issue/7948">#7948</a>,
<a href="https://golang.org/issue/9442">#9442</a>.</p>
<h2><a name="immutability"></a>Immutability</h2>
<p class=lp>The <a href="https://golang.org/doc/articles/race_detector.html">race detector</a>
is one of Go’s most loved features.
But not having races would be even better.
I would love it if there were some reasonable way to integrate
<a href="https://www.google.com/search?q=%22reference+immutability%22">reference immutability</a> into Go,
so that programmers can make clear, checked assertions about what can and cannot
be written and thereby eliminate certain races at compile time.
Go already has one immutable type, <code>string</code>; it would
be nice to retroactively define that
<code>string</code> is a named type (or type alias) for <code>immutable</code> <code>[]byte</code>.
I don’t think that will happen this year,
but I’d like to understand the solution space better.
Javari, Midori, Pony, and Rust have all staked out interesting points
in the solution space, and there are plenty of research papers
beyond those.</p>
<p class=pp>In the long-term, if we could statically eliminate the possibility of races,
that would eliminate the need for most of the memory model.
That may well be an impossible dream,
but again I’d like to understand the solution space better.</p>
<h2><a name="generics"></a>Generics</h2>
<p class=lp>Nothing sparks more <a href="https://research.swtch.com/dogma">heated arguments</a>
among Go and non-Go developers than the question of whether Go should
have support for generics (or how many years ago that should have happened).
I don’t believe the Go team has ever said “Go does not need generics.”
What we <em>have</em> said is that there are higher-priority issues facing Go.
For example, I believe that better support for package management
would have a much larger immediate positive impact on most Go developers
than adding generics.
But we do certainly understand that for a certain subset of Go use cases,
the lack of parametric polymorphism is a significant hindrance.</p>
<p class=pp>Personally, I would like to be able to write general channel-processing
functions like:</p>
<pre><code>// Join makes all messages received on the input channels
// available for receiving from the returned channel.
func Join(inputs ...<-chan T) <-chan T
// Dup duplicates messages received on c to both c1 and c2.
func Dup(c <-chan T) (c1, c2 <-chan T)
</code></pre>
<p class=lp>I would also like to be able to write
Go support for high-level data processing abstractions,
analogous to
<a href="https://research.google.com/pubs/archive/35650.pdf">FlumeJava</a> or
C#’s <a href="https://en.wikipedia.org/wiki/Language_Integrated_Query">LINQ</a>,
in a way that catches type errors at compile time instead of at run time.
There are also any number of data structures or generic algorithms
that might be written,
but I personally find these broader applications more compelling.</p>
<p class=pp>We’ve <a href="https://research.swtch.com/generic">struggled</a> off and on
<a href="https://golang.org/design/15292-generics">for years</a>
to find the right way to add generics to Go.
At least a few of the past proposals got hung up on trying to design
something that provided both general parametric polymorphism
(like <code>chan</code> <code>T</code>) and also a unification of <code>string</code> and <code>[]byte</code>.
If the latter is handled by parameterization over immutability,
as described in the previous section, then maybe that simplifies
the demands on a design for generics.</p>
<p class=pp>When I first started thinking about generics for Go in 2008,
the main examples to learn from were C#, Java, Haskell, and ML.
None of the approaches in those languages seemed like a
perfect fit for Go.
Today, there are newer attempts to learn from as well,
including Dart, Midori, Rust, and Swift.</p>
<p class=pp>It’s been a few years since we ventured out and explored the design space.
It is probably time to look around again,
especially in light of the insight about mutability and
the additional examples set by newer languages.
I don’t think generics will happen this year,
but I’d like to be able to say I understand the solution space better.</p>
+
+
+ Go and Dogma
+ tag:research.swtch.com,2012:research.swtch.com/dogma
+
+ 2017-01-09T09:00:00-05:00
+ 2017-01-09T09:01:00-05:00
+ Programming language dogmatics.
+ <p class=lp>[<i>Cross-posting from last year’s <a href="https://www.reddit.com/r/golang/comments/46bd5h/ama_we_are_the_go_contributors_ask_us_anything/d05yyde/?context=3&st=ixq5hjko&sh=7affd469">Go contributors AMA</a> on Reddit, because it’s still important to remember.</i>]</p>
<p class=pp>One of the perks of working on Go these past years has been the chance to have many great discussions with other language designers and implementers, for example about how well various design decisions worked out or the common problems of implementing what look like very different languages (for example both Go and Haskell need some kind of “green threads”, so there are more shared runtime challenges than you might expect). In one such conversation, when I was talking to a group of early Lisp hackers, one of them pointed out that these discussions are basically never dogmatic. Designers and implementers remember working through the good arguments on both sides of a particular decision, and they’re often eager to hear about someone else’s experience with what happens when you make that decision differently. Contrast that kind of discussion with the heated arguments or overly zealous statements you sometimes see from users of the same languages. There’s a real disconnect, possibly because the users don’t have the experience of weighing the arguments on both sides and don’t realize how easily a particular decision might have gone the other way.</p>
<p class=pp>Language design and implementation is engineering. We make decisions using evaluations of costs and benefits or, if we must, using predictions of those based on past experience. I think we have an important responsibility to explain both sides of a particular decision, to make clear that the arguments for an alternate decision are actually good ones that we weighed and balanced, and to avoid the suggestion that particular design decisions approach dogma. I hope <a href="https://www.reddit.com/r/golang/comments/46bd5h/ama_we_are_the_go_contributors_ask_us_anything/d05yyde/?context=3&st=ixq5hjko&sh=7affd469">the Reddit AMA</a> as well as discussion on <a href="https://groups.google.com/group/golang-nuts">golang-nuts</a> or <a href="http://stackoverflow.com/questions/tagged/go">StackOverflow</a> or the <a href="https://forum.golangbridge.org/">Go Forum</a> or at <a href="https://golang.org/wiki/Conferences">conferences</a> help with that.</p>
<p class=pp>But we need help from everyone. Remember that none of the decisions in Go are infallible; they’re just our best attempts at the time we made them, not wisdom received on stone tablets. If someone asks why Go does X instead of Y, please try to present the engineering reasons fairly, including for Y, and avoid argument solely by appeal to authority. It’s too easy to fall into the “well that’s just not how it’s done here” trap. And now that I know about and watch for that trap, I see it in nearly every technical community, although some more than others.</p>
+
+
+ Lock-Free Bugs
+ tag:research.swtch.com,2012:research.swtch.com/lockfree
+
+ 2017-01-04T00:00:00-05:00
+ 2017-01-04T00:01:00-05:00
+ Locked frees and freed locks.
+ <p class=lp>[<i>I wrote this post in mid-2014 for debuggers.co, which seems to have gone at least partly defunct, so I am reproducing it here. That site collected answers from programmers to the prompt “What’s the most interesting bug you’ve encountered?”</i>]</p>
<p class=pp>To me, the most interesting bugs are the ones that reveal fundamental, subtle misunderstandings about the way a program works.
A good bug is like a good science experiment:
through it, you learn something unexpected
about the virtual world you are exploring.</p>
<p class=pp>About ten years ago I was working on a networked server that used threads,
coordinating with locks and condition variables.
This server was part of Plan 9 and was written in C.
Occasionally it would crash inside <code>malloc</code>,
which usually means some kind of memory corruption due
to a write-after-free error.
One day, while benchmarking with the bulk of the server disabled,
I was lucky enough to have the crash happen reproducibly.
The server being mostly disabled gave me a head start in isolating the bug,
and the reproducibility made it possible to cut code out, piece by piece,
until one section was very clearly implicated.</p>
<p class=pp>The code in question was cleaning up after a client that had recently disconnected.
In the server, there is a per-client data structure shared by two threads:
the thread R reads from the client connection, and the thread W writes to it.
R notices the disconnect as an EOF from a read, notifies W,
waits for an acknowledgement from W, and then frees the per-client structure.</p>
<p class=pp>To acknowledge the disconnect, W ran code like:</p>
<pre><code>qlock(&conn->lk);
conn->writer_done = 1;
qsignal(&conn->writer_ack);
qunlock(&conn->lk);
thread_exit();
</code></pre>
<p class=lp>And to wait for the acknowledgement, R ran code like:</p>
<pre><code>qlock(&conn->lk);
while(!conn->writer_done)
qwait(&conn->writer_ack);
// The writer is done, and so are we:
// free the connection.
free(conn);
</code></pre>
<p class=lp>This is a standard locks and condition variables piece of code:
<code>qwait</code> is defined to release the lock (here, <code>conn->lk</code>),
wait, and then reacquire the lock before returning.
Once R observes that <code>writer_done</code> is set,
R knows that W is gone, so R can <code>free</code> the per-connection data structure.</p>
<p class=pp>R does not call <code>qunlock(&conn->lk)</code>.
My reasoning was that calling <code>qunlock</code> before <code>free</code> sends mixed messages:
<code>qunlock</code> suggests coordination with another thread using <code>conn</code>,
but <code>free</code> is only safe if no other thread is using <code>conn</code>.
W was the other thread, and W is gone.
But somehow, when I added <code>qunlock(&conn->lk)</code> before <code>free(conn)</code>, the crashes stopped. Why?</p>
<p class=pp>To answer that, we have to look at how locks are implemented.</p>
<p class=pp>Conceptually, the core of a lock is a variable with two markings <em>unlocked</em> and <em>locked</em>.
To acquire a lock, a thread checks that the core is marked <em>unlocked</em>
and, if so, marks it <em>locked</em>, in one atomic operation.
Because the operation is atomic, if two (or more) threads are attempting to acquire the lock, only one can succeed.
That thread—let’s call it thread A—now holds the lock.
Another thread vying for the lock—thread B—sees the core is
marked <em>locked</em> and must now decide what to do.</p>
<p class=pp>The first, simplest approach, is to try again, and again, and again.
Eventually thread A will release the lock (by marking the core <em>unlocked</em>),
at which point thread B’s atomic operation will succeed.
This approach is called spinning, and a lock using this approach is called a <a href="http://en.wikipedia.org/wiki/Spinlock">spin lock</a>.</p>
<p class=pp>A simple spin lock implementation looks like:</p>
<pre><code>struct SpinLock
{
int bit;
};
void
spinlock(SpinLock *lk)
{
for(;;) {
if(atomic_cmp_and_set(&lk->bit, 0, 1))
return;
}
}
void
spinunlock(SpinLock *lk)
{
atomic_set(&lk->bit, 0);
}
</code></pre>
<p class=lp>The spin lock’s core is the <code>bit</code> field.
It is 0 or 1 to indicate unlocked or locked.
The <code>atomic_cmp_and_set</code> and <code>atomic_set</code>
use special machine instructions to manipulate <code>lk->bit</code> atomically.</p>
<p class=pp>Spinning only makes sense if the lock is never held for very long,
so that B’s spin loop only executes a small number of times.
If the lock can be held for longer periods of time, spinning while it is held
wastes CPU and can interact badly with the operating system scheduler.</p>
<p class=pp>The second, more general approach is to maintain a queue of threads interested in acquiring the lock.
In this approach, when thread B finds the lock already held,
it adds itself to the queue and uses an operating system primitive to go to sleep.
When thread A eventually releases the lock, it checks the queue, finds B,
and uses an operating system primitive to wake B.
This approach is called queueing, and a lock using this approach is called a queue lock.
Queueing is more efficient than spinning when the lock may be held for a long time.</p>
<p class=pp>The queue lock’s queue needs its own lock, almost always a spin lock.
In the library I was using, <code>qlock</code> and <code>qunlock</code> were implemented as:</p>
<pre><code>struct QLock
{
SpinLock spin;
Thread *owner;
ThreadQueue queue;
};
void
qlock(QLock *lk)
{
spinlock(&lk->spin);
if(lk->owner == nil) {
lk->owner = current_thread();
spinunlock(&lk->spin);
return;
}
push(&lk->queue, current_thread());
spinunlock(&lk->spin);
os_sleep();
}
void
qunlock(QLock *lk)
{
Thread *t;
spinlock(&lk->spin);
t = pop(&lk->queue);
lk->owner = t;
if(t != nil)
os_wakeup(t);
spinunlock(&lk->spin);
}
</code></pre>
<p class=lp>The queue lock’s core is the <code>owner</code> field.
If <code>owner</code> is <code>nil</code>, the lock is unlocked;
otherwise <code>owner</code> records the thread that holds the lock.
The operations on <code>lk->owner</code> are made atomic by
holding the spin lock <code>lk->spin</code>.</p>
<p class=pp>Back to the bug.</p>
<p class=pp>The locks in the crashing code were queue locks.
The acknowledgement protocol between R and W sets up a race between W’s call to <code>qunlock</code> and R’s call to <code>qlock</code> (either the explicit call in the code or the implicit call inside <code>qwait</code>).
Which call happens first?</p>
<p class=pp>If W’s <code>qunlock</code> happens first, then R’s <code>qlock</code> finds the lock unlocked, locks it, and everything proceeds uneventfully.</p>
<p class=pp>If R’s <code>qlock</code> happens first, it finds the lock held by W, so it adds R to the queue and puts R to sleep. Then W’s <code>qunlock</code> executes. It sets the owner to R, wakes up R, and unlocks the spin lock.
By the time W unlocks the spin lock, R may have already started running, and R may have already called <code>free(conn)</code>. The <code>spinunlock</code>’s <code>atomic_set</code> writes a zero to <code>conn->lk.spin.bit</code>.
That’s the write-after-free, and if the memory allocator didn’t want a zero there, the zero may cause a crash (or a memory leak, or some other behavior).</p>
<p class=pp>But is the server code wrong or is <code>qunlock</code> wrong?</p>
<p class=pp>The fundamental misunderstanding here is in the definition of the queue lock API.
Is a queue lock required to be unlocked before being freed?
Or is a queue lock required to support being freed while locked?
I had written the queue lock routines as part of a cross-platform library
mimicking Plan 9’s, and this question had not occurred to me when
I was writing <code>qunlock</code>.</p>
<p class=pp>One one hand, if the queue lock must be freed only when unlocked,
then <code>qunlock</code>’s implementation is correct
and the server must change.
If R calls <code>qunlock</code> before <code>free</code>,
then R’s <code>qunlock</code>’s <code>spinlock</code> must wait for W’s <code>qunlock</code>’s <code>spinunlock</code>,
so that W will really be gone by the time R calls <code>free</code>.</p>
<p class=pp>On the other hand, if the queue lock can be freed while locked, then the server is correct and
<code>qunlock</code> must change: the <code>os_wakeup</code> gives up
control of <code>lk</code> and must be delayed until after the <code>spinunlock</code>.</p>
<p class=pp>The Plan 9 documentation for queue locks does not address the question directly,
but the implementation was such that freeing locked queue locks was harmless,
and since I was using my library to run unmodified Plan 9 software,
I <a href="https://github.com/9fans/plan9port/commit/80b8842f3e4d562e67455de1c1de80cba5532aec">changed the lock implementation</a>
to call <code>os_wakeup</code> after <code>spinunlock</code>.
Two years later, while fixing a different bug, I defensively
<a href="https://github.com/9fans/plan9port/commit/4f6d2bb1e8e38aaeeeabb159272da19718bfb05d">changed the server implementation</a> to call
<code>qunlock</code> too, just in case.
The definition of the POSIX <a href="http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutex_init.html">pthread_mutex_destroy</a>
function gives a different answer to the same design question:
“It is safe to destroy an initialised mutex that is unlocked.
Attempting to destroy a locked mutex results in undefined behaviour.”</p>
<p class=pp>What did we learn?</p>
<p class=pp>The rationale I gave for not calling <code>qunlock</code> before <code>free</code>
made an implicit assumption that the two were independent.
After looking inside an implementation, we can see why
the two are intertwined and why an API might specify,
as POSIX does, that you must unlock a lock before destroying it.
This is an example of implementation concerns influencing an API,
creating a “<a href="http://en.wikipedia.org/wiki/Leaky_abstraction">leaky abstraction</a>.”</p>
<p class=pp>What makes this bug interesting is that it was caused by a
complex interaction between manual memory management and
<a href="http://blog.golang.org/concurrency-is-not-parallelism">concurrency</a>.
Obviously a program must stop using a resource before freeing it.
But a concurrent program must stop all threads from
using a resource before freeing it.
On a good day, that can require bookkeeping or careful coordination
to track which threads are still using the resource.
On a bad day, that can require reading the lock implementation
to understand the exact order of operations carried
out in the different threads.</p>
<p class=pp>In the modern computing world of clients and servers and clouds,
concurrency is a fundamental concern for most programs.
In that world, choosing garbage collection instead of
manual memory management eliminates a source of leaky abstractions
and makes programs simpler and easier to reason about.</p>
<p class=pp>I started the post by saying that good bugs help you learn something unexpected
about the virtual world you are exploring.
This was especially true for Maurice Wilkes and his team, who built <a href="http://en.wikipedia.org/wiki/Electronic_Delay_Storage_Automatic_Calculator">EDSAC</a>, the first practical stored-program computer.
The first program they ran on EDSAC (printing square numbers) ran correctly,
but the second did not: the <a href="http://www.cl.cam.ac.uk/relics/elog.html">log</a> for May 7, 1949 reads “Table of primes attempted - programme incorrect.”
That was a Saturday, making this the first weekend spent working on a buggy program.</p>
<p class=pp>What did they learn? Wilkes later recalled,</p>
<blockquote>
<p class=lp>“By June 1949, people had begun to realize that it was not so easy to get a program right as had at one time appeared. … It was on one of my journeys between the EDSAC room and the punching equipment that the realization came over me with full force that a good part of the remainder of my life was going to be spent in finding errors in my own programs.” (<a href="http://books.google.com/books?id=9Uc4AQAAIAAJ">Wilkes</a>, p. 145)</p>
</blockquote>
<p class=lp>For more about this early history, see Brian Hayes’s “<a href="http://bit-player.org/wp-content/extras/bph-publications/Sciences-1993-07-Hayes-EDSAC.pdf">The Discovery of Debugging</a>”
and Martin Campbell-Kelly’s “<a href="http://dx.doi.org/10.1109/85.194051">The Airy Tape: An Early Chapter in the History of Debugging</a>.”</p>
+
+
+ Version SAT
+ tag:research.swtch.com,2012:research.swtch.com/version-sat
+
+ 2016-12-13T10:00:00-05:00
+ 2016-12-13T10:01:00-05:00
+ Dependency hell is NP-complete
+ <style>
sub { font-size: 70% }
</style>
<p class=lp>Dependency hell is NP-complete. But maybe we can climb out.</p>
<p class=pp>The package version selection problem is to find a set of dependencies that can be used to build a top-level package P that is complete (all dependencies satisfied) and compatible (no two incompatible packages are selected). There may be no such set, because of the diamond dependency problem: perhaps A needs B and C; B needs D version 1, not 2; and C needs D version 2, not 1. In this case, assuming it’s not possible to choose both versions of D, there is no way to build A.</p>
<p class=pp><center><img src="version-sat.svg"></center></p>
<p class=pp>A package manager needs an algorithm to select package versions: when you run <code>apt-get install perl</code>, it may assume you mean the latest version of Perl, but then it has to find a way to satisfy Perl’s transitive dependencies, or else to print an understandable explanation of why Perl can’t be installed. You might reasonably wonder: how expensive is it to solve this problem, in the worst case? You probably don’t want your package manager to take hours or days or years to decide whether it can install Perl.</p>
<p class=pp>Unfortunately, the version selection problem is NP-complete,
which means that we’re exceedingly unlikely to find an algorithm guaranteed to run quickly on every input.
This post gives a proof of NP-completeness for version selection,
looks at how existing package managers cope,
and briefly discusses possible approaches to avoid an NP-complete task.</p>
<h2><a name="proof"></a>Proof of NP-Completeness</h2>
<p class=lp>To consider NP-completeness, we need to shift from our modern world of algorithms with rich outputs to the limited world of complexity theory,
where algorithms have one boolean output: yes or no.
In this world of complexity theory, we’ll define the VERSION problem (they’re always all caps) to ask whether there is a valid version selection.
This boolean VERSION problem is only half of our original problem, and we can prove that it’s NP-complete.
To do so, we need to prove two separate facts: that VERSION is in NP and that VERSION is NP-hard.</p>
<p class=pp>A problem is in NP if every “yes” answer has an easily-checked polynomial-size explanation.</p>
<p class=pp>VERSION is in NP, because any “yes” answer can be explained by listing the selected package versions.
This list is no bigger than the input and can be checked for correctness in time no worse than quadratic
in the input (probably linear, depending on details of the computing model).</p>
<p class=pp>A problem is NP-hard if an efficient solution for that problem can be adapted into an efficient solution to <em>every</em> other problem in NP.
That’s a pretty tall order, but it is enough for us to show how to adapt an efficient solution for VERSION
into an efficient solution for one other NP-hard problem (call it HARD) and then rely on the fact that
someone else has proven that an efficient solution for HARD can be adapted into an efficient solution
for every other problem in NP.</p>
<p class=pp>A useful example of an NP-complete (in NP and NP-hard) problem is 3-SAT.
In 3-SAT, the input is a boolean formula over some number of boolean variables,
constrained to be a conjunction (an AND) of some number of disjunctions (ORs)
of three literals each, where a literal is a variable or its negation.
For example, here is an input for 3-SAT (∧ means AND, ∨ means OR, and ¬ means NOT):</p>
<p class=pp><center>(¬ <i>x</i><sub>1</sub> ∨ ¬ <i>x</i><sub>2</sub> ∨ ¬ <i>x</i><sub>3</sub>) <font style="font-size: 120%;">∧</font> (¬ <i>x</i><sub>2</sub> ∨ ¬ <i>x</i><sub>3</sub> ∨ ¬ <i>x</i><sub>4</sub>) <font style="font-size: 120%;">∧</font> (¬ <i>x</i><sub>2</sub> ∨ ¬ <i>x</i><sub>2</sub> ∨ <i>x</i><sub>3</sub>) <font style="font-size: 120%;">∧</font> (<i>x</i><sub>2</sub> ∨ <i>x</i><sub>2</sub> ∨ <i>x</i><sub>2</sub>)</center></p>
<p class=pp>It is satisfiable by exactly one assignment to the variables—<i>x</i><sub>1</sub> = 0, <i>x</i><sub>2</sub> = 1, <i>x</i><sub>3</sub> = 1, <i>x</i><sub>4</sub> = 0—so the answer is yes.</p>
<p class=pp>If we extend it to add one more clause,</p>
<p class=pp><center>(¬ <i>x</i><sub>1</sub> ∨ ¬ <i>x</i><sub>2</sub> ∨ ¬ <i>x</i><sub>3</sub>) <font style="font-size: 120%;">∧</font> (¬ <i>x</i><sub>2</sub> ∨ ¬ <i>x</i><sub>3</sub> ∨ ¬ <i>x</i><sub>4</sub>) <font style="font-size: 120%;">∧</font> (¬ <i>x</i><sub>2</sub> ∨ ¬ <i>x</i><sub>2</sub> ∨ <i>x</i><sub>3</sub>) <font style="font-size: 120%;">∧</font> (<i>x</i><sub>2</sub> ∨ <i>x</i><sub>2</sub> ∨ <i>x</i><sub>2</sub>) <font style="font-size: 120%;">∧</font> (<i>x</i><sub>1</sub> ∨ ¬ <i>x</i><sub>2</sub> ∨ <i>x</i><sub>4</sub>)</center></p>
<p class=pp>then it is unsatisfiable by any assignment to the variables, so the answer is no.</p>
<p class=pp>The general form of a 3-SAT instance is a formula <i>F</i> that is the conjunction of
clauses <i>C</i><sub>1</sub> through <i>C</i><sub><i>n</i></sub> over variables <i>V</i><sub>1</sub> through <i>V</i><sub><i>m</i></sub>,
where each <i>C</i><sub><i>i</i></sub> is a disjunction of three literals, each of the form
<i>x</i><sub><i>j</i></sub> or ¬ <i>x</i><sub><i>j</i></sub> for some variable <i>x</i><sub><i>j</i></sub> .
Duplicate literals in a clause are allowed, as in (¬ <i>x</i><sub>2</sub> ∨ ¬ <i>x</i><sub>2</sub> ∨ <i>x</i><sub>3</sub>) and (<i>x</i><sub>2</sub> ∨ <i>x</i><sub>2</sub> ∨ <i>x</i><sub>2</sub>) above.</p>
<p class=pp>We can convert any 3-SAT instance to a VERSION instance with the same answer.
About the package manager we will assume only that:</p>
<ol>
<li>A package can list zero or more packages or specific package versions as dependencies.</li>
<li>To install a package, all its dependencies must be installed.</li>
<li>Each version of a package can have different dependencies.</li>
<li>Two different versions of a package cannot be installed simultaneously.</li>
</ol>
<p class=lp>We’ll abbreviate package <code>P</code> version <code>V</code> as <code>P:V</code>
(now using fixed-width font for packages to distinguish from the standard math italics for formulas).
A dependency on <code>P:V</code> must be satisfied by version <code>V</code> exactly, not <code>V</code>-1 and not <code>V</code>+1.</p>
<p class=pp>Given a 3-SAT formula, we can create a package <code>F</code> representing the whole formula,
packages <code>C1</code>, <code>C2</code>, …, <code>C<i>n</i></code> representing each clause,
and packages <code>X1</code>, <code>X2</code>, …, <code>X<i>m</i></code> representing each variable.</p>
<p class=pp>Each package <code>X<i>j</i></code> has two versions <code>X<i>j</i>:0</code> and <code>X<i>j</i>:1</code>.
As assumed above, <code>X<i>j</i>:0</code> and <code>X<i>j</i>:1</code> conflict and cannot both be installed.
<code>X<i>j</i>:1</code> being installed corresponds to <i>x</i><sub><i>j</i></sub> = 1 in the original formula.</p>
<p class=pp>Package <code>C<i>i</i></code> has three versions numbered 0, 1, 2, each of which depends on a literal from the corresponding clause.
For example, if <i>C</i><sub>5</sub> is (<i>x</i><sub>1</sub> ∨ ¬ <i>x</i><sub>2</sub> ∨ <i>x</i><sub>4</sub>), then <code>C5:0</code> depends on <code>X1:1</code>, <code>C5:1</code> depends on <code>X2:0</code>, and <code>C5:2</code> depends on <code>X4:1</code>.
<code>C<i>i</i>:<i>k</i></code> being installed corresponds to <i>C</i><sub><i>i</i></sub>’s <i>k</i>’th literal being true (and therefore <i>C<sub>i</sub></i> being true) in the original formula.</p>
<p class=pp>Package <code>F</code> depends on <code>C1</code>, <code>C2</code>, …, <code>C<i>n</i></code>.
<code>F</code> being installed implies that all the <code>C<i>i</i></code> are installed, which corresponds to all the <i>C</i><sub><i>i</i></sub> being true and therefore to <i>F</i> being true.</p>
<p class=pp>If the package manager can find a way to install package <code>F</code>, then a satisfying assignment for the
original formula can be read out from the install status of <code>X<i>j</i>:1</code> for each variable <i>x</i><sub><i>j</i></sub>.
Similarly, if the formula is satisfiable, the satisfying assignment gives one way the package manager
could successfully install <code>F</code>.
Therefore, we’ve converted the 3-SAT instance into a corresponding VERSION instance with the same answer,
which establishes that 3-SAT can be solved using VERSION, so VERSION is NP-hard.</p>
<p class=pp>Since VERSION is in NP and is NP-hard, VERSION is NP-complete.</p>
<h2><a name="implementations"></a>Implementations</h2>
<p class=lp>The assumptions above are quite minimal:
packages have a list of dependencies,
a package’s dependencies can change with its own version to version,
a package’s dependencies can be restricted to specific versions of those dependencies,
and it is possible for two versions of a package to conflict with each other.
That may be the bare minimum for a package manager to be useful.
Some package managers might not allow a dependency to list a specific version,
instead requiring a range, but we can easily change the version requirements 0 and 1
to ≤ 0 and ≥ 1.
Some package managers might not assume that different versions of a package
conflict by default, but it must be at least possible to specify such a conflict:
there can’t be two <code>/bin/bash</code> on a Unix system, or two definitions of <code>printf</code> built into a C program.</p>
<p class=pp>The assumptions are true of every package manager I have looked at:
Debian’s APT, RedHat’s RPM, Rust’s Cargo, Node’s npmjs, Java’s Maven, Haskell’s Cabal, and more.
The implication is that these package managers faces an NP-complete task.
Each must choose between possibly taking a very long time
to decide on an installation strategy or possibly reporting an installable
package as uninstallable.
(Of course, a given implementation may inadvertently do both.)</p>
<p class=pp>Knuth writes in <a href="http://ptgmedia.pearsoncmg.com/images/9780134397603/samplepages/9780134397603.pdf">Volume 4, Fascicle 6</a>:</p>
<blockquote>
<p class=lp>The story of satisfiability is the tale of a triumph of software engineering,
blended with rich doses of beautiful mathematics. Thanks to elegant new data
structures and other techniques, modern SAT solvers are able to deal routinely
with practical problems that involve many thousands of variables, although such
problems were regarded as hopeless just a few years ago.</p>
</blockquote>
<p class=lp>In practice, it does seem that modern package managers are moving toward using SAT solvers:</p>
<p class=pp><a href="http://0install.net/"><strong>0install</strong></a> started with heuristics but <a href="https://mail.mozilla.org/pipermail/rust-dev/2012-February/001378.html">found it necessary</a> to switch to <a href="http://0install.net/solver.html">a SAT solver</a>.</p>
<p class=pp><a href="https://chef.io"><strong>Chef</strong></a>, a systems integration framework, uses the <a href="https://github.com/chef/dep-selector">dep-selector Ruby bindings</a> for the <a href="http://www.gecode.org/">Gecode constraint solver</a>.</p>
<p class=pp><a href="https://pub.dartlang.org/"><strong>Dart’s pub</strong></a> includes a <a href="https://github.com/dart-lang/pub/blob/master/lib/src/solver/backtracking_solver.dart">backtracking solver</a> that <a href="https://github.com/dart-lang/pub/issues/912">often takes a long time</a>.</p>
<p class=pp><a href="https://wiki.debian.org/apt-get"><strong>Debian’s apt-get</strong></a> uses heuristics by default but can <a href="http://www.dicosmo.org/MyOpinions/index.php?post/2014/10/30/139-saved-yet-another-time-by-an-external-solver-for-apt">invoke a SAT solver</a>
and can
<a href="http://www.dicosmo.org/MyOpinions/index.php?post/2014/03/05/137-user-preferences-for-dependency-solvers-a-short-survey-and-new-features-added-in-the-latest-aspcud-solver">take user preferences into account</a>.
The Debian Quality Assurance team also <a href="http://www.dicosmo.org/MyOpinions/index.php?post/2014/05/21/138-static-analysis-of-software-component-repositories-from-debian-to-opam">runs a solver</a> to identify uninstallable packages in their repos.</p>
<p class=pp><a href="https://www.eclipse.org/"><strong>Eclipse</strong></a> uses the <a href="http://www.sat4j.org/">sat4j SAT solver</a> to <a href="https://forge.ow2.org/forum/forum.php?forum_id=1369">manage installation of its plugins</a>.</p>
<p class=pp><a href="https://lwn.net/Articles/503581/"><strong>Fedora’s DNF</strong></a> (“Dandified yum”) uses <a href="https://fedoraproject.org/wiki/Features/DNF#Detailed_Description">a SAT solver</a> in an experimental mode.</p>
<p class=pp><a href="https://github.com/freebsd/pkg"><strong>FreeBSD’s pkg</strong></a>, also used by DragonflyBSD, uses <a href="https://github.com/freebsd/pkg/tree/master/external/picosat">the picosat SAT solver</a>.</p>
<p class=pp><a href="https://opam.ocaml.org/"><strong>OCaml’s OPAM</strong></a> can <a href="https://opam.ocaml.org/doc/Specifying_Solver_Preferences.html">invoke a SAT solver locally or remotely over a network</a>. Like with Debian’s apt-get, OPAM’s solver can take user preferences into account,
and the OPAM repos are scanned for uninstallable packages.</p>
<p class=pp><a href="https://www.opensuse.org/"><strong>OpenSUSE</strong></a>’s package manager uses <a href="https://github.com/openSUSE/libsolv">libsolv</a>, “a free package dependency solver using a satisfiability algorithm.” There is also OpenSUSE’s zypper, which uses its own <a href="https://en.opensuse.org/openSUSE:Libzypp_satsolver">libzypp</a> SAT solver.</p>
<p class=pp><a href="https://www.continuum.io/anaconda-overview"><strong>Python’s Anaconda</strong></a> uses a <a href="https://www.continuum.io/blog/developer/new-advances-conda-0">SAT solver</a> but can <a href="https://groups.google.com/a/continuum.io/forum/#!topic/anaconda/CT7viK-fFDI">take a long time</a>.</p>
<p class=pp><a href="https://blog.rust-lang.org/2016/05/05/cargo-pillars.html"><strong>Rust’s Cargo</strong></a> uses a <a href="https://github.com/rust-lang/cargo/blob/8b5aec111926d1d03d2da32dd494e0fff073f870/src/cargo/core/resolver/mod.rs#L426">basic backtracking solver</a>. It also allows multiple versions of a crate to be linked into the final binary.</p>
<p class=pp><a href="https://docs.oracle.com/cd/E36784_01/html/E36856/docinfo.html#scrolltoc"><strong>Solaris’s pkg</strong></a>, also used by Illumos and sometimes known as IPS, <a href="https://blogs.oracle.com/barts/entry/satisfaction">uses the minisat SAT solver</a>.</p>
<p class=pp><a href="https://github.com/apple/swift-package-manager"><strong>Swift’s package manager</strong></a> uses a <a href="https://github.com/apple/swift-package-manager/blob/master/Sources/PackageGraph/DependencyResolver.swift#L518">basic backtracking solver</a>.</p>
<p class=pp>[I would like to add more package managers here. If you know details for one (or something here is wrong), please <a href="mailto:rsc@swtch.com">email me</a> or <a href="https://twitter.com/_rsc">send a tweet</a>. Thanks.]</p>
<h2><a name="alternatives"></a>Alternatives?</h2>
<p class=lp>How should we react to the fact that package version selection is NP-complete?
One reaction is to embrace the complexity and be thankful that
SAT solvers are as good as they are.
Another reaction is to ask whether this can possibly be a good idea.
Maybe we should not be building tools that require solving this problem.
Maybe something has gone wrong in the way we develop software.</p>
<p class=pp>If package version selection is NP-complete, that means
the search space of possible package combinations
is too large and intricate for efficient systematic analysis;
what about efficient systematic testing?
If a search finds a conflict-free combination, why should we believe the combination will work?
The absence of a version conflict may indicate only that the combination is untested.
If a search doesn’t find a conflict-free combination, how can that failure
be explained to a developer in a way that makes it clear
what to do next?
Software is hard enough to get right without admitting
NP-complete problems into our software configuration decisions.
Let’s reexamine how we got here and how we might escape.</p>
<p class=pp>The proof above depends on these of assumptions, copied from above:</p>
<ol>
<li>A package can list zero or more packages or specific package versions as dependencies.</li>
<li>To install a package, all its dependencies must be installed.</li>
<li>Each version of a package can have different dependencies.</li>
<li>Two different versions of a package cannot be installed simultaneously.</li>
</ol>
<p class=lp>The conventional wisdom, as I suggested above, is that these are roughly
the “the bare minimum for a package manager to be useful,”
but maybe we can find a way to reduce them after all.</p>
<p class=pp>One way to avoid NP-completeness is to attack assumption 1:
what if, instead of allowing a dependency to list specific package versions,
a dependency can only specify a minimum version?
Then there is a trivial algorithm for finding the packages to use:
start with the newest version of what you want to install,
and then get the newest version of all its dependencies,
recursively.
In the original diamond dependency at the beginning of this article,
A needs B and C, and B and C need different versions of D.
If B needs D 1.5 and C needs D 1.6, the build can use D 1.6 for both.
If B doesn’t work with D 1.6,
then either the version of B we’re considering is buggy or D 1.6 is buggy.
The buggy version should be removed from circulation entirely,
and then a new released version should fix the problem.
Adding a conflict to the dependency graph instead
is like documenting a bug instead of fixing it.</p>
<p class=pp>Another way to avoid NP-completeness is to attack assumption 4:
what if two different versions of a package could be installed
simultaneously?
Then almost any search algorithm will find a combination of
packages to build the program; it just might not be the
smallest possible combination (that’s still NP-complete).
If B needs D 1.5 and C needs D 2.2, the build can include both
packages in the final binary, treating them as distinct packages.
I mentioned above that there can’t be two definitions of <code>printf</code> built into a C program,
but languages with explicit module systems should have no
problem including separate copies of D (under different fully-qualified names) into a program.</p>
<p class=pp>Another way to avoid NP-completeness is to combine the previous two.
As the examples already hint at,
if packages follow <a href="http://semver.org/">semantic versioning</a>,
a package manager might automatically use the newest version
of a dependency within a major version but then treat
different major versions as different packages.</p>
<p class=pp>One rationale for such restrictions is that developers are likely not thinking
about the entire space of all possible package combinations when building
or testing software. It would help for the developers and their tools to
agree about how software is built.
If any of these approaches can be made to work in practice,
it could go a long way toward simplifying the operation
and understandability of language package managers.</p>
<h2><a name="related"></a>Related Work</h2>
<p class=lp>Proofs that Debian and RedHat package installation are both NP-complete are given in
“<a href="https://hal.inria.fr/hal-00697463">EDOS deliverable WP2-D2.1: Report on Formal Management of Software Dependencies</a>” (2005), pages 49-50.
The difficult step in the reduction of 3-SAT to package installation
is how to construct a disjunction.
The EDOS proofs encode the disjunction using the package manager’s
ability to specify a list of alternatives for a single dependency,
either directly (in Debian) or using “provides” directives (in RedHat).
For example, these systems allow a pseudo-package <code>text-editor</code>
to be defined that is considered installed when any of the real packages
<code>ed</code>, <code>vi</code>, or <code>acme</code> is installed.</p>
<p class=pp>The dependency specifications for a language package manager
like Rust’s Cargo are dramatically simpler than those for Debian and RedHat,
and so the EDOS proofs do not apply.
One might therefore hope that language package managers face
an easier (not NP-complete) job.
The new proof above dashes that hope.
(One way to view the proof above is that it simulates the “provides” directive
in the last example by defining a <code>text-editor</code> package with three versions,
one of which depends on <code>ed</code>, one on <code>vi</code>, and one on <code>acme</code>.)</p>
<p class=pp>By encoding the disjunction in the changing dependencies
of different versions of a package, the new proof works without modification
for both Debian’s and RedHat’s package managers but also applies to essentially
any foreseeable operating system or language package manager.
I suspect that most language package manager authors assumed
the problem they faced was NP-complete, but I’ve been unable to find
prior written proofs of that fact.</p>
<p class=pp>A few dependency systems use constraint solvers instead of SAT solvers,
but the underlying problem is <a href="https://en.wikipedia.org/wiki/Schaefer%27s_dichotomy_theorem">still NP-complete</a>.</p>
<p class=pp>In 2008, Daniel Burrows wrote a blog post about <a href="http://web.archive.org/web/20160326062818/http://algebraicthunk.net/~dburrows/blog/entry/package-management-sudoku/">using dpkg to solve Sudoku problems</a>.</p>
<p class=pp>Thanks to Sam Boyer for pointing me at the EDOS report
and for his excellent <a href="https://medium.com/@sdboyer/so-you-want-to-write-a-package-manager-4ae9c17d9527">overview of package management</a>.</p>
<p class=pp>Roberto Di Cosmo has written a number of followups to the EDOS report,
<a href="http://www.dicosmo.org/Publications/publi-by-topic.html">listed here</a>, in particular,
“<a href="http://www.dicosmo.org/Articles/2012-AbateDiCosmoTreinenZacchiroli-Jss.pdf">Dependency solving: a separate concern in component evolution management</a>,”
which contains an updated proof.
That line of research applies SAT solvers but also works to take user preferences into account.</p>
<p class=pp>Another related line of work is “<a href="https://cseweb.ucsd.edu/~lerner/papers/opium.pdf">OPIUM: Optimal Package Install/Uninstall Manager</a>” by Tucker et al., ICSE 2007. OPIUM was the <a href="http://0install.net/solver.html#idp172528">starting point for 0install’s solver</a>.</p>
<p class=pp>Jaroslav Tulach discovered the <a href="http://wiki.apidesign.org/wiki/LibraryReExportIsNPComplete">same proof as above in 2009</a>.
Thanks to HN reader <a href="https://news.ycombinator.com/item?id=13167981">edwintorok for the link</a>.</p>
<p class=pp>The <a href="http://lambda-the-ultimate.org/node/3588">discussion of Tulach’s proof on LtU</a> mentions Daniel Burrows’s 2005 paper “<a href="https://people.debian.org/~dburrows/model.pdf">Modelling and Resolving Software Dependencies</a>,” but that paper’s proof is more like the EDOS proof than Tulach’s proof / the proof above.</p>
<p class=pp>Many readers sent additional links to references and to package managers with SAT solvers. Thanks to all.</p>
+
+
+ Hacking the OS X Kernel for Fun and Profiles
+ tag:research.swtch.com,2012:research.swtch.com/macpprof
+
+ 2013-08-13T11:00:00-04:00
+ 2013-08-13T11:00:00-04:00
+ Modifying the OS X kernel binary to make user-level CPU profiling work
+
<style>
</style>
<p class="lp">
My last post described how user-level CPU profilers work,
and specifically how Google’s pprof profiler gathers its CPU profiles
with the help of the operating system.
The specific feature needed from the operating system is
the profiling timer provided by <i>setitimer</i>(2) and the
<code>SIGPROF</code> signals that it delivers.
</p>
<p class="pp">
If the operating system’s implementation of that feature doesn’t work,
then the profiler doesn’t work.
This post looks at a common bug in Unix implementations
of profiling signals and the fix for OS X, applied by editing
the OS X kernel binary.
</p>
<p class="pp">
If you haven’t read “<a href="pprof">How to Build a User-Level CPU Profiler</a>,’’ you might want to start there.
</p>
<h3>Unix and Signals and Threads</h3>
<p class="pp">
My earlier post referred to profiling <i>programs</i>, without mention
of processes or threads.
Unix in general and SIGPROF in particular predate the idea of threads.
SIGPROF originated in the 4.2BSD release of Berkeley Unix, published in 1983.
In Unix at the time, a process was a single thread of execution.
</p>
<p class="pp">
Threads did not come easily to Unix.
Early implementations were slow and buggy and best avoided.
Each of the popular Unix variants added thread support
independently, with many shared mistakes.
</p>
<p class="pp">
Even before we get to implementation, many of the original Unix APIs
are incompatible with the idea of threads.
Multithreaded processes allow multiple threads of execution in a
single process address space.
Unix maintains much per-process state, and the kernel authors
must decide whether each piece of state should remain per-process
or change to be per-thread.
</p>
<p class="pp">For example, the single process stack must be split into per-thread stacks:
it is impossible for independently executing threads to be running on
a single stack.
Because there are many threads, thread stacks tend to be smaller than the
one big process stack that non-threaded Unix programs had.
As a result, it can be important to define a separate stack for running
signal handlers.
That setting is per-thread, for the same reason that ordinary stacks are per-thread.
But the choice of handler is per-process.
</p>
<p class="pp">
File descriptors are per-process, but then one thread might open a file moments
before another thread forks and execs a new program. In order for the open file not
to be inherited by the new program, we must introduce a new variant of <i>open</i>(2)
that can open a file descriptor atomically marked “close on exec.’’ And not just open:
every system call that creates a new file descriptor needs a variant that
creates the file descriptor “close on exec.’’
</p>
<p class="pp">
Memory is per-process, so malloc must use a lock to serialize access
by independent threads. But again, one thread might acquire the malloc lock
moments before another thread forks and execs a new program.
The fork makes a new copy of the current process memory, including
the locked malloc lock, and that copy will never see the unlock by the
thread in the original program. So the child of fork can no longer use malloc
without occasional deadlocks.
</p>
<p class="pp">
That’s just the tip of the iceberg.
There are a lot of changes to make, and it’s easy to miss one.
</p>
<h3>Profiling Signals</h3>
<p class="pp">
Here’s a thread-related change that is easy to miss.</p>
<p class="pp">
The goal of the profiling signal is to enable user-level profiling.
The signal is sent in response to a program using up a certain amount of CPU time.
More specifically, in a multithreaded kernel, the profiling signal is sent
when the hardware timer interrupts a thread and the timer interrupt
handler finds that the execution of that thread has caused the
thread’s process’s profiling timer to expire.
In order to profile the code whose execution triggered the timer,
the profiling signal must be sent to the thread that is running.
If the signal is sent to a thread that is not running, the profile will
record idleness such as being blocked on I/O or sleeping
as execution and will be neither accurate nor useful.
</p>
<p class="pp">
Modern Unix kernels support sending a signal
to a process, in which case it can be delivered to an arbitrary thread,
or to a specific thread. <i>Kill</i>(2) sends a signal to a process, and
<i>pthread_kill</i>(2) sends a signal to a specific thread within a process.
<p class="pp">
Before Unix had threads, the code that delivered a profiling signal
looked like <code>psignal(p,</code> <code>SIGPROF)</code>, where
<code>psignal</code> is a clearer name for the implementation
of the <i>kill</i>(2) system call and <code>p</code> is the process
with the timer that just expired.
If there is just one thread per process, delivering the signal to the
process cannot possibly deliver it to the wrong thread.
</p>
<p class="pp">
In multithreaded programs, the <code>SIGPROF</code> must be
delivered to the running thread: the kernel must call the internal equivalent
of <i>pthread_kill</i>(2), not <i>kill</i>(2).
</p>
<p class="pp">
FreeBSD and Linux deliver profiling signals correctly.
Empirically, NetBSD, OpenBSD, and OS X do not.
(Here is a <a href="sigtest.c">simple C test program</a>.)
Without correct delivery of profiling signals, it is impossible
to build a correct profiler.
</p>
<h3>OS X Signal Delivery</h3>
<p class="lp">
To Apple’s credit, the OS X kernel sources are published and open source,
so we can look more closely at the buggy OS X implementation.
</p>
<p class="pp">
The profiling signals are delivered by the function <code>bsd_ast</code>
in the file <a href="http://www.opensource.apple.com/source/xnu/xnu-2050.22.13/bsd/kern/kern_sig.c">kern_sig.c</a>.
Here is the relevant bit of code:
</p>
<pre>
void
bsd_ast(thread_t thread)
{
proc_t p = current_proc();
...
if (timerisset(&p->p_vtimer_prof.it_value)) {
uint32_t microsecs;
task_vtimer_update(p->task, TASK_VTIMER_PROF, &microsecs);
if (!itimerdecr(p, &p->p_vtimer_prof, microsecs)) {
if (timerisset(&p->p_vtimer_prof.it_value))
task_vtimer_set(p->task, TASK_VTIMER_PROF);
else
task_vtimer_clear(p->task, TASK_VTIMER_PROF);
<b>psignal(p, SIGPROF);</b>
}
}
...
}
</pre>
<p class="pp">
The <code>bsd_ast</code> function is the BSD half of the OS X timer interrupt handler.
If profiling is enabled, <code>bsd_ast</code> decrements the timer and sends the signal
if the timer expires.
The innermost if statement is resetting the the timer state,
because <i>setitimer</i>(2) allows both one-shot and periodic timers.
</p>
<p class="pp">
As predicted, the code is sending the profiling signal to the process,
not to the current thread.
There is a function <code>psignal_uthread</code> defined in
the same source file that sends a signal instead to a specific thread.
One possible fix is very simple:
change <code>psignal</code> to <code>psignal_uthread</code>.
</p>
<p class="pp">
I filed a report about this bug as <a href="http://golang.org/change/35b716c94225">Apple Bug Report #9177434</a> in March 2011,
but the bug has persisted in subsequent releases of OS X.
In my report, I suggested a different fix, inside the implementation of <code>psignal</code>,
but changing <code>psignal</code> to <code>psignal_uthread</code>
is even simpler.
Let’s do that.
</p>
<h3>Patching the Kernel</h3>
<p class="lp">
It should be possible to rebuild the OS X kernel from the released sources.
However, I do not know whether the sources are complete, and I do not know
what configuration I need to use to recreate the kernel on my machine.
I have no confidence that I’d end up with a kernel appropriate for my computer.
Since the fix is so simple, it should be possible to just modify the standard OS X kernel binary directly.
That binary lives in <code>/mach_kernel</code> on OS X computers.
</p>
<p class="pp">
If we run <code>gdb</code> on <code>/mach_kernel</code> we can see the compiled machine
code for <code>bsd_ast</code> and find the section we care about.
</p>
<pre>
$ gdb /mach_kernel
(gdb) disas bsd_ast
Dump of assembler code for function bsd_ast:
0xffffff8000568a50 <bsd_ast+0>: push %rbp
0xffffff8000568a51 <bsd_ast+1>: mov %rsp,%rbp
...
<i>if (timerisset(&p->p_vtimer_prof.it_value))</i>
0xffffff8000568b7b <bsd_ast+299>: cmpq $0x0,0x1e0(%r15)
0xffffff8000568b83 <bsd_ast+307>: jne 0xffffff8000568b8f <bsd_ast+319>
0xffffff8000568b85 <bsd_ast+309>: cmpl $0x0,0x1e8(%r15)
0xffffff8000568b8d <bsd_ast+317>: je 0xffffff8000568b9f <bsd_ast+335>
<i>task_vtimer_set(p->task, TASK_VTIMER_PROF);</i>
0xffffff8000568b8f <bsd_ast+319>: mov 0x18(%r15),%rdi
0xffffff8000568b93 <bsd_ast+323>: mov $0x2,%esi
0xffffff8000568b98 <bsd_ast+328>: callq 0xffffff80002374f0 <task_vtimer_set>
0xffffff8000568b9d <bsd_ast+333>: jmp 0xffffff8000568bad <bsd_ast+349>
<i>task_vtimer_clear(p->task, TASK_VTIMER_PROF);</i>
0xffffff8000568b9f <bsd_ast+335>: mov 0x18(%r15),%rdi
0xffffff8000568ba3 <bsd_ast+339>: mov $0x2,%esi
0xffffff8000568ba8 <bsd_ast+344>: callq 0xffffff8000237660 <task_vtimer_clear>
<i>psignal(p, SIGPROF);</i>
0xffffff8000568bad <bsd_ast+349>: mov %r15,%rdi
0xffffff8000568bb0 <bsd_ast+352>: xor %esi,%esi
0xffffff8000568bb2 <bsd_ast+354>: xor %edx,%edx
0xffffff8000568bb4 <bsd_ast+356>: xor %ecx,%ecx
0xffffff8000568bb6 <bsd_ast+358>: mov $0x1b,%r8d
0xffffff8000568bbc <bsd_ast+364>: callq 0xffffff8000567340 <threadsignal+224>
...
</pre>
<p class="lp">
I’ve annotated the assembly with the corresponding C code in italics.
The final sequence is odd. It should be a call to <code>psignal</code> but instead it is a call to
code 224 bytes beyond the start of the <code>threadsignal</code> function.
What’s going on is that <code>psignal</code> is a thin wrapper around
<code>psignal_internal</code>, and that wrapper has been inlined.
Since <code>psignal_internal</code> is a static function, it does not appear
in the kernel symbol table, and so <code>gdb</code> doesn’t know its name.
</p>
<p class="pp">
The definitions of <code>psignal</code> and <code>psignal_uthread</code> are:
</p>
<pre>
void
psignal(proc_t p, int signum)
{
psignal_internal(p, NULL, NULL, 0, signum);
}
static void
psignal_uthread(thread_t thread, int signum)
{
psignal_internal(PROC_NULL, TASK_NULL, thread, PSIG_THREAD, signum);
}
</pre>
<p class="lp">
With the constants expanded, the call we’re seeing is <code>psignal_internal(p,</code> <code>0,</code> <code>0,</code> <code>0,</code> <code>0x1b)</code>
and the call we want to turn it into is <code>psignal_internal(0,</code> <code>0,</code> <code>thread,</code> <code>4,</code> <code>0x1b)</code>.
All we need to do is prepare the different argument list.
</p>
<p class="pp">
Unfortunately, the <code>thread</code> variable was passed to <code>bsd_ast</code> in a register,
and since it is no longer needed where we are in the function, the register has been reused
for other purposes: <code>thread</code> is gone.
</p>
<p class="pp">
Fortunately, <code>bsd_ast</code>’s one and only invocation in the kernel is
<code>bsd_ast(current_thread())</code>, so we can reconstruct the value by calling
<code>current_thread</code> ourselves.
</p>
<p class="pp">
Unfortunately, there is no room in the 15 bytes from <code>bsd_ast+349</code> to <code>bsd_ast+364</code>
to insert such a call and still prepare the other arguments.
</p>
<p class="pp">
Fortunately, we can optimize a bit of the preceding code to make room.
Notice that the calls to <code>task_vtimer_set</code> and <code>task_vtimer_clear</code>
are passing the same argument list, and that argument list is prepared in both sides
of the conditional:
</p>
<pre class="oldcode">
...
<i>if (timerisset(&p->p_vtimer_prof.it_value))</i>
0xffffff8000568b7b <bsd_ast+299>: cmpq $0x0,0x1e0(%r15)
0xffffff8000568b83 <bsd_ast+307>: jne 0xffffff8000568b8f <bsd_ast+319>
0xffffff8000568b85 <bsd_ast+309>: cmpl $0x0,0x1e8(%r15)
0xffffff8000568b8d <bsd_ast+317>: je 0xffffff8000568b9f <bsd_ast+335>
<i>task_vtimer_set(p->task, TASK_VTIMER_PROF);</i>
0xffffff8000568b8f <bsd_ast+319>: <b>mov 0x18(%r15),%rdi</b>
0xffffff8000568b93 <bsd_ast+323>: <b>mov $0x2,%esi</b>
0xffffff8000568b98 <bsd_ast+328>: callq 0xffffff80002374f0 <task_vtimer_set>
0xffffff8000568b9d <bsd_ast+333>: jmp 0xffffff8000568bad <bsd_ast+349>
<i>task_vtimer_clear(p->task, TASK_VTIMER_PROF);</i>
0xffffff8000568b9f <bsd_ast+335>: <b>mov 0x18(%r15),%rdi</b>
0xffffff8000568ba3 <bsd_ast+339>: <b>mov $0x2,%esi</b>
0xffffff8000568ba8 <bsd_ast+344>: callq 0xffffff8000237660 <task_vtimer_clear>
<i>psignal(p, SIGPROF);</i>
0xffffff8000568bad <bsd_ast+349>: mov %r15,%rdi
0xffffff8000568bb0 <bsd_ast+352>: xor %esi,%esi
0xffffff8000568bb2 <bsd_ast+354>: xor %edx,%edx
0xffffff8000568bb4 <bsd_ast+356>: xor %ecx,%ecx
0xffffff8000568bb6 <bsd_ast+358>: mov $0x1b,%r8d
0xffffff8000568bbc <bsd_ast+364>: callq 0xffffff8000567340 <threadsignal+224>
...
</pre>
<p class="lp">
We can pull that call setup above the conditional, eliminating one copy
and giving ourselves nine bytes to use for delivering the signal.
A call to <code>current_thread</code> would take five bytes, and then
moving the result into an appropriate register would take two more,
so nine is plenty.
In fact, since we have nine bytes,
we can inline the body of <code>current_thread</code>—a single nine-byte <code>mov</code> instruction—and change it to store the result to the correct register directly.
That avoids needing to prepare a position-dependent call instruction.
</p>
<p class="pp">
The final version is:
</p>
<pre class="oldcode">
...
0xffffff8000568b7b <bsd_ast+299>: <b>mov 0x18(%r15),%rdi</b>
0xffffff8000568b7f <bsd_ast+303>: <b>mov $0x2,%esi</b>
0xffffff8000568b84 <bsd_ast+308>: cmpq $0x0,0x1e0(%r15)
0xffffff8000568b8c <bsd_ast+316>: jne 0xffffff8000568b98 <bsd_ast+328>
0xffffff8000568b8e <bsd_ast+318>: cmpl $0x0,0x1e8(%r15)
0xffffff8000568b96 <bsd_ast+326>: je 0xffffff8000568b9f <bsd_ast+335>
0xffffff8000568b98 <bsd_ast+328>: callq 0xffffff80002374f0 <task_vtimer_set>
0xffffff8000568b9d <bsd_ast+333>: jmp 0xffffff8000568ba4 <bsd_ast+340>
0xffffff8000568b9f <bsd_ast+335>: callq 0xffffff8000237660 <task_vtimer_clear>
0xffffff8000568ba4 <bsd_ast+340>: <b>xor %edi,%edi</b>
0xffffff8000568ba6 <bsd_ast+342>: xor %esi,%esi
0xffffff8000568ba8 <bsd_ast+344>: <b>mov %gs:0x8,%rdx</b>
0xffffff8000568bb1 <bsd_ast+353>: <b>mov $0x4,%ecx</b>
0xffffff8000568bb6 <bsd_ast+358>: mov $0x1b,%r8d
0xffffff8000568bbc <bsd_ast+364>: callq 0xffffff8000567340 <threadsignal+224>
...
</pre>
<p class="pp">
If we hadn’t found the duplicate call setup to factor out,
another possible approach would have been to factor the two very similar
code blocks handling <code>SIGVTALRM</code> and <code>SIGPROF</code> into a single subroutine,
sitting in the middle of the <code>bsd_ast</code> function code, and to call it twice.
Removing the second copy of the code would leave plenty of space
for the longer <code>psignal_uthread</code> call setup.
</p>
<p class="pp">
The code we’ve been using is from OS X Mountain Lion, but all versions of OS X have this bug,
and the relevant bits of <code>bsd_ast</code> haven’t changed from version to version,
although the compiler and therefore the generated code do change.
Even so, all have the basic pattern and all can be fixed with the same kind of rewrite.
</p>
<h3>Using the Patch</h3>
<p>
If you use the Go or the C++ gperftools and want accurate CPU profiles on OS X, I’ve packaged up the
binary patcher as <a href="http://godoc.org/code.google.com/p/rsc/cmd/pprof_mac_fix">code.google.com/p/rsc/cmd/pprof_mac_fix</a>.
It can handle OS X Snow Leopard, Lion, and Mountain Lion.
Will OS X Mavericks need a fix too?
We’ll see.
</p>
<h3>Further Reading</h3>
<p>
Binary patching is an old, venerable technique. This is just a simple instance of it.
If you liked reading about this, you may also like to read Jeff Arnold’s paper
“<a href="http://www.ksplice.com/doc/ksplice.pdf">Ksplice: Automatic Rebootless Kernel Updates</a>.’’
Ksplice can construct binary patches for Linux security vulnerabilities
and apply them on the fly to a running system.
</p>
+
+
+ How To Build a User-Level CPU Profiler
+ tag:research.swtch.com,2012:research.swtch.com/pprof
+
+ 2013-08-08T13:00:00-04:00
+ 2013-08-08T13:00:00-04:00
+ The internals of Google's pprof CPU Profiler (for C++ and Go)
+
<p class="lp">
When I spent a summer as a Google intern in 2006,
one of the many pleasant surprises was Google’s pprof tool,
which makes profiling a C++ program’s CPU and memory usage incredibly easy.
It had already been open sourced, and when I returned to grad school,
I incorporated pprof into my standard development toolbox when
writing C programs.
Later, when I was back at Google working on Go, implementing
support for pprof was a must.
Now it’s part of the standard development toolbox for any Go programmer.
</p>
<p class="pp">
I’ve written on the Go blog about
<a href="http://blog.golang.org/profiling-go-programs">what it’s like to use pprof
to profile Go programs</a>.
This post is about how pprof gathers the CPU profile,
with the help of hardware timers and the operating system.
</p>
<h3>Hardware Timers</h3>
<p class="pp">
One of the key jobs of an operating system is to allow multiple programs to run
on a computer at the same time, each under the illusion that they have continuous
access to one or more CPUs, even though in practice each CPU can only be
running one program at a time.
On most systems, what happens is that the operating system asks the computer’s timer chip
to interrupt normal execution every so often (every 10 milliseconds is common)
and run a small piece of the operating system called, appropriately enough,
the timer interrupt handler.
The timer interrupt handler checks to see if other programs are waiting to run.
If so, and if the current program has used up its turn on the CPU, the handler
saves the CPU registers of the current program and loads the CPU registers for
another program that has been waiting.
Shuffling the programs on and off the CPUs is called multitasking, and doing it
based on hardware interrupts like this is called preemptive multitasking: one
running program is preempted to make room for another.
</p>
<p class="pp">
Not all operating systems provide preemptive multitasking.
Some, like MS-DOS or iOS 3, have no multitasking, so only one program can run at a time.
Others, like Windows 3.1 and Mac OS 9, use cooperative multitasking,
in which programs voluntarily relinquish the CPU at certain points.
Cooperative multitasking avoids the complexity of using the timer,
but it means that one badly written program
can hang a machine.
</p>
<p class="pp">
Another useful thing you can do with a hardware interrupt is gather a profile
of a running program.
Every time the hardware interrupt happens, the operating system can record
what the program was doing. A collection of these samples makes up a
(hopefully representative) profile of where the program spends its time.
</p>
<h3>A Simple Profiler</h3>
<p class="pp">
Since the operating system moderates access to the hardware, it must be
involved to use the hardware timer to implement a profiler.
The simplest approach is for the operating system to collect the profile.
To illustrate this approach, I’ll describe what the Plan 9 kernel does
for user-level profiling.
This is little changed from the original Unix <i>profil</i>(2) scheme.
</p>
<p class="pp">
When a program is running, writing to a control file in the /proc
file system enables profiling.
At that point, the operating system allocates an array of counts
with one count for every 8-byte section of the program code,
and attaches it to the program.
Then, each time a timer interrupt happens, the handler
uses the program counter—the address of the instruction in the
code that the program is currently executing—divided by 8 as
an index into that array and increments that entry.
Later, another program (on Plan 9, called <i>tprof</i>) can be run to
read the profile from the kernel and determine the function
and specific line in the original source code corresponding to
each counter and summarize the results.
</p>
<p class="pp">
This design keeps the kernel very simple: the timer handler only
adds an increment instruction. However, it is also inflexible: that’s
all the kernel will do for a program.
And there are potential improvements that could be made with
more flexibility. For example, in programs that use libraries, the
profiles may not have enough context to be useful.
If you find your program is spending 30% of its time in <code>memset</code>
but you don’t know what is calling <code>memset</code>, you can’t fix the problem.
</p>
<p class="pp">
The next step forward is to move profiling logic out of the kernel,
so that it is easier to customize.
</p>
<h3>User-Level Timers</h3>
<p class="pp">
Modern Unix systems move profiling logic out of the kernel by providing
a timer abstraction to user programs. The programs can then
build whatever they want, including profiling.
(Another use might be to build preemptive scheduling in a user-level
lightweight thread scheduler.)
</p>
<p class="pp">
On these systems, <i>setitimer</i>(2) provides three timers, for “real time,’’ “virtual time,’’
and “profiling time.’’
The “real time’’ timer counts down in real (wall clock) time. If it is set for 5 seconds,
it fires 5 seconds from now.
The “virtual time’’ timer counts down in program execution time. If it is set for 5 seconds,
it fires after the program has executed for 5 seconds.
The “profiling time’’ timer is similar except that it also counts down when
the kernel is executing a system call on behalf of the program.
When any of these timers fires, the kernel stops what the program is doing
and invokes a special routine in the program called a signal handler.
The signal handler in a program is analogous to the timer interrupt handler
in the kernel.
The signal being delivered depends on the kind of timer: <code>SIGALRM</code>, <code>SIGVTALRM</code>, or <code>SIGPROF</code> for the three kinds.
</p>
<p class="pp">
A program that wants to profile its own execution can set a profiling timer
and then arrange to record a profiling sample in its signal handler.
Because the profiling is being done by the program, not by the kernel,
it can be replaced without kernel changes and reboots,
by changing the program and recompiling.
This allows experimentation and in turn the construction of richer
profiles. In particular, it allows gathering more information in each
profiling sample.
</p>
<h3>Profiling with pprof</h3>
<p class="pp">
In pprof, each profiling sample records not just the current program counter
but also the program counter for each frame in the current call stack.
</p>
<p class="pp">
Obtaining the current call stack is not always trivial: typically it requires
arranging for the code being executed to maintain a certain form
(for example, to use a frame pointer in all functions) or arranging for
additional metadata to be available during the trace.
But modern computers are incredibly fast: even walking the call stack
using metadata lookups can be done in well under 100 microseconds,
which would correspond to only a 1% slowdown for a 10 millisecond profiling
period.
</p>
<p class="pp">
Recording a sampled stack is a little tricky. The signal handler, because it
interrupts normal program execution, is limited in what it can do.
In particular, the signal handler cannot even allocate memory or
acquire locks, so the stored profile cannot grow dynamically.
</p>
<p class="pp">
In pprof, the profile is maintained in a hash table in which each entry
records a distinct stack. Specifically, in the Go pprof,
each stack hashes to a specific hash value
denoting one of 1024 buckets in a hash table, and in that bucket are four entries for stacks with
that hash. If the stack being recorded is already present, the existing
entry’s count is simply incremented. Otherwise, the stack must replace
one of the four entries. If one or more is unused, the decision is easy.
If all four entries are in use, pprof evicts the entry with the smallest
count. The evicted entry is appended to a fixed-size log with space for
2<sup>1</sup><sup>8</sup> entries, and then its space is reused for the stack we want to record.
A background goroutine, not running as a signal handler,
copies entries out of the log and into the saved profile data.
If the goroutine cannot keep up with the rate at which the log is filling,
the counts for the entries that are lost are assigned to a special
“lost profile’’ function. In practice, most programs spend their time
doing the same thing over and over again, so the active work of the
program fits in the hash table, the log grows slowly, and the log
draining goroutine has no problem keeping up.
In C++ pprof, there is no log-draining goroutine. Instead, the signal
handler writes the log to an already open file when it fills.
</p>
<h3>Interpreting the data</h3>
<p class="pp">
A pprof profile, then, is a set of stack traces with each mapped
to the count of the number of times that trace was seen.
The usual way this profile is presented is to create a graph
in which each function is a node and an edge between nodes denotes a call.
Each function node has two counts: first the sum of the counts of all the profiles
in which it was the final entry and second the sum of the counts of all the profiles
in which it appeared.
These correspond to time executing that function and cumulative time
executing that function and the things it called.
The edges are given counts corresponding to the number of samples
in which that call was observed somewhere on the stack.
Sizing the nodes and edges based on their counts makes the expensive parts
of the program stand out.
<a href="http://benchgraffiti.googlecode.com/hg/havlak/havlak1.svg">This example</a> should view nicely in most web browsers;
use the scroll wheel to zoom and click and drag to pan.
In that profile, it is apparent that <code>hash_lookup</code> called from <code>mapaccess1</code>
is taking the most time, and we can use the call context to see that
about 40% of the calls are from code in <code>main.FindLoops</code> while 60% of
the calls are from code in <code>main.DFS</code>.
</p>
<center>
<a href="http://benchgraffiti.googlecode.com/hg/havlak/havlak1.svg"><img src="pprof.png" style="border: 1px solid black;"></a>
</center>
<p class="lp">
Of course, there is also a command-line interface, tabular results, and annotated source code.
See the <a href="http://blog.golang.org/profiling-go-programs">Profiling Go Programs</a> post.
<h3>Further Reading</h3>
<p class="pp">
Timer-based profiling is very old. On Unix, the heritage dates back at least
to the Seventh Edition.
The <a href="http://plan9.bell-labs.com/7thEdMan/v7vol1.pdf">Seventh Edition Unix manual</a> contains documentation
for <i>prof</i>(1), <i>profil</i>(2), and <i>monitor</i>(3), and you can even read the source for
<a href="http://www.tuhs.org/Archive/PDP-11/Trees/V7/usr/src/libc/gen/mon.c">monitor</a>.
However, pprof is the first profiler I’ve seen that records and presents stack traces well.
If you’d like to read more about pprof,
it is part of the C++ <a href="https://code.google.com/p/gperftools/">gperftools</a> open source project and has
good documentation.
The Go implementation of the CPU profile collection
is in <a href="http://golang.org/src/pkg/runtime/cpuprof.c">runtime/cpuprof.c</a>.
</p>
<p class="pp">
It is of course also possible to collect profiles without timers, such as by rewriting the program code.
In general the overhead of these tends to be larger than timer-based sampling,
and it can skew the results so that what looks expensive with profiling enabled
is not expensive normally.
</p>
<p class="pp">
Modern CPUs have introduced all kinds of other profiling timers, based on instructions executed,
cache misses, and so on. These are very powerful, but so far the interfaces to them are
operating system-specific.
One nice thing about pprof is that, because it’s using an old, widely supported Unix feature,
it’s fairly portable. I can use a single tool on FreeBSD, Linux, and OS X.
</p>
<p class="pp">
<i>Setitimer</i>(2) was introduced by 4.2BSD; that indirection makes excellent tools like pprof possible.
Of course, it has to work correctly.
In my next post I’ll look at one system where it doesn’t.
</p>
+
+
+ A Tour of Acme
+ tag:research.swtch.com,2012:research.swtch.com/acme
+
+ 2012-09-17T11:00:00-04:00
+ 2012-09-17T11:00:00-04:00
+ A video introduction to Acme, the Plan 9 text editor
+
<p class="lp">
People I work with recognize my computer easily:
it's the one with nothing but yellow windows and blue bars on the screen.
That's the text editor acme, written by Rob Pike for Plan 9 in the early 1990s.
Acme focuses entirely on the idea of text as user interface.
It's difficult to explain acme without seeing it, though, so I've put together
a screencast explaining the basics of acme and showing a brief programming session.
Remember as you watch the video that the 854x480 screen is quite cramped.
Usually you'd run acme on a larger screen: even my MacBook Air has almost four times
as much screen real estate.
</p>
<center>
<div style="border: 1px solid black; width: 853px; height: 480px;"><iframe width="853" height="480" src="https://www.youtube.com/embed/dP1xVpMPn8M?rel=0" frameborder="0" allowfullscreen></iframe></div>
</center>
<p class=pp>
The video doesn't show everything acme can do, nor does it show all the ways you can use it.
Even small idioms like where you type text to be loaded or executed vary from user to user.
To learn more about acme, read Rob Pike's paper “<a href="/acme.pdf">Acme: A User Interface for Programmers</a>” and then try it.
</p>
<p class=pp>
Acme runs on most operating systems.
If you use <a href="http://plan9.bell-labs.com/plan9/">Plan 9 from Bell Labs</a>, you already have it.
If you use FreeBSD, Linux, OS X, or most other Unix clones, you can get it as part of <a href="http://swtch.com/plan9port/">Plan 9 from User Space</a>.
If you use Windows, I suggest trying acme as packaged in <a href="http://code.google.com/p/acme-sac/">acme stand alone complex</a>, which is based on the Inferno programming environment.
</p>
<p class=lp><b>Mini-FAQ</b>:
<ul>
<li><i>Q. Can I use scalable fonts?</i> A. On the Mac, yes. If you run <code>acme -f /mnt/font/Monaco/16a/font</code> you get 16-point anti-aliased Monaco as your font, served via <a href="http://swtch.com/plan9port/man/man4/fontsrv.html">fontsrv</a>. If you'd like to add X11 support to fontsrv, I'd be happy to apply the patch.
<li><i>Q. Do I need X11 to build on the Mac?</i> A. No. The build will complain that it cannot build ‘snarfer’ but it should complete otherwise. You probably don't need snarfer.
</ul>
<p class=pp>
If you're interested in history, the predecessor to acme was called help. Rob Pike's paper “<a href="/help.pdf">A Minimalist Global User Interface</a>” describes it. See also “<a href="/sam.pdf">The Text Editor sam</a>”
</p>
<p class=pp>
<i>Correction</i>: the smiley program in the video was written by Ken Thompson.
I got it from Dennis Ritchie, the more meticulous archivist of the pair.
</p>
+
+
+ A Tour of Go
+ tag:research.swtch.com,2012:research.swtch.com/gotour
+
+ 2012-06-21T00:00:00-04:00
+ 2012-06-21T00:00:00-04:00
+ A video introduction to Go: interfaces, reflection, concurrency
+
<p class="lp">
Last week, I gave a talk about Go at the Boston Google Developers
Group meeting. There were some problems with the recording, so I
have rerecorded the talk as a screencast and posted it on YouTube.
</p>
<center>
<iframe width="640" height="360" src="https://www.youtube.com/embed/ytEkHepK08c?rel=0" frameborder="0" allowfullscreen></iframe>
</center>
<p class="lp">
Here are the answers to questions asked at the end of the talk.
</p>
<p class="lp">
<b>Q. How does Go work with debuggers?</b>
</p>
<p class="lp">
To start, both Go toolchains include debugging information that gdb
can read in the final binaries, so basic gdb functionality works on Go
programs just as it does on C programs.
</p>
<p class="lp">
We’ve talked for a while about a custom Go debugger, but there isn’t
one yet.
</p>
<p class="lp">
Many of the programs we want to debug are live, running programs. The
<a href="http://golang.org/pkg/net/http/pprof/">net/http/pprof</a> package provides debugging information like goroutine
stacks, memory profiling, and cpu profiling in response to special
HTTP requests.
</p>
<p class="lp">
<b>Q. If a goroutine is stuck reading from a channel with no other references, does the goroutine get garbage collected?</b>
</p>
<p class="lp">
No. From the garbage collection point of view, both sides of the
channel are represented by the same pointer, so it can’t distinguish
the receive and send sides. Even if we could detect this situation,
we’ve found that it’s very useful to keep these goroutines around,
because the program is probably heading for a deadlock. When a Go
program deadlocks, it prints all its goroutine stacks and then exits.
If we garbage collected the goroutines as they got stuck, the deadlock
handler wouldn’t have anything useful to print except "your entire
program has been garbage collected".
</p>
<p class="lp">
<b>Q. Can a C++ program call into Go?</b>
</p>
<p class="lp">
We wrote a tool called <a href="http://golang.org/cmd/cgo/">cgo</a> so that Go programs can call into C, and
we’ve implemented support for Go in SWIG, so that Go programs can call
into C++. In those programs, the C or C++ can in turn call back into
Go. But we don’t have support for a C or C++ program—one that starts
execution in the C or C++ world instead of the Go world—to call into
Go.
</p>
<p class="lp">
The hardest part of the cross-language calls is converting between the
C calling convention and the Go calling convention, specifically with
the regard to the implementation of segmented stacks. But that’s been
done and works.
</p>
<p class="lp">
Making the assumption that these mixed-language binaries start in Go
has simplified a number of parts of the implementation. I don’t
anticipate any technical surprises involved in removing these
assumptions. It’s just work.
</p>
<p class="lp">
<b>Q. What are the areas that you specifically are trying to improve the language?</b>
</p>
<p class="lp">
For the most part, I’m not trying to improve the language itself. Part
of the effort in preparing Go 1 was to identify what we wanted to
improve and do it. Many of the big changes were based on two or three
years of experience writing Go programs, and they were changes we’d
been putting off because we knew that they’d be disruptive. But now
that Go 1 is out, we want to stop changing things and spend another
few years using the language as it exists today. At this point we
don’t have enough experience with Go 1 to know what really needs
improvement.
</p>
<p class="lp">
My Go work is a small amount of fixing bugs in the libraries or in the
compiler and a little bit more work trying to improve the performance
of what’s already there.
</p>
<p class="lp">
<b>Q. What about talking to databases and web services?</b>
</p>
<p class="lp">
For databases, one of the packages we added in Go 1 is a standard
<a href="http://golang.org/pkg/database/sql/">database/sql</a> package. That package defines a standard API for
interacting with SQL databases, and then people can implement drivers
that connect the API to specific database implementations like SQLite
or MySQL or Postgres.
</p>
<p class="lp">
For web services, you’ve seen the support for JSON and XML encodings.
Those are typically good enough for ad hoc REST services. I recently
wrote a <a href="http://go.pkgdoc.org/code.google.com/p/rsc/smugmug">package for connecting to the SmugMug photo hosting API</a>, and there’s one
generic call that unmarshals the response into a struct of the
appropriate type, using <a href="http://golang.org/pkg/encoding/json/#Unmarshal">json.Unmarshal</a>. I expect that XML-based web
services like SOAP could be framed this way too, but I’m not aware of
anyone who’s done that.
</p>
<p class="lp">
Inside Google, of course, we have plenty of services, but they’re
based on protocol buffers, so of course there’s a good
<a href="http://code.google.com/p/goprotobuf/">protocol buffer library for Go</a>.
</p>
<p class="lp">
<b>Q. What about generics? How far off are they?</b>
</p>
<p class="lp">
People have asked us about generics from day 1. The answer has always
been, and still is, that it’s something we’ve put a lot of thought
into, but we haven’t yet found an approach that we think is a good fit
for Go. We’ve talked to people who have been involved in the design of
generics in other languages, and they’ve almost universally cautioned
us not to rush into something unless we understand it very well and
are comfortable with the implications. We don’t want to do something
that we’ll be stuck with forever and regret.
</p>
<p class="lp">
Also, speaking for myself, I don’t miss generics when I write Go
programs. What’s there, having built-in support for arrays, slices,
and maps, seems to work very well.
</p>
<p class="lp">
Finally, we just made this promise about backwards compatibility with
the release of Go 1. If we did add some form of generics, my guess is
that some of the existing APIs would need to change, which can’t
happen until Go 2, which I think is probably years away.
</p>
<p class="lp">
<b>Q. What types of projects does Google use Go for?</b>
</p>
<p class="lp">
Most of the things we use Go for I can’t talk about. One notable
exception is that Go is an App Engine language, which we announced at
I/O last year. Another is <a href="http://code.google.com/p/vitess/">vtocc</a>,
a MySQL load balancer used to manage database lookups in YouTube’s core infrastructure.
</p>
<p class="lp">
<b>Q. How does the Plan 9 toolchain differ from other compilers?</b>
</p>
<p class="lp">
It’s a completely incompatible toolchain in every way. The main
difference is that object files don’t contain machine code in the
sense of having the actual instruction bytes that will be used in the
final binary. Instead they contain a custom encoding of the assembly
listings, and the linker is in charge of turning those into actual
machine instructions. This means that the assembler, C compiler, and
Go compiler don’t all duplicate this logic. The main change for Go is
the support for segmented stacks.
</p>
<p class="lp">
I should add that we love the fact that we have two completely
different compilers, because it keeps us honest about really
implementing the spec.
</p>
<p class="lp">
<b>Q. What are segmented stacks?</b>
</p>
<p class="lp">
One of the problems in threaded C programs is deciding how big a stack
each thread should have. If the stack is too small, then the thread
might run out of stack and cause a crash or silent memory corruption,
and if the stack is too big, then you’re wasting memory. In Go, each
goroutine starts with a small stack, typically 4 kB, and then each
function checks if it is about to run out of stack and if so allocates
a new stack segment that gets recycled once it’s not needed anymore.
</p>
<p class="lp">
Gccgo supports segmented stacks, but it requires support added
recently to the new GNU linker, gold, and that support is only
implemented for x86-32 and x86-64.
</p>
<p class="lp">
Segmented stacks are something that lots of people have done before in
experimental or research systems, but they have never made it into the
C toolchains.
</p>
<p class="lp">
<b>Q. What is the overhead of segmented stacks?</b>
</p>
<p class="lp">
It’s a few instructions per function call. It’s been a long time since
I tried to measure the precise overhead, but in most programs I expect
it to be not more than 1-2%. There are definitely things we could do
to try to reduce that, but it hasn’t been a concern.
</p>
<p class="lp">
<b>Q. Do goroutine stacks adapt in size?</b>
</p>
<p class="lp">
The initial stack allocated for a goroutine does not adapt. It’s
always 4k right now. It has been other values in the past but always a
constant. One of the things I’d like to do is to look at what the
goroutine will be running and adjust the stack accordingly, but I
haven’t.
</p>
<p class="lp">
<b>Q. Are there any short-term plans for dynamic loading of modules?</b>
</p>
<p class="lp">
No. I don’t think there are any technical surprises, but assuming that
everything is statically linked simplified some of the implementation.
Like with calling Go from C++ programs, I believe it’s just work.
</p>
<p class="lp">
Gccgo might be closer to support for this, but I don’t believe that it
supports dynamic loading right now either.
</p>
<p class="lp">
<b>Q. How much does the language spec say about reflection?</b>
</p>
<p class="lp">
The spec is intentionally vague about reflection, but <a href="http://golang.org/pkg/reflect/">package
reflect’s API</a> is definitely part of the Go 1 definition. Any
conforming implementation would need to implement that API. In fact,
gc and gccgo do have different implementations of that package reflect
API, but then the packages that use reflect like <a href="http://golang.org/pkg/fmt/">fmt</a> and <a href="http://golang.org/pkg/encoding/json/">json</a> can be
shared.
</p>
<p class="lp">
<b>Q. Do you have a release schedule?</b>
</p>
<p class="lp">
We don’t have any fixed release schedule. We’re not keeping things
secret, but we’re also not making commitments to specific timelines.
</p>
<p class="lp">
Go 1 was in progress publicly for months, and if you watched you could
see the bug count go down and the release candidates announced, and so
on.
</p>
<p class="lp">
Right now we’re trying to slow down. We want people to write things
using Go, which means we need to make it a stable foundation to build
on. Go 1.0.1, the first bug release, was released four weeks after Go
1, and Go 1.0.2 was seven weeks after Go 1.0.1.
</p>
<p class="lp">
<b>Q. Where do you see Go in five years? What languages will it replace?</b>
</p>
<p class="lp">
I hope that it will still be at golang.org, that the Go project will
still be thriving and relevant. We built it to write the kinds of
programs we’ve been writing in C++, Java, and Python, but we’re not
trying to go head-to-head with those languages. Each of those has
definite strengths that make them the right choice for certain
situations. We think that there are plenty of situations, though,
where Go is a better choice.
</p>
<p class="lp">
If Go doesn’t work out, and for some reason in five years we’re
programming in something else, I hope the something else would have
the features I talked about, specifically the Go way of doing
interfaces and the Go way of handling concurrency.
</p>
<p class="lp">
If Go fails but some other language with those two features has taken
over the programming landscape, if we can move the computing world to
a language with those two features, then I’d be sad about Go but happy
to have gotten to that situation.
</p>
<p class="lp">
<b>Q. What are the limits to scalability with building a system with many goroutines?</b>
</p>
<p class="lp">
The primary limit is the memory for the goroutines. Each goroutine
starts with a 4kB stack and a little more per-goroutine data, so the
overhead is between 4kB and 5kB. That means on this laptop I can
easily run 100,000 goroutines, in 500 MB of memory, but a million
goroutines is probably too much.
</p>
<p class="lp">
For a lot of simple goroutines, the 4 kB stack is probably more than
necessary. If we worked on getting that down we might be able to
handle even more goroutines. But remember that this is in contrast to
C threads, where 64 kB is a tiny stack and 1-4MB is more common.
</p>
<p class="lp">
<b>Q. How would you build a traditional barrier using channels?</b>
</p>
<p class="lp">
It’s important to note that channels don’t attempt to be a concurrency
Swiss army knife. Sometimes you do need other concepts, and the
standard <a href="http://golang.org/pkg/sync/">sync</a> package has some helpers. I’d probably use a
<a href="http://golang.org/pkg/sync/#WaitGroup">sync.WaitGroup</a>.
</p>
<p class="lp">
If I had to use channels, I would do it like in the web crawler
example, with a channel that all the goroutines write to, and a
coordinator that knows how many responses it expects.
</p>
<p class="lp">
<b>Q. What is an example of the kind of application you’re working on performance for? How will you beat C++?</b>
</p>
<p class="lp">
I haven’t been focusing on specific applications. Go is still young
enough that if you run some microbenchmarks you can usually find
something to optimize. For example, I just sped up floating point
computation by about 25% a few weeks ago. I’m also working on more
sophisticated analyses for things like escape analysis and bounds
check elimination, which address problems that are unique to Go, or at
least not problems that C++ faces.
</p>
<p class="lp">
Our goal is definitely not to beat C++ on performance. The goal for Go
is to be near C++ in terms of performance but at the same time be a
much more productive environment and language, so that you’d rather
program in Go.
</p>
<p class="lp">
<b>Q. What are the security features of Go?</b>
</p>
<p class="lp">
Go is a type-safe and memory-safe language. There are no dangling
pointers, no pointer arithmetic, no use-after-free errors, and so on.
</p>
<p class="lp">
You can break the rules by importing package <a href="http://golang.org/pkg/unsafe/">unsafe</a>, which gives
you a special type unsafe.Pointer. You can convert any pointer or
integer to an unsafe.Pointer and back. That’s the escape hatch, which
you need sometimes, like for extracting the bits of a float64 as a
uint64. But putting it in its own package means that unsafe code is
explicitly marked as unsafe. If your program breaks in a strange way,
you know where to look.
</p>
<p class="lp">
Isolating this power also means that you can restrict it. On App
Engine you can’t import package unsafe in the code you upload for your
app.
</p>
<p class="lp">
I should point out that the current Go implementation does have
<a href="http://research.swtch.com/gorace">data races</a>, but they are not
fundamental to the language. It would be possible to eliminate the
races at some cost in efficiency, and for now we’ve decided not to do
that. There are also tools such as <a href="http://code.google.com/p/data-race-test/wiki/ThreadSanitizerGo">Thread Sanitizer</a> that help find these kinds of data races in Go
programs.
</p>
<p class="lp">
<b>Q. What language do you think Go is trying to displace?</b>
</p>
<p class="lp">
I don’t think of Go that way. We were writing C++ code before we did
Go, so we definitely wanted not to write C++ code anymore. But we’re
not trying to displace all C++ code, or all Python code, or all Java
code, except maybe in our own day-to-day work.
</p>
<p class="lp">
One of the surprises for me has been the variety of languages that new
Go programmers used to use. When we launched, we were trying to
explain Go to C++ programmers, but many of the programmers Go has
attracted have come from more dynamic languages like Python or Ruby.
</p>
<p class="lp">
<b>Q. How does Go make it possible to use multiple cores?</b>
</p>
<p class="lp">
Go lets you tell the runtime how many operating system threads to use
for executing goroutines, and then it muxes the goroutines onto those
threads. So if you’ve written a program that has four or more
goroutines executing simultaneously, you can tell the runtime to use
four OS threads and then you’re running on four cores.
</p>
<p class="lp">
We’ve been pleasantly surprised by how easy people find it to write
these kinds of programs. People who have not written parallel or
concurrent programs before write concurrent Go programs using channels
that can take advantage of multiple cores, and they enjoy the
experience. That’s more than you can usually say for C threads. Joe
Armstrong, one of the creators of Erlang, makes the point that
thinking about concurrency in terms of communication might be more
natural for people, since communication is something we’ve done for a
long time. I agree.
</p>
<p class="lp">
<b>Q. How does the muxing of goroutines work?</b>
</p>
<p class="lp">
It’s not very smart. It’s the simplest thing that isn’t completely
stupid: all the scheduling operations are O(1), and so on, but there’s
a shared run queue that the various threads pull from. There’s no
affinity between goroutines and threads, there’s no attempt to make
sophisticated scheduling decisions, and there’s not even preemption.
</p>
<p class="lp">
The goroutine scheduler was the first thing I wrote when I started
working on Go, even before I was working full time on it, so it’s just
about four years old. It has served us surprisingly well, but we’ll
probably want to replace it in the next year or so. We’ve been having
some discussions recently about what we’d want to try in a new
scheduler.
</p>
<p class="lp">
<b>Q. Is there any plan to bootstrap Go in Go, to write the Go compiler in Go?</b>
</p>
<p class="lp">
There’s no immediate plan. Go does ship with a Go program parser
written in Go, so the first piece is already done, and there’s an
experimental type checker in the works, but those are mainly for
writing program analysis tools. I think that Go would be a great
language to write a compiler in, but there’s no immediate plan. The
current compiler, written in C, works well.
</p>
<p class="lp">
I’ve worked on bootstrapped languages in the past, and I found that
bootstrapping is not necessarily a good fit for languages that are
changing frequently. It reminded me of climbing a cliff and screwing
hooks into the cliff once in a while to catch you if you fall. Once or
twice I got into situations where I had identified a bug in the
compiler, but then trying to write the code to fix the bug tickled the
bug, so it couldn’t be compiled. And then you have to think hard about
how to write the fix in a way that avoids the bug, or else go back
through your version control history to find a way to replay history
without introducing the bug. It’s not fun.
</p>
<p class="lp">
The fact that Go wasn’t written in itself also made it much easier to
make significant language changes. Before the initial release we went
through a handful of wholesale syntax upheavals, and I’m glad we
didn’t have to worry about how we were going to rebootstrap the
compiler or ensure some kind of backwards compatibility during those
changes.
</p>
<p class="lp">
Finally, I hope you’ve read Ken Thompson’s Turing Award lecture, <a href="http://cm.bell-labs.com/who/ken/trust.html">Reflections on Trusting Trust</a>. When we were planning the initial open
source release, we liked to joke that no one in their right mind would
accept a bootstrapped compiler binary written by Ken.
</p>
<p class="lp">
<b>Q. What does Go do to compile efficiently at scale?</b>
</p>
<p class="lp">
This is something that we talked about a lot in early talks about Go.
The main thing is that it cuts off transitive dependencies when
compiling a single module. In most languages, if package A imports B,
and package B imports C, then the compilation of A reads not just the
compiled form of B but also the compiled form of C. In large systems,
this gets out of hand quickly. For example, in C++ on my Mac,
including <iostream> reads 25,326 lines from 131 files.
(C and C++ headers aren't “compiled form,” but the problem is the same.)
Go promises that each import reads a single compiled package file. If you
need to know something about other packages to understand that
package’s API, then the compiled file includes the extra information
you need, but only that.
</p>
<p class="lp">
Of course, if you are building from scratch and package A imports B
which imports C, then of course C has to be compiled first, and then
B, and then A. The import point is that when you go to compile A, you
don’t reload C’s object file. In a real program, the dependencies are
usually not a chain like this. We might have A1, A2, A3, and so on all
importing B. It’s a significant win if none of them need to reread C.
</p>
<p class="lp">
<b>Q. How do you identify a good project for Go?</b>
</p>
<p class="lp">
I think a good project for Go is one that you’re excited about writing
in Go. Go really is a general purpose programming language, and except
for the compiler work, it’s the only language I’ve written significant
programs in for the past four years.
</p>
<p class="lp">
Most of the people I know who are using Go are using it for networked
servers, where the concurrency features have something contribute, but
it’s great for other contexts too. I’ve used it to write a simple mail
reader, file system implementations to read old disks, and a variety
of other unnetworked programs.
</p>
<p class="lp">
<b>Q. What is the current and future IDE support for Go?</b>
</p>
<p class="lp">
I’m not an IDE user in the modern sense, so really I don’t know. We
think that it would be possible to write a really nice IDE
specifically for Go, but it’s not something we’ve had time to explore.
The Go distribution has a <a href="http://golang.org/misc">misc</a> directory that
contains basic Go support for common editors, and there is a
<a href="http://code.google.com/p/goclipse">Goclipse project</a> to write an
Eclipse-based IDE, but I don’t know much about those.
</p>
<p class="lp">
The development environment I use,
<a href="http://plan9.bell-labs.com/sys/doc/acme/acme.pdf">acme</a>, is great for
writing Go code, but not because of any custom Go support.
</p>
<p>
</p>
<p>
If you have more questions, please consult <a href="http://golang.org/help/">these resources</a>.
</p>
+
+
+ QArt Codes
+ tag:research.swtch.com,2012:research.swtch.com/qart
+
+ 2012-04-12T15:00:00-04:00
+ 2012-04-12T15:00:00-04:00
+ How to make pictures with QR codes, part II
+
<style type='text/css'>
.matrix {
font-family: sans-serif;
font-size: 0.8em;
}
table.matrix {
padding-left: 1em;
padding-right: 1em;
padding-top: 1em;
padding-bottom: 1em;
}
.matrix td {
padding-left: 0.3em;
padding-right: 0.3em;
border-left: 2px solid white;
border-right: 2px solid white;
text-align: center;
color: #aaa;
}
.matrix td.gray {
color: black;
background-color: #ddd;
}
</style>
<p class=pp>
QR codes are 2-dimensional bar codes that encode arbitrary
text strings. A common use of QR codes is to encode URLs so
that people can scan a QR code (for example, on an advertising poster,
<a href="http://www.brandchannel.com/home/post/QR-Marketing-Google-Maps.aspx">building roof</a>, <a href="http://www.dailymail.co.uk/femail/article-2023726/Beach-volleyball-stars-sign-deal-advertising-bikini-clad-behinds.html">volleyball bikini</a>, <a href="http://www.flickr.com/photos/fluidforms/3524861901/">belt buckle</a>, or <a href="http://wtfqrcodes.com/post/18551054478/look-in-the-sky-its-a-bird-its-a-plane-its-the">airplane banner</a>)
to load a web site on a cell phone
instead of having to “type” in a URL.
</p>
<p class=pp>
QR codes are encoded using <a href="/field">Reed-Solomon error-correcting codes</a>, so that
a QR scanner does not have to see every pixel correctly in order
to decode the content. The error correction makes it possible
to introduce a few errors (fewer than the maximum that the algorithm
can fix) in order to make an image.
For example, in 2008, <a href="http://whomwah.com/2008/03/12/more-fun-with-qr-codes-and-the-bbc-logo/">Duncan Robertson</a> took a QR code for “http://bbc.co.uk/programmes” (left) and introduced errors in the form of a BBC logo (right):
</p>
<center>
<img src="qr-bbc.png" />
</center>
<p class=lp>
That's a neat trick and a pretty logo, but it's uninteresting from
a technical standpoint. Although the BBC logo pixels look like QR code
pixels, they are not contribuing to the QR code.
The QR reader can't tell much difference between the
BBC logo and the Union Jack.
There's just a bunch of noise in the middle either way.
</p>
<center>
<img src="qr-bbc1.png" />
</center>
<p class=lp>
Since the BBC QR logo appeared, there have been many imitators.
Most just slap an obviously out-of-place logo in the middle of the
code. This <a href="http://blog.cliffano.com/2009/05/18/qr-code-usage-in-japan/">Disney poster</a>
is notable for being more in the spirit of the BBC code.
</p>
<p class=pp>
There's a different way to put pictures in QR codes.
Instead of scribbling on redundant pieces and relying on error
correction to preserve the meaning, we can engineer the
encoded values to create the picture in a code with no inherent errors,
like these:
</p>
<center>
<img src="qart1.png" />
<img src="qart2.png" />
<img src="qart3.png" />
<img src="qart4.png" />
</center>
<p class=lp>
This post explains the math behind making codes like these, which I call QArt codes.
I have published the Go programs that generated these codes at
<a href="http://code.google.com/p/rsc/source/browse/qr">code.google.com/p/rsc</a>
and created a <a href="/qr/draw">web site for creating these codes</a>.
</p>
<h3>
Background
</h3>
<p class=lp>For error correction, QR uses Reed-Solomon coding
(like nearly everything else).
For our purposes, Reed-Solomon coding has two important properties.
First, it is what coding theorists call a <i>systematic code</i>: you can
see the original message in the encoding.
That is, the Reed-Solomon encoding of “hello” is “hello” followed by some error-correction bytes.
Second, Reed-Solomon encoded messages can be XOR'ed:
if we have two different Reed-Solomon encoded blocks
b<sub>1</sub> and b<sub>2</sub> corresponding to messages m<sub>1</sub> and m<sub>2</sub>,
b<sub>1</sub> ⊕ b<sub>2</sub> is also a Reed-Solomon encoded block; it corresponds
to the message m<sub>1</sub> ⊕ m<sub>2</sub>. (Here, ⊕ means XOR.)
If you are curious about why these two properties are true,
see my earlier post, <a href="field">Finite Field Arithmetic and Reed-Solomon Coding</a>.
</p>
<h3>QR Codes</h3>
<p class=lp>
A QR code has a distinctive frame that help both people and computers
recognize them as QR codes. The details of the frame depend on the
exact size of the code—bigger codes have room for more bits—but you
know one when you see it: the outlined squares are the giveaway.
Here are QR frames for a sampling of sizes:
</p>
<center>
<img src="qart16.png" />
</center>
<p class=lp>
The colored pixels are where the Reed-Solomon-encoded data bits go.
Each code may have one or more Reed-Solomon blocks, depending on
its size and the error correction level. The pictures show the bits from
each block in a different color.
The L encoding is the lowest amount of redundancy, about 20%.
The other three encodings increase the redundancy, using 38%, 55%, and 65%.
</p>
<center>
<img src="qart17.png">
</center>
<p class=lp>(By the way, you can read the redundancy level from
the top pixels in the two leftmost columns. If black=0 and white=1, then
you can see that 00 is L, 01 is M, 10 is Q, and 11 is H.
Thus, you can tell that the QR code <a href="http://www.flickr.com/photos/johncarney/3515851216/">on the T-shirt in this picture</a>
is encoded at the highest redundancy level,
while <a href="http://store.xkcd.com/xkcd/#QRCodeShirt">this shirt</a> uses the lowest level and therefore might take longer or be harder to scan.
</p>
<p class=pp>
As I mentioned above, the original message bits are included directly
in the message's Reed-Solomon encoding.
Thus, each bit in the original message corresponds to a pixel in the QR code.
Those are the lighter pixels in the pictures above.
The darker pixels are the error correction bits.
The encoded bits are laid down in a vertical boustrophedon pattern in
which each line is two columns wide, starting at the bottom right corner
and ending on the left side:
</p>
<center>
<img src="qart18.png" />
</center>
<p class=lp>
We can easily work out where each message bit ends up in the QR code.
By changing those bits of the message, we can change those pixels and draw a picture.
There are, however, a few complications that make things interesting.
</p>
<h3>QR Masks</h3>
<p class=lp>
The first complication is that the encoded data is XOR'ed with an obfuscating
mask to create the final code. There are eight masks:
</p>
<center>
<img src="qart19.png" />
</center>
<p class=lp>An encoder is supposed to choose the mask that best hides
any patterns in the data, to keep those patterns from being mistaken
for framing boxes. In our encoder, however, we can choose
a mask before choosing the data. This violates the spirit of the spec
but still produces legitimate codes.
</p>
<h3>QR Data Encoding</h3>
<p class=lp>The second complication is that we want the QR code's message
to be intelligible.
We could draw arbitrary pictures using arbitrary 8-bit data, but when
scanned the codes would produce binary garbage.
We need to limit ourselves to data that produces sensible messages.
Luckily for us, QR codes allow messages to be written using a few
different alphabets. One alphabet is 8-bit data, which would require binary
garbage to draw a picture. Another is numeric data, in which every
run of 10 bits defines 3 decimal digits. That limits our choice of
pixels slightly: we must not generate a 10-bit run with a value above 999.
That's not complete flexibility, but it's close: 9.96 bits of freedom out of 10.
If, after encoding an image, we find that we've generated an invalid number,
we pick one of the 5 most significant bits at random—all of them must be 1s
to make an invalid number—hard wire that bit to zero, and start over.
</p>
<p class=pp>Having only decimal messages would still not be very interesting:
the message would be a very large number.
Luckily for us (again), QR codes allow a single message to be
composed from pieces using different encodings. The codes I have
generated consist of an 8-bit-encoded URL ending in a #
followed by a numeric-encoded number that draws the actual picture:
</p>
<center>
http://swtch.com/pjw/#123456789...
</center>
<p class=lp>
The leading URL is the first data encoded; it takes up the right
side of the QR code. The error correction bits take up the left side.
</p>
<p class=pp>When the phone scans the QR code, it sees a URL; loading it in a
browser visits the base page and then looks for an internal anchor on
the page with the given number. The browser won't find such an anchor,
but it also won't complain.</p>
<p class=pp>The techniques so far let us draw codes like this one:</p>
<center>
<img src="qart5.png" />
<img src="qart6.png" />
</center>
<p class=lp>The second copy darkens the pixels that we have no
control over: the error correction bits on the left and the URL prefix on the right.
I appreciate the cyborg effect of Peter melting into the binary noise,
but it would be nice to widen our canvas.
</p>
<h3>Gauss-Jordan Elimination</h3>
<p class=lp>
The third complication, then, is that we want to draw using
more than just the slice of data pixels in the middle of the image.
Luckily, we can.
</p>
<p class=pp>
I mentioned above that Reed-Solomon
messages can be XOR'ed:
if we have two different Reed-Solomon encoded blocks
b<sub>1</sub> and b<sub>2</sub> corresponding to messages m<sub>1</sub> and m<sub>2</sub>,
b<sub>1</sub> ⊕ b<sub>2</sub> is also a Reed-Solomon encoded block; it corresponds
to the message m<sub>1</sub> ⊕ m<sub>2</sub>.
(In the notation of the <a href="/field">previous post</a>, this happens because
Reed-Solomon blocks correspond 1:1 with multiples of g(x).
Since b<sub>1</sub> and b<sub>2</sub> are multiples of g(x), their sum is
a multiple of g(x) too.)
This property means that we can build up a valid Reed-Solomon block
from other Reed-Solomon blocks.
In particular, we can construct the sequence of blocks
b<sub>0</sub>, b<sub>1</sub>, b<sub>2</sub>, ..., where b<sub>i</sub> is the block whose data bits are
all zeros except for bit i and whose error correction bits
are then set to correspond to a valid Reed-Solomon block.
That set is a <a href="http://en.wikipedia.org/wiki/Basis_(linear_algebra)">basis</a> for the entire vector space of valid Reed-Solomon blocks.
Here is the basis matrix for the space of blocks with 2 data bytes and 2 checksum bytes:
</p>
<center>
<table class='matrix' cellspacing=0 cellpadding=0 border=0>
<tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td>1<td><td>1<td><td><td>1<td>1<td>1<td><td><td>1<td><td><td>1<td>1<td>1<tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td>1<td>1<td><td>1<td>1<td>1<td><td>1<td>1<td><td><td>1<td>1<td>1<td><td>1<tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td>1<td>1<td>1<td><td><td><td><td><td>1<td>1<td><td><td><td><td><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td><td>1<td>1<td>1<td><td><td><td><td><td>1<td>1<td><td><td><td><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td><td><td>1<td>1<td>1<td><td><td><td><td><td>1<td>1<td><td><td><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td><td><td><td>1<td>1<td>1<td><td><td><td><td><td>1<td>1<td><td><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td><td><td><td><td>1<td>1<td>1<td><td><td><td><td><td>1<td>1<td><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td><td><td><td><td><td>1<td>1<td>1<td><td><td><td><td><td>1<td>1<td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td>1<td><td><td>1<td>1<td>1<td><td>1<td><td><td><td>1<td>1<td>1<td><td>1<tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td>1<td>1<td><td><td><td><td><td><td>1<td><td><td><td><td><td><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td><td>1<td>1<td><td><td><td><td><td><td>1<td><td><td><td><td><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td><td><td>1<td>1<td><td><td><td><td><td><td>1<td><td><td><td><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td class='gray'><td><td><td><td>1<td>1<td><td><td><td><td><td><td>1<td><td><td><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td class='gray'><td><td><td><td><td>1<td>1<td><td><td><td><td><td><td>1<td><td><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td class='gray'><td><td><td><td><td><td>1<td>1<td><td><td><td><td><td><td>1<td><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'><td class='gray'>1<td><td><td><td><td><td><td>1<td>1<td><td><td><td><td><td><td>1<td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
</table>
</center>
<p class=lp>
The missing entries are zeros. The gray columns highlight the
pixels we have complete control over: there is only one row
with a 1 for each of those pixels.
Each time we want to change such a pixel,
we can XOR our current data with its row to change that pixel,
not change any of the other controlled pixels, and
keep the error correction bits up to date.
</p>
<p class=pp>
So what, you say. We're still just twiddling data bits.
The canvas is the same.
</p>
<p class=pp>
But wait, there's more!
The basis we had above lets us change individual
data pixels, but we can XOR rows together to create
other basis matrices that trade data bits for error correction bits.
No matter what, we're not going to increase
our flexibility—the number of pixels we have direct control over
cannot increase—but we can redistribute that flexibility throughout
the image, at the same time smearing the uncooperative noise
pixels evenly all over the canvas.
This is the same procedure as Gauss-Jordan elimination,
the way you turn a matrix into row-reduced echelon form.
</p>
<p class=pp>
This matrix shows the result of trying to assert control
over alternating pixels (the gray columns):
</p>
<center>
<table class='matrix' cellspacing=0 cellpadding=0 border=0>
<tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'>1<td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td>1<td class='gray'><td>1<td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'>1<td><td class='gray'><td>1<td class='gray'><td>1<td class='gray'><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td>1<td class='gray'>1<td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td>1<td class='gray'>1<td>1<td class='gray'><td>1<td class='gray'><td>1<tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td><td class='gray'><td><td class='gray'>1<td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'>1<td><td class='gray'><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'>1<td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'>1<td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'>1<td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'>1<td><td class='gray'><td><td class='gray'><td><td class='gray'><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'>1<td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'>1<td><td class='gray'><td><td class='gray'><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'>1<td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'>1<td><td class='gray'><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'>1<td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'>1<td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'>1<td>1<td class='gray'><td>1<td class='gray'><td><td class='gray'><td>1<td class='gray'>1<td><td class='gray'><td>1<td class='gray'><td>1<td class='gray'><td>1<tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'>1<td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'>1<td><td class='gray'><td><td class='gray'><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'>1<td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'>1<td><td class='gray'><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'>1<td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'>1<td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td>1<td class='gray'><td>1<td class='gray'><td>1<tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
<tr>
<td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><td class='gray'><td>1<td class='gray'><td><td class='gray'><td><td class='gray'><td><tr height=1 bgcolor='#bbbbbb'><td colspan=32>
</table>
</center>
<p class=lp>
The matrix illustrates an important point about this trick:
it's not completely general.
The data bits are linearly independent, but there are
dependencies between the error correction bits
that mean we often can't have every pixel we ask for.
In this example, the last four pixels we tried to get
were unavailable: our manipulations of the rows to
isolate the first four error correction bits zeroed out
the last four that we wanted.
</p>
<p class=pp>
In practice, a good approach is to create
a list of all the pixels in the Reed-Solomon block sorted by
how useful it would be to be able to set that pixel.
(Pixels from high-contrast regions of the image are less
important than pixels from low-contrast regions.)
Then, we can consider each pixel in turn, and if the basis matrix
allows it, isolate that pixel.
If not, no big deal, we move on to the next pixel.
</p>
<p class=pp>
Applying this insight, we can build wider but noisier
pictures in our QR codes:
</p>
<center>
<img src="qart7.png">
<img src="qart8.png">
</center>
<p class=lp>
The pixels in Peter's forehead and on his right side have
been sacrificed for the ability to draw the full width of the picture.
</p>
<p class=pp>
We can also choose the pixels we want to control at random,
to make Peter peek out from behind a binary fog:
</p>
<center>
<img src="qart9.png">
<img src="qart10.png">
<img src="qart11.png">
</center>
<h3>Rotations</h3>
<p>
One final trick. QR codes have no required orientation.
The URL base pixels
that we have no control over are on the right side in the
canonical orientation, but we can rotate the QR code to
move them to other edges.
</p>
<center>
<img src="qart12.png">
<img src="qart13.png">
<br>
<img src="qart14.png">
<img src="qart15.png">
</center>
<h3>Further Information</h3>
<p class=lp>
All the source code for this post, including the web server, is at
<a href="http://code.google.com/p/rsc/source/browse/qr">code.google.com/p/rsc/source/browse/qr</a>.
If you liked this, you might also like
<a href="http://research.swtch.com/2010/03/zip-files-all-way-down.html">Zip Files All The Way Down</a>.
<h3>Acknowledgements</h3>
<p class=lp>
Alex Healy pointed out that valid Reed-Solomon encodings are closed under XOR,
which is the key to spreading the picture into the error correction pixels.
Peter Weinberger has been nothing but gracious about the overuse of his binary likeness.
Thanks to both.
</p>
+
+
+ Minimal Boolean Formulas
+ tag:research.swtch.com,2012:research.swtch.com/boolean
+
+ 2011-05-18T00:00:00-04:00
+ 2011-05-18T00:00:00-04:00
+ Simplify equations with God
+
<p><style type="text/css">
p { line-height: 150%; }
blockquote { text-align: left; }
pre.alg { font-family: sans-serif; font-size: 100%; margin-left: 60px; }
td, th { padding-left; 5px; padding-right: 5px; vertical-align: top; }
#times td { text-align: right; }
table { padding-top: 1em; padding-bottom: 1em; }
#find td { text-align: center; }
</style>
<p class=lp>
<a href="http://oeis.org/A056287">28</a>.
That's the minimum number of AND or OR operators
you need in order to write any Boolean function of five variables.
<a href="http://alexhealy.net/">Alex Healy</a> and I computed that in April 2010. Until then,
I believe no one had ever known that little fact.
This post describes how we computed it
and how we almost got scooped by <a href="http://research.swtch.com/2011/01/knuth-volume-4a.html">Knuth's Volume 4A</a>
which considers the problem for AND, OR, and XOR.
</p>
<h3>A Naive Brute Force Approach</h3>
<p class=pp>
Any Boolean function of two variables
can be written with at most 3 AND or OR operators: the parity function
on two variables X XOR Y is (X AND Y') OR (X' AND Y), where X' denotes
“not X.” We can shorten the notation by writing AND and OR
like multiplication and addition: X XOR Y = X*Y' + X'*Y.
</p>
<p class=pp>
For three variables, parity is also a hardest function, requiring 9 operators:
X XOR Y XOR Z = (X*Z'+X'*Z+Y')*(X*Z+X'*Z'+Y).
</p>
<p class=pp>
For four variables, parity is still a hardest function, requiring 15 operators:
W XOR X XOR Y XOR Z = (X*Z'+X'*Z+W'*Y+W*Y')*(X*Z+X'*Z'+W*Y+W'*Y').
</p>
<p class=pp>
The sequence so far prompts a few questions. Is parity always a hardest function?
Does the minimum number of operators alternate between 2<sup>n</sup>−1 and 2<sup>n</sup>+1?
</p>
<p class=pp>
I computed these results in January 2001 after hearing
the problem from Neil Sloane, who suggested it as a variant
of a similar problem first studied by Claude Shannon.
</p>
<p class=pp>
The program I wrote to compute a(4) computes the minimum number of
operators for every Boolean function of n variables
in order to find the largest minimum over all functions.
There are 2<sup>4</sup> = 16 settings of four variables, and each function
can pick its own value for each setting, so there are 2<sup>16</sup> different
functions. To make matters worse, you build new functions
by taking pairs of old functions and joining them with AND or OR.
2<sup>16</sup> different functions means 2<sup>16</sup>·2<sup>16</sup> = 2<sup>32</sup> pairs of functions.
</p>
<p class=pp>
The program I wrote was a mangling of the Floyd-Warshall
all-pairs shortest paths algorithm. That algorithm is:
</p>
<pre class="indent alg">
// Floyd-Warshall all pairs shortest path
func compute():
for each node i
for each node j
dist[i][j] = direct distance, or ∞
for each node k
for each node i
for each node j
d = dist[i][k] + dist[k][j]
if d < dist[i][j]
dist[i][j] = d
return
</pre>
<p class=lp>
The algorithm begins with the distance table dist[i][j] set to
an actual distance if i is connected to j and infinity otherwise.
Then each round updates the table to account for paths
going through the node k: if it's shorter to go from i to k to j,
it saves that shorter distance in the table. The nodes are
numbered from 0 to n, so the variables i, j, k are simply integers.
Because there are only n nodes, we know we'll be done after
the outer loop finishes.
</p>
<p class=pp>
The program I wrote to find minimum Boolean formula sizes is
an adaptation, substituting formula sizes for distance.
</p>
<pre class="indent alg">
// Algorithm 1
func compute()
for each function f
size[f] = ∞
for each single variable function f = v
size[f] = 0
loop
changed = false
for each function f
for each function g
d = size[f] + 1 + size[g]
if d < size[f OR g]
size[f OR g] = d
changed = true
if d < size[f AND g]
size[f AND g] = d
changed = true
if not changed
return
</pre>
<p class=lp>
Algorithm 1 runs the same kind of iterative update loop as the Floyd-Warshall algorithm,
but it isn't as obvious when you can stop, because you don't
know the maximum formula size beforehand.
So it runs until a round doesn't find any new functions to make,
iterating until it finds a fixed point.
</p>
<p class=pp>
The pseudocode above glosses over some details, such as
the fact that the per-function loops can iterate over a
queue of functions known to have finite size, so that each
loop omits the functions that aren't
yet known. That's only a constant factor improvement,
but it's a useful one.
</p>
<p class=pp>
Another important detail missing above
is the representation of functions. The most convenient
representation is a binary truth table.
For example,
if we are computing the complexity of two-variable functions,
there are four possible inputs, which we can number as follows.
</p>
<center>
<table>
<tr><th>X <th>Y <th>Value
<tr><td>false <td>false <td>00<sub>2</sub> = 0
<tr><td>false <td>true <td>01<sub>2</sub> = 1
<tr><td>true <td>false <td>10<sub>2</sub> = 2
<tr><td>true <td>true <td>11<sub>2</sub> = 3
</table>
</center>
<p class=pp>
The functions are then the 4-bit numbers giving the value of the
function for each input. For example, function 13 = 1101<sub>2</sub>
is true for all inputs except X=false Y=true.
Three-variable functions correspond to 3-bit inputs generating 8-bit truth tables,
and so on.
</p>
<p class=pp>
This representation has two key advantages. The first is that
the numbering is dense, so that you can implement a map keyed
by function using a simple array. The second is that the operations
“f AND g” and “f OR g” can be implemented using
bitwise operators: the truth table for “f AND g” is the bitwise
AND of the truth tables for f and g.
</p>
<p class=pp>
That program worked well enough in 2001 to compute the
minimum number of operators necessary to write any
1-, 2-, 3-, and 4-variable Boolean function. Each round
takes asymptotically O(2<sup>2<sup>n</sup></sup>·2<sup>2<sup>n</sup></sup>) = O(2<sup>2<sup>n+1</sup></sup>) time, and the number of
rounds needed is O(the final answer). The answer for n=4
is 15, so the computation required on the order of
15·2<sup>2<sup>5</sup></sup> = 15·2<sup>32</sup> iterations of the innermost loop.
That was plausible on the computer I was using at
the time, but the answer for n=5, likely around 30,
would need 30·2<sup>64</sup> iterations to compute, which
seemed well out of reach.
At the time, it seemed plausible that parity was always
a hardest function and that the minimum size would
continue to alternate between 2<sup>n</sup>−1 and 2<sup>n</sup>+1.
It's a nice pattern.
</p>
<h3>Exploiting Symmetry</h3>
<p class=pp>
Five years later, though, Alex Healy and I got to talking about this sequence,
and Alex shot down both conjectures using results from the theory
of circuit complexity. (Theorists!) Neil Sloane added this note to
the <a href="http://oeis.org/history?seq=A056287">entry for the sequence</a> in his Online Encyclopedia of Integer Sequences:
</p>
<blockquote>
<tt>
%E A056287 Russ Cox conjectures that X<sub>1</sub> XOR ... XOR X<sub>n</sub> is always a worst f and that a(5) = 33 and a(6) = 63. But (Jan 27 2006) Alex Healy points out that this conjecture is definitely false for large n. So what is a(5)?
</tt>
</blockquote>
<p class=lp>
Indeed. What is a(5)? No one knew, and it wasn't obvious how to find out.
</p>
<p class=pp>
In January 2010, Alex and I started looking into ways to
speed up the computation for a(5). 30·2<sup>64</sup> is too many
iterations but maybe we could find ways to cut that number.
</p>
<p class=pp>
In general, if we can identify a class of functions f whose
members are guaranteed to have the same complexity,
then we can save just one representative of the class as
long as we recreate the entire class in the loop body.
What used to be:
</p>
<pre class="indent alg">
for each function f
for each function g
visit f AND g
visit f OR g
</pre>
<p class=lp>
can be rewritten as
</p>
<pre class="indent alg">
for each canonical function f
for each canonical function g
for each ff equivalent to f
for each gg equivalent to g
visit ff AND gg
visit ff OR gg
</pre>
<p class=lp>
That doesn't look like an improvement: it's doing all
the same work. But it can open the door to new optimizations
depending on the equivalences chosen.
For example, the functions “f” and “¬f” are guaranteed
to have the same complexity, by <a href="http://en.wikipedia.org/wiki/De_Morgan's_laws">DeMorgan's laws</a>.
If we keep just one of
those two on the lists that “for each function” iterates over,
we can unroll the inner two loops, producing:
</p>
<pre class="indent alg">
for each canonical function f
for each canonical function g
visit f OR g
visit f AND g
visit ¬f OR g
visit ¬f AND g
visit f OR ¬g
visit f AND ¬g
visit ¬f OR ¬g
visit ¬f AND ¬g
</pre>
<p class=lp>
That's still not an improvement, but it's no worse.
Each of the two loops considers half as many functions
but the inner iteration is four times longer.
Now we can notice that half of tests aren't
worth doing: “f AND g” is the negation of
“¬f OR ¬g,” and so on, so only half
of them are necessary.
</p>
<p class=pp>
Let's suppose that when choosing between “f” and “¬f”
we keep the one that is false when presented with all true inputs.
(This has the nice property that <code>f ^ (int32(f) >> 31)</code>
is the truth table for the canonical form of <code>f</code>.)
Then we can tell which combinations above will produce
canonical functions when f and g are already canonical:
</p>
<pre class="indent alg">
for each canonical function f
for each canonical function g
visit f OR g
visit f AND g
visit ¬f AND g
visit f AND ¬g
</pre>
<p class=lp>
That's a factor of two improvement over the original loop.
</p>
<p class=pp>
Another observation is that permuting
the inputs to a function doesn't change its complexity:
“f(V, W, X, Y, Z)” and “f(Z, Y, X, W, V)” will have the same
minimum size. For complex functions, each of the
5! = 120 permutations will produce a different truth table.
A factor of 120 reduction in storage is good but again
we have the problem of expanding the class in the
iteration. This time, there's a different trick for reducing
the work in the innermost iteration.
Since we only need to produce one member of
the equivalence class, it doesn't make sense to
permute the inputs to both f and g. Instead,
permuting just the inputs to f while fixing g
is guaranteed to hit at least one member
of each class that permuting both f and g would.
So we gain the factor of 120 twice in the loops
and lose it once in the iteration, for a net savings
of 120.
(In some ways, this is the same trick we did with “f” vs “¬f.”)
</p>
<p class=pp>
A final observation is that negating any of the inputs
to the function doesn't change its complexity,
because X and X' have the same complexity.
The same argument we used for permutations applies
here, for another constant factor of 2<sup>5</sup> = 32.
</p>
<p class=pp>
The code stores a single function for each equivalence class
and then recomputes the equivalent functions for f, but not g.
</p>
<pre class="indent alg">
for each canonical function f
for each function ff equivalent to f
for each canonical function g
visit ff OR g
visit ff AND g
visit ¬ff AND g
visit ff AND ¬g
</pre>
<p class=lp>
In all, we just got a savings of 2·120·32 = 7680,
cutting the total number of iterations from 30·2<sup>64</sup> = 5×10<sup>20</sup>
to 7×10<sup>16</sup>. If you figure we can do around
10<sup>9</sup> iterations per second, that's still 800 days of CPU time.
</p>
<p class=pp>
The full algorithm at this point is:
</p>
<pre class="indent alg">
// Algorithm 2
func compute():
for each function f
size[f] = ∞
for each single variable function f = v
size[f] = 0
loop
changed = false
for each canonical function f
for each function ff equivalent to f
for each canonical function g
d = size[ff] + 1 + size[g]
changed |= visit(d, ff OR g)
changed |= visit(d, ff AND g)
changed |= visit(d, ff AND ¬g)
changed |= visit(d, ¬ff AND g)
if not changed
return
func visit(d, fg):
if size[fg] != ∞
return false
record fg as canonical
for each function ffgg equivalent to fg
size[ffgg] = d
return true
</pre>
<p class=lp>
The helper function “visit” must set the size not only of its argument fg
but also all equivalent functions under permutation or inversion of the inputs,
so that future tests will see that they have been computed.
</p>
<h3>Methodical Exploration</h3>
<p class=pp>
There's one final improvement we can make.
The approach of looping until things stop changing
considers each function pair multiple times
as their sizes go down. Instead, we can consider functions
in order of complexity, so that the main loop
builds first all the functions of minimum complexity 1,
then all the functions of minimum complexity 2,
and so on. If we do that, we'll consider each function pair at most once.
We can stop when all functions are accounted for.
</p>
<p class=pp>
Applying this idea to Algorithm 1 (before canonicalization) yields:
</p>
<pre class="indent alg">
// Algorithm 3
func compute()
for each function f
size[f] = ∞
for each single variable function f = v
size[f] = 0
for k = 1 to ∞
for each function f
for each function g of size k − size(f) − 1
if size[f AND g] == ∞
size[f AND g] = k
nsize++
if size[f OR g] == ∞
size[f OR g] = k
nsize++
if nsize == 2<sup>2<sup>n</sup></sup>
return
</pre>
<p class=lp>
Applying the idea to Algorithm 2 (after canonicalization) yields:
</p>
<pre class="indent alg">
// Algorithm 4
func compute():
for each function f
size[f] = ∞
for each single variable function f = v
size[f] = 0
for k = 1 to ∞
for each canonical function f
for each function ff equivalent to f
for each canonical function g of size k − size(f) − 1
visit(k, ff OR g)
visit(k, ff AND g)
visit(k, ff AND ¬g)
visit(k, ¬ff AND g)
if nvisited == 2<sup>2<sup>n</sup></sup>
return
func visit(d, fg):
if size[fg] != ∞
return
record fg as canonical
for each function ffgg equivalent to fg
if size[ffgg] != ∞
size[ffgg] = d
nvisited += 2 // counts ffgg and ¬ffgg
return
</pre>
<p class=lp>
The original loop in Algorithms 1 and 2 considered each pair f, g in every
iteration of the loop after they were computed.
The new loop in Algorithms 3 and 4 considers each pair f, g only once,
when k = size(f) + size(g) + 1. This removes the
leading factor of 30 (the number of times we
expected the first loop to run) from our estimation
of the run time.
Now the expected number of iterations is around
2<sup>64</sup>/7680 = 2.4×10<sup>15</sup>. If we can do 10<sup>9</sup> iterations
per second, that's only 28 days of CPU time,
which I can deliver if you can wait a month.
</p>
<p class=pp>
Our estimate does not include the fact that not all function pairs need
to be considered. For example, if the maximum size is 30, then the
functions of size 14 need never be paired against the functions of size 16,
because any result would have size 14+1+16 = 31.
So even 2.4×10<sup>15</sup> is an overestimate, but it's in the right ballpark.
(With hindsight I can report that only 1.7×10<sup>14</sup> pairs need to be considered
but also that our estimate of 10<sup>9</sup> iterations
per second was optimistic. The actual calculation ran for 20 days,
an average of about 10<sup>8</sup> iterations per second.)
</p>
<h3>Endgame: Directed Search</h3>
<p class=pp>
A month is still a long time to wait, and we can do better.
Near the end (after k is bigger than, say, 22), we are exploring
the fairly large space of function pairs in hopes of finding a
fairly small number of remaining functions.
At that point it makes sense to change from the
bottom-up “bang things together and see what we make”
to the top-down “try to make this one of these specific functions.”
That is, the core of the current search is:
</p>
<pre class="indent alg">
for each canonical function f
for each function ff equivalent to f
for each canonical function g of size k − size(f) − 1
visit(k, ff OR g)
visit(k, ff AND g)
visit(k, ff AND ¬g)
visit(k, ¬ff AND g)
</pre>
<p class=lp>
We can change it to:
</p>
<pre class="indent alg">
for each missing function fg
for each canonical function g
for all possible f such that one of these holds
* fg = f OR g
* fg = f AND g
* fg = ¬f AND g
* fg = f AND ¬g
if size[f] == k − size(g) − 1
visit(k, fg)
next fg
</pre>
<p class=lp>
By the time we're at the end, exploring all the possible f to make
the missing functions—a directed search—is much less work than
the brute force of exploring all combinations.
</p>
<p class=pp>
As an example, suppose we are looking for f such that fg = f OR g.
The equation is only possible to satisfy if fg OR g == fg.
That is, if g has any extraneous 1 bits, no f will work, so we can move on.
Otherwise, the remaining condition is that
f AND ¬g == fg AND ¬g. That is, for the bit positions where g is 0, f must match fg.
The other bits of f (the bits where g has 1s)
can take any value.
We can enumerate the possible f values by recursively trying all
possible values for the “don't care” bits.
</p>
<pre class="indent alg">
func find(x, any, xsize):
if size(x) == xsize
return x
while any != 0
bit = any AND −any // rightmost 1 bit in any
any = any AND ¬bit
if f = find(x OR bit, any, xsize) succeeds
return f
return failure
</pre>
<p class=lp>
It doesn't matter which 1 bit we choose for the recursion,
but finding the rightmost 1 bit is cheap: it is isolated by the
(admittedly surprising) expression “any AND −any.”
</p>
<p class=pp>
Given <code>find</code>, the loop above can try these four cases:
</p>
<center>
<table id=find>
<tr><th>Formula <th>Condition <th>Base x <th>“Any” bits
<tr><td>fg = f OR g <td>fg OR g == fg <td>fg AND ¬g <td>g
<tr><td>fg = f OR ¬g <td>fg OR ¬g == fg <td>fg AND g <td>¬g
<tr><td>¬fg = f OR g <td>¬fg OR g == fg <td>¬fg AND ¬g <td>g
<tr><td>¬fg = f OR ¬g <td>¬fg OR ¬g == ¬fg <td>¬fg AND g <td>¬g
</table>
</center>
<p class=lp>
Rewriting the Boolean expressions to use only the four OR forms
means that we only need to write the “adding bits” version of find.
</p>
<p class=pp>
The final algorithm is:
</p>
<pre class="indent alg">
// Algorithm 5
func compute():
for each function f
size[f] = ∞
for each single variable function f = v
size[f] = 0
// Generate functions.
for k = 1 to max_generate
for each canonical function f
for each function ff equivalent to f
for each canonical function g of size k − size(f) − 1
visit(k, ff OR g)
visit(k, ff AND g)
visit(k, ff AND ¬g)
visit(k, ¬ff AND g)
// Search for functions.
for k = max_generate+1 to ∞
for each missing function fg
for each canonical function g
fsize = k − size(g) − 1
if fg OR g == fg
if f = find(fg AND ¬g, g, fsize) succeeds
visit(k, fg)
next fg
if fg OR ¬g == fg
if f = find(fg AND g, ¬g, fsize) succeeds
visit(k, fg)
next fg
if ¬fg OR g == ¬fg
if f = find(¬fg AND ¬g, g, fsize) succeeds
visit(k, fg)
next fg
if ¬fg OR ¬g == ¬fg
if f = find(¬fg AND g, ¬g, fsize) succeeds
visit(k, fg)
next fg
if nvisited == 2<sup>2<sup>n</sup></sup>
return
func visit(d, fg):
if size[fg] != ∞
return
record fg as canonical
for each function ffgg equivalent to fg
if size[ffgg] != ∞
size[ffgg] = d
nvisited += 2 // counts ffgg and ¬ffgg
return
func find(x, any, xsize):
if size(x) == xsize
return x
while any != 0
bit = any AND −any // rightmost 1 bit in any
any = any AND ¬bit
if f = find(x OR bit, any, xsize) succeeds
return f
return failure
</pre>
<p class=lp>
To get a sense of the speedup here, and to check my work,
I ran the program using both algorithms
on a 2.53 GHz Intel Core 2 Duo E7200.
</p>
<center>
<table id=times>
<tr><th> <th colspan=3>————— # of Functions —————<th colspan=2>———— Time ————
<tr><th>Size <th>Canonical <th>All <th>All, Cumulative <th>Generate <th>Search
<tr><td>0 <td>1 <td>10 <td>10
<tr><td>1 <td>2 <td>82 <td>92 <td>< 0.1 seconds <td>3.4 minutes
<tr><td>2 <td>2 <td>640 <td>732 <td>< 0.1 seconds <td>7.2 minutes
<tr><td>3 <td>7 <td>4420 <td>5152 <td>< 0.1 seconds <td>12.3 minutes
<tr><td>4 <td>19 <td>25276 <td>29696 <td>< 0.1 seconds <td>30.1 minutes
<tr><td>5 <td>44 <td>117440 <td>147136 <td>< 0.1 seconds <td>1.3 hours
<tr><td>6 <td>142 <td>515040 <td>662176 <td>< 0.1 seconds <td>3.5 hours
<tr><td>7 <td>436 <td>1999608 <td>2661784 <td>0.2 seconds <td>11.6 hours
<tr><td>8 <td>1209 <td>6598400 <td>9260184 <td>0.6 seconds <td>1.7 days
<tr><td>9 <td>3307 <td>19577332 <td>28837516 <td>1.7 seconds <td>4.9 days
<tr><td>10 <td>7741 <td>50822560 <td>79660076 <td>4.6 seconds <td>[ 10 days ? ]
<tr><td>11 <td>17257 <td>114619264 <td>194279340 <td>10.8 seconds <td>[ 20 days ? ]
<tr><td>12 <td>31851 <td>221301008 <td>415580348 <td>21.7 seconds <td>[ 50 days ? ]
<tr><td>13 <td>53901 <td>374704776 <td>790285124 <td>38.5 seconds <td>[ 80 days ? ]
<tr><td>14 <td>75248 <td>533594528 <td>1323879652 <td>58.7 seconds <td>[ 100 days ? ]
<tr><td>15 <td>94572 <td>667653642 <td>1991533294 <td>1.5 minutes <td>[ 120 days ? ]
<tr><td>16 <td>98237 <td>697228760 <td>2688762054 <td>2.1 minutes <td>[ 120 days ? ]
<tr><td>17 <td>89342 <td>628589440 <td>3317351494 <td>4.1 minutes <td>[ 90 days ? ]
<tr><td>18 <td>66951 <td>468552896 <td>3785904390 <td>9.1 minutes <td>[ 50 days ? ]
<tr><td>19 <td>41664 <td>287647616 <td>4073552006 <td>23.4 minutes <td>[ 30 days ? ]
<tr><td>20 <td>21481 <td>144079832 <td>4217631838 <td>57.0 minutes <td>[ 10 days ? ]
<tr><td>21 <td>8680 <td>55538224 <td>4273170062 <td>2.4 hours <td>2.5 days
<tr><td>22 <td>2730 <td>16099568 <td>4289269630 <td>5.2 hours <td>11.7 hours
<tr><td>23 <td>937 <td>4428800 <td>4293698430 <td>11.2 hours <td>2.2 hours
<tr><td>24 <td>228 <td>959328 <td>4294657758 <td>22.0 hours <td>33.2 minutes
<tr><td>25 <td>103 <td>283200 <td>4294940958 <td>1.7 days <td>4.0 minutes
<tr><td>26 <td>21 <td>22224 <td>4294963182 <td>2.9 days <td>42 seconds
<tr><td>27 <td>10 <td>3602 <td>4294966784 <td>4.7 days <td>2.4 seconds
<tr><td>28 <td>3 <td>512 <td>4294967296 <td>[ 7 days ? ] <td>0.1 seconds
</table>
</center>
<p class=pp>
The bracketed times are estimates based on the work involved: I did not
wait that long for the intermediate search steps.
The search algorithm is quite a bit worse than generate until there are
very few functions left to find.
However, it comes in handy just when it is most useful: when the
generate algorithm has slowed to a crawl.
If we run generate through formulas of size 22 and then switch
to search for 23 onward, we can run the whole computation in
just over half a day of CPU time.
</p>
<p class=pp>
The computation of a(5) identified the sizes of all 616,126
canonical Boolean functions of 5 inputs.
In contrast, there are <a href="http://oeis.org/A000370">just over 200 trillion canonical Boolean functions of 6 inputs</a>.
Determining a(6) is unlikely to happen by brute force computation, no matter what clever tricks we use.
</p>
<h3>Adding XOR</h3>
<p class=pp>We've assumed the use of just AND and OR as our
basis for the Boolean formulas. If we also allow XOR, functions
can be written using many fewer operators.
In particular, a hardest function for the 1-, 2-, 3-, and 4-input
cases—parity—is now trivial.
Knuth examines the complexity of 5-input Boolean functions
using AND, OR, and XOR in detail in <a href="http://www-cs-faculty.stanford.edu/~uno/taocp.html">The Art of Computer Programming, Volume 4A</a>.
Section 7.1.2's Algorithm L is the same as our Algorithm 3 above,
given for computing 4-input functions.
Knuth mentions that to adapt it for 5-input functions one must
treat only canonical functions and gives results for 5-input functions
with XOR allowed.
So another way to check our work is to add XOR to our Algorithm 4
and check that our results match Knuth's.
</p>
<p class=pp>
Because the minimum formula sizes are smaller (at most 12), the
computation of sizes with XOR is much faster than before:
</p>
<center>
<table>
<tr><th> <th><th colspan=5>————— # of Functions —————<th>
<tr><th>Size <th width=10><th>Canonical <th width=10><th>All <th width=10><th>All, Cumulative <th width=10><th>Time
<tr><td align=right>0 <td><td align=right>1 <td><td align=right>10 <td><td align=right>10 <td><td>
<tr><td align=right>1 <td><td align=right>3 <td><td align=right>102 <td><td align=right>112 <td><td align=right>< 0.1 seconds
<tr><td align=right>2 <td><td align=right>5 <td><td align=right>1140 <td><td align=right>1252 <td><td align=right>< 0.1 seconds
<tr><td align=right>3 <td><td align=right>20 <td><td align=right>11570 <td><td align=right>12822 <td><td align=right>< 0.1 seconds
<tr><td align=right>4 <td><td align=right>93 <td><td align=right>109826 <td><td align=right>122648 <td><td align=right>< 0.1 seconds
<tr><td align=right>5 <td><td align=right>366 <td><td align=right>936440 <td><td align=right>1059088 <td><td align=right>0.1 seconds
<tr><td align=right>6 <td><td align=right>1730 <td><td align=right>7236880 <td><td align=right>8295968 <td><td align=right>0.7 seconds
<tr><td align=right>7 <td><td align=right>8782 <td><td align=right>47739088 <td><td align=right>56035056 <td><td align=right>4.5 seconds
<tr><td align=right>8 <td><td align=right>40297 <td><td align=right>250674320 <td><td align=right>306709376 <td><td align=right>24.0 seconds
<tr><td align=right>9 <td><td align=right>141422 <td><td align=right>955812256 <td><td align=right>1262521632 <td><td align=right>95.5 seconds
<tr><td align=right>10 <td><td align=right>273277 <td><td align=right>1945383936 <td><td align=right>3207905568 <td><td align=right>200.7 seconds
<tr><td align=right>11 <td><td align=right>145707 <td><td align=right>1055912608 <td><td align=right>4263818176 <td><td align=right>121.2 seconds
<tr><td align=right>12 <td><td align=right>4423 <td><td align=right>31149120 <td><td align=right>4294967296 <td><td align=right>65.0 seconds
</table>
</center>
<p class=pp>
Knuth does not discuss anything like Algorithm 5,
because the search for specific functions does not apply to
the AND, OR, and XOR basis. XOR is a non-monotone
function (it can both turn bits on and turn bits off), so
there is no test like our “<code>if fg OR g == fg</code>”
and no small set of “don't care” bits to trim the search for f.
The search for an appropriate f in the XOR case would have
to try all f of the right size, which is exactly what Algorithm 4 already does.
</p>
<p class=pp>
Volume 4A also considers the problem of building minimal circuits,
which are like formulas but can use common subexpressions additional times for free,
and the problem of building the shallowest possible circuits.
See Section 7.1.2 for all the details.
</p>
<h3>Code and Web Site</h3>
<p class=pp>
The web site <a href="http://boolean-oracle.swtch.com">boolean-oracle.swtch.com</a>
lets you type in a Boolean expression and gives back the minimal formula for it.
It uses tables generated while running Algorithm 5; those tables and the
programs described in this post are also <a href="http://boolean-oracle.swtch.com/about">available on the site</a>.
</p>
<h3>Postscript: Generating All Permutations and Inversions</h3>
<p class=pp>
The algorithms given above depend crucially on the step
“<code>for each function ff equivalent to f</code>,”
which generates all the ff obtained by permuting or inverting inputs to f,
but I did not explain how to do that.
We already saw that we can manipulate the binary truth table representation
directly to turn <code>f</code> into <code>¬f</code> and to compute
combinations of functions.
We can also manipulate the binary representation directly to
invert a specific input or swap a pair of adjacent inputs.
Using those operations we can cycle through all the equivalent functions.
</p>
<p class=pp>
To invert a specific input,
let's consider the structure of the truth table.
The index of a bit in the truth table encodes the inputs for that entry.
For example, the low bit of the index gives the value of the first input.
So the even-numbered bits—at indices 0, 2, 4, 6, ...—correspond to
the first input being false, while the odd-numbered bits—at indices 1, 3, 5, 7, ...—correspond
to the first input being true.
Changing just that bit in the index corresponds to changing the
single variable, so indices 0, 1 differ only in the value of the first input,
as do 2, 3, and 4, 5, and 6, 7, and so on.
Given the truth table for f(V, W, X, Y, Z) we can compute
the truth table for f(¬V, W, X, Y, Z) by swapping adjacent bit pairs
in the original truth table.
Even better, we can do all the swaps in parallel using a bitwise
operation.
To invert a different input, we swap larger runs of bits.
</p>
<center>
<table>
<tr><th>Function <th width=10> <th>Truth Table (<span style="font-weight: normal;"><code>f</code> = f(V, W, X, Y, Z)</span>)
<tr><td>f(¬V, W, X, Y, Z) <td><td><code>(f&0x55555555)<< 1 | (f>> 1)&0x55555555</code>
<tr><td>f(V, ¬W, X, Y, Z) <td><td><code>(f&0x33333333)<< 2 | (f>> 2)&0x33333333</code>
<tr><td>f(V, W, ¬X, Y, Z) <td><td><code>(f&0x0f0f0f0f)<< 4 | (f>> 4)&0x0f0f0f0f</code>
<tr><td>f(V, W, X, ¬Y, Z) <td><td><code>(f&0x00ff00ff)<< 8 | (f>> 8)&0x00ff00ff</code>
<tr><td>f(V, W, X, Y, ¬Z) <td><td><code>(f&0x0000ffff)<<16 | (f>>16)&0x0000ffff</code>
</table>
</center>
<p class=lp>
Being able to invert a specific input lets us consider all possible
inversions by building them up one at a time.
The <a href="http://oeis.org/A003188">Gray code</a> lets us
enumerate all possible 5-bit input codes while changing only 1 bit at
a time as we move from one input to the next:
</p>
<center>
0, 1, 3, 2, 6, 7, 5, 4, <br>
12, 13, 15, 14, 10, 11, 9, 8, <br>
24, 25, 27, 26, 30, 31, 29, 28, <br>
20, 21, 23, 22, 18, 19, 17, 16
</center>
<p class=lp>
This minimizes
the number of inversions we need: to consider all 32 cases, we only
need 31 inversion operations.
In contrast, visiting the 5-bit input codes in the usual binary order 0, 1, 2, 3, 4, ...
would often need to change multiple bits, like when changing from 3 to 4.
</p>
<p class=pp>
To swap a pair of adjacent inputs, we can again take advantage of the truth table.
For a pair of inputs, there are four cases: 00, 01, 10, and 11. We can leave the
00 and 11 cases alone, because they are invariant under swapping,
and concentrate on swapping the 01 and 10 bits.
The first two inputs change most often in the truth table: each run of 4 bits
corresponds to those four cases.
In each run, we want to leave the first and fourth alone and swap the second and third.
For later inputs, the four cases consist of sections of bits instead of single bits.
</p>
<center>
<table>
<tr><th>Function <th width=10> <th>Truth Table (<span style="font-weight: normal;"><code>f</code> = f(V, W, X, Y, Z)</span>)
<tr><td>f(<b>W, V</b>, X, Y, Z) <td><td><code>f&0x99999999 | (f&0x22222222)<<1 | (f>>1)&0x22222222</code>
<tr><td>f(V, <b>X, W</b>, Y, Z) <td><td><code>f&0xc3c3c3c3 | (f&0x0c0c0c0c)<<1 | (f>>1)&0x0c0c0c0c</code>
<tr><td>f(V, W, <b>Y, X</b>, Z) <td><td><code>f&0xf00ff00f | (f&0x00f000f0)<<1 | (f>>1)&0x00f000f0</code>
<tr><td>f(V, W, X, <b>Z, Y</b>) <td><td><code>f&0xff0000ff | (f&0x0000ff00)<<8 | (f>>8)&0x0000ff00</code>
</table>
</center>
<p class=lp>
Being able to swap a pair of adjacent inputs lets us consider all
possible permutations by building them up one at a time.
Again it is convenient to have a way to visit all permutations by
applying only one swap at a time.
Here Volume 4A comes to the rescue.
Section 7.2.1.2 is titled “Generating All Permutations,” and Knuth delivers
many algorithms to do just that.
The most convenient for our purposes is Algorithm P, which
generates a sequence that considers all permutations exactly once
with only a single swap of adjacent inputs between steps.
Knuth calls it Algorithm P because it corresponds to the
“Plain changes” algorithm used by <a href="http://en.wikipedia.org/wiki/Change_ringing">bell ringers in 17th century England</a>
to ring a set of bells in all possible permutations.
The algorithm is described in a manuscript written around 1653!
</p>
<p class=pp>
We can examine all possible permutations and inversions by
nesting a loop over all permutations inside a loop over all inversions,
and in fact that's what my program does.
Knuth does one better, though: his Exercise 7.2.1.2-20
suggests that it is possible to build up all the possibilities
using only adjacent swaps and inversion of the first input.
Negating arbitrary inputs is not hard, though, and still does
minimal work, so the code sticks with Gray codes and Plain changes.
</p></p>
+
+
+ Zip Files All The Way Down
+ tag:research.swtch.com,2012:research.swtch.com/zip
+
+ 2010-03-18T00:00:00-04:00
+ 2010-03-18T00:00:00-04:00
+ Did you think it was turtles?
+
<p><p class=lp>
Stephen Hawking begins <i><a href="http://www.amazon.com/-/dp/0553380168">A Brief History of Time</a></i> with this story:
</p>
<blockquote>
<p class=pp>
A well-known scientist (some say it was Bertrand Russell) once gave a public lecture on astronomy. He described how the earth orbits around the sun and how the sun, in turn, orbits around the center of a vast collection of stars called our galaxy. At the end of the lecture, a little old lady at the back of the room got up and said: “What you have told us is rubbish. The world is really a flat plate supported on the back of a giant tortoise.” The scientist gave a superior smile before replying, “What is the tortoise standing on?” “You're very clever, young man, very clever,” said the old lady. “But it's turtles all the way down!”
</p>
</blockquote>
<p class=lp>
Scientists today are pretty sure that the universe is not actually turtles all the way down,
but we can create that kind of situation in other contexts.
For example, here we have <a href="http://www.youtube.com/watch?v=Y-gqMTt3IUg">video monitors all the way down</a>
and <a href="http://www.amazon.com/gp/customer-media/product-gallery/0387900926/ref=cm_ciu_pdp_images_all">set theory books all the way down</a>,
and <a href="http://blog.makezine.com/archive/2009/01/thousands_of_shopping_carts_stake_o.html">shopping carts all the way down</a>.
</p>
<p class=pp>
And here's a computer storage equivalent:
look inside <a href="http://swtch.com/r.zip"><code>r.zip</code></a>.
It's zip files all the way down:
each one contains another zip file under the name <code>r/r.zip</code>.
(For the die-hard Unix fans, <a href="http://swtch.com/r.tar.gz"><code>r.tar.gz</code></a> is
gzipped tar files all the way down.)
Like the line of shopping carts, it never ends,
because it loops back onto itself: the zip file contains itself!
And it's probably less work to put together a self-reproducing zip file
than to put together all those shopping carts,
at least if you're the kind of person who would read this blog.
This post explains how.
</p>
<p class=pp>
Before we get to self-reproducing zip files, though,
we need to take a brief detour into self-reproducing programs.
</p>
<h3>Self-reproducing programs</h3>
<p class=pp>
The idea of self-reproducing programs dates back to the 1960s.
My favorite statement of the problem is the one Ken Thompson gave in his 1983 Turing Award address:
</p>
<blockquote>
<p class=pp>
In college, before video games, we would amuse ourselves by posing programming exercises. One of the favorites was to write the shortest self-reproducing program. Since this is an exercise divorced from reality, the usual vehicle was FORTRAN. Actually, FORTRAN was the language of choice for the same reason that three-legged races are popular.
</p>
<p class=pp>
More precisely stated, the problem is to write a source program that, when compiled and executed, will produce as output an exact copy of its source. If you have never done this, I urge you to try it on your own. The discovery of how to do it is a revelation that far surpasses any benefit obtained by being told how to do it. The part about “shortest” was just an incentive to demonstrate skill and determine a winner.
</p>
</blockquote>
<p class=lp>
<b>Spoiler alert!</b>
I agree: if you have never done this, I urge you to try it on your own.
The internet makes it so easy to look things up that it's refreshing
to discover something yourself once in a while.
Go ahead and spend a few days figuring out. This blog will still be here
when you get back.
(If you don't mind the spoilers, the entire <a href="http://cm.bell-labs.com/who/ken/trust.html">Turing award address</a> is worth reading.)
</p>
<center>
<br><br>
<i>(Spoiler blocker.)</i>
<br>
<a href="http://www.robertwechsler.com/projects.html"><img src="/applied_geometry.jpg"></a>
<br>
<i><a href="http://www.robertwechsler.com/projects.html">http://www.robertwechsler.com/projects.html</a></i>
<br><br>
</center>
<p class=pp>
Let's try to write a Python program that prints itself.
It will probably be a <code>print</code> statement, so here's a first attempt,
run at the interpreter prompt:
</p>
<pre class=indent>
>>> print '<span style="color: #005500">hello</span>'
hello
</pre>
<p class=lp>
That didn't quite work. But now we know what the program is, so let's print it:
</p>
<pre class=indent>
>>> print "<span style="color: #005500">print 'hello'</span>"
print 'hello'
</pre>
<p class=lp>
That didn't quite work either. The problem is that when you execute
a simple print statement, it only prints part of itself: the argument to the print.
We need a way to print the rest of the program too.
</p>
<p class=pp>
The trick is to use recursion: you write a string that is the whole program,
but with itself missing, and then you plug it into itself before passing it to print.
</p>
<pre class=indent>
>>> s = '<span style="color: #005500">print %s</span>'; print s % repr(s)
print 'print %s'
</pre>
<p class=lp>
Not quite, but closer: the problem is that the string <code>s</code> isn't actually
the program. But now we know the general form of the program:
<code>s = '<span style="color: #005500">%s</span>'; print s % repr(s)</code>.
That's the string to use.
</p>
<pre class=indent>
>>> s = '<span style="color: #005500">s = %s; print s %% repr(s)</span>'; print s % repr(s)
s = 's = %s; print s %% repr(s)'; print s % repr(s)
</pre>
<p class=lp>
Recursion for the win.
</p>
<p class=pp>
This form of self-reproducing program is often called a <a href="http://en.wikipedia.org/wiki/Quine_(computing)">quine</a>,
in honor of the philosopher and logician W. V. O. Quine,
who discovered the paradoxical sentence:
</p>
<blockquote>
“Yields falsehood when preceded by its quotation”<br>yields falsehood when preceded by its quotation.
</blockquote>
<p class=lp>
The simplest English form of a self-reproducing quine is a command like:
</p>
<blockquote>
Print this, followed by its quotation:<br>“Print this, followed by its quotation:”
</blockquote>
<p class=lp>
There's nothing particularly special about Python that makes quining possible.
The most elegant quine I know is a Scheme program that is a direct, if somewhat inscrutable, translation of that
sentiment:
</p>
<pre class=indent>
((lambda (x) `<span style="color: #005500">(</span>,x <span style="color: #005500">'</span>,x<span style="color: #005500">)</span>)
'<span style="color: #005500">(lambda (x) `(,x ',x))</span>)
</pre>
<p class=lp>
I think the Go version is a clearer translation, at least as far as the quoting is concerned:
</p>
<pre class=indent>
/* Go quine */
package main
import "<span style="color: #005500">fmt</span>"
func main() {
fmt.Printf("<span style="color: #005500">%s%c%s%c\n</span>", q, 0x60, q, 0x60)
}
var q = `<span style="color: #005500">/* Go quine */
package main
import "fmt"
func main() {
fmt.Printf("%s%c%s%c\n", q, 0x60, q, 0x60)
}
var q = </span>`
</pre>
<p class=lp>(I've colored the data literals green throughout to make it clear what is program and what is data.)</p>
<p class=pp>The Go program has the interesting property that, ignoring the pesky newline
at the end, the entire program is the same thing twice (<code>/* Go quine */ ... q = `</code>).
That got me thinking: maybe it's possible to write a self-reproducing program
using only a repetition operator.
And you know what programming language has essentially only a repetition operator?
The language used to encode Lempel-Ziv compressed files
like the ones used by <code>gzip</code> and <code>zip</code>.
</p>
<h3>Self-reproducing Lempel-Ziv programs</h3>
<p class=pp>
Lempel-Ziv compressed data is a stream of instructions with two basic
opcodes: <code>literal(</code><i>n</i><code>)</code> followed by
<i>n</i> bytes of data means write those <i>n</i> bytes into the
decompressed output,
and <code>repeat(</code><i>d</i><code>,</code> <i>n</i><code>)</code>
means look backward <i>d</i> bytes from the current location
in the decompressed output and copy the <i>n</i> bytes you find there
into the output stream.
</p>
<p class=pp>
The programming exercise, then, is this: write a Lempel-Ziv program
using just those two opcodes that prints itself when run.
In other words, write a compressed data stream that decompresses to itself.
Feel free to assume any reasonable encoding for the <code>literal</code>
and <code>repeat</code> opcodes.
For the grand prize, find a program that decompresses to
itself surrounded by an arbitrary prefix and suffix,
so that the sequence could be embedded in an actual <code>gzip</code>
or <code>zip</code> file, which has a fixed-format header and trailer.
</p>
<p class=pp>
<b>Spoiler alert!</b>
I urge you to try this on your own before continuing to read.
It's a great way to spend a lazy afternoon, and you have
one critical advantage that I didn't: you know there is a solution.
</p>
<center>
<br><br>
<i>(Spoiler blocker.)</i>
<br>
<a href=""><img src="/the_best_circular_bike(sbcc_sbma_students_roof).jpg"></a>
<br>
<i><a href="http://www.robertwechsler.com/thebest.html">http://www.robertwechsler.com/thebest.html</a></i>
<br><br>
</center>
<p class=lp>By the way, here's <a href="http://swtch.com/r.gz"><code>r.gz</code></a>, gzip files all the way down.
<pre class=indent>
$ gunzip < r.gz > r
$ cmp r r.gz
$
</pre>
<p class=lp>The nice thing about <code>r.gz</code> is that even broken web browsers
that ordinarily decompress downloaded gzip data before storing it to disk
will handle this file correctly!
</p>
<p class=pp>Enough stalling to hide the spoilers.
Let's use this shorthand to describe Lempel-Ziv instructions:
<code>L</code><i>n</i> and <code>R</code><i>n</i> are
shorthand for <code>literal(</code><i>n</i><code>)</code> and
<code>repeat(</code><i>n</i><code>,</code> <i>n</i><code>)</code>,
and the program assumes that each code is one byte.
<code>L0</code> is therefore the Lempel-Ziv no-op;
<code>L5</code> <code>hello</code> prints <code>hello</code>;
and so does <code>L3</code> <code>hel</code> <code>R1</code> <code>L1</code> <code>o</code>.
</p>
<p class=pp>
Here's a Lempel-Ziv program that prints itself.
(Each line is one instruction.)
</p>
<br>
<center>
<table border=0>
<tr><th></th><th width=30></th><th>Code</th><th width=30></th><th>Output</th></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">no-op</span></i></td><td></td><td><code>L0</code></td><td></td><td></td></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">no-op</span></i></td><td></td><td><code>L0</code></td><td></td><td></td></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">no-op</span></i></td><td></td><td><code>L0</code></td><td></td><td></td></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">print 4 bytes</span></i></td><td></td><td><code>L4 <span style="color: #005500">L0 L0 L0 L4</span></code></td><td></td><td><code>L0 L0 L0 L4</code></td></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">repeat last 4 printed bytes</span></i></td><td></td><td><code>R4</code></td><td></td><td><code>L0 L0 L0 L4</code></td></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">print 4 bytes</span></i></td><td></td><td><code>L4 <span style="color: #005500">R4 L4 R4 L4</span></code></td><td></td><td><code>R4 L4 R4 L4</code></td></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">repeat last 4 printed bytes</span></i></td><td></td><td><code>R4</code></td><td></td><td><code>R4 L4 R4 L4</code></td></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">print 4 bytes</span></i></td><td></td><td><code>L4 <span style="color: #005500">L0 L0 L0 L0</span></code></td><td></td><td><code>L0 L0 L0 L0</code></td></tr>
</table>
</center>
<br>
<p class=lp>
(The two columns Code and Output contain the same byte sequence.)
</p>
<p class=pp>
The interesting core of this program is the 6-byte sequence
<code>L4 R4 L4 R4 L4 R4</code>, which prints the 8-byte sequence <code>R4 L4 R4 L4 R4 L4 R4 L4</code>.
That is, it prints itself with an extra byte before and after.
</p>
<p class=pp>
When we were trying to write the self-reproducing Python program,
the basic problem was that the print statement was always longer
than what it printed. We solved that problem with recursion,
computing the string to print by plugging it into itself.
Here we took a different approach.
The Lempel-Ziv program is
particularly repetitive, so that a repeated substring ends up
containing the entire fragment. The recursion is in the
representation of the program rather than its execution.
Either way, that fragment is the crucial point.
Before the final <code>R4</code>, the output lags behind the input.
Once it executes, the output is one code ahead.
</p>
<p class=pp>
The <code>L0</code> no-ops are plugged into
a more general variant of the program, which can reproduce itself
with the addition of an arbitrary three-byte prefix and suffix:
</p>
<br>
<center>
<table border=0>
<tr><th></th><th width=30></th><th>Code</th><th width=30></th><th>Output</th></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">print 4 bytes</span></i></td><td></td><td><code>L4 <span style="color: #005500"><i>aa bb cc</i> L4</span></code></td><td></td><td><code><i>aa bb cc</i> L4</code></td></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">repeat last 4 printed bytes</span></i></td><td></td><td><code>R4</code></td><td></td><td><code><i>aa bb cc</i> L4</code></td></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">print 4 bytes</span></i></td><td></td><td><code>L4 <span style="color: #005500">R4 L4 R4 L4</span></code></td><td></td><td><code>R4 L4 R4 L4</code></td></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">repeat last 4 printed bytes</span></i></td><td></td><td><code>R4</code></td><td></td><td><code>R4 L4 R4 L4</code></td></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">print 4 bytes</span></i></td><td></td><td><code>L4 <span style="color: #005500">R4 <i>xx yy zz</i></span></code></td><td></td><td><code>R4 <i>xx yy zz</i></code></td></tr>
<tr><td align=right><i><span style="font-size: 0.8em;">repeat last 4 printed bytes</span></i></td><td></td><td><code>R4</code></td><td></td><td><code>R4 <i>xx yy zz</i></code></td></tr>
</table>
</center>
<br>
<p class=lp>
(The byte sequence in the Output column is <code><i>aa bb cc</i></code>, then
the byte sequence from the Code column, then <code><i>xx yy zz</i></code>.)
</p>
<p class=pp>
It took me the better part of a quiet Sunday to get this far,
but by the time I got here I knew the game was over
and that I'd won.
From all that experimenting, I knew it was easy to create
a program fragment that printed itself minus a few instructions
or even one that printed an arbitrary prefix
and then itself, minus a few instructions.
The extra <code>aa bb cc</code> in the output
provides a place to attach such a program fragment.
Similarly, it's easy to create a fragment to attach
to the <code>xx yy zz</code> that prints itself,
minus the first three instructions, plus an arbitrary suffix.
We can use that generality to attach an appropriate
header and trailer.
</p>
<p class=pp>
Here is the final program, which prints itself surrounded by an
arbitrary prefix and suffix.
<code>[P]</code> denotes the <i>p</i>-byte compressed form of the prefix <code>P</code>;
similarly, <code>[S]</code> denotes the <i>s</i>-byte compressed form of the suffix <code>S</code>.
</p>
<br>
<center>
<table border=0>
<tr><th></th><th width=30></th><th>Code</th><th width=30></th><th>Output</th></tr>
<tr>
<td align=right><i><span style="font-size: 0.8em;">print prefix</span></i></td>
<td></td>
<td><code>[P]</code></td>
<td></td>
<td><code>P</code></td>
</tr>
<tr>
<td align=right><span style="font-size: 0.8em;"><i>print </i>p<i>+1 bytes</i></span></td>
<td></td>
<td><code>L</code><span style="font-size: 0.8em;"><i>p</i>+1</span><code> <span style="color: #005500">[P] L</span></code><span style="color: #005500"><span style="font-size: 0.8em;"><i>p</i>+1</span></span><code></code></td>
<td></td>
<td><code>[P] L</code><span style="font-size: 0.8em;"><i>p</i>+1</span><code></code></td>
</tr>
<tr>
<td align=right><span style="font-size: 0.8em;"><i>repeat last </i>p<i>+1 printed bytes</i></span></td>
<td></td>
<td><code>R</code><span style="font-size: 0.8em;"><i>p</i>+1</span><code></code></td>
<td></td>
<td><code>[P] L</code><span style="font-size: 0.8em;"><i>p</i>+1</span><code></code></td>
</tr>
<tr>
<td align=right><span style="font-size: 0.8em;"><i>print 1 byte</i></span></td>
<td></td>
<td><code>L1 <span style="color: #005500">R</span></code><span style="color: #005500"><span style="font-size: 0.8em;"><i>p</i>+1</span></span><code></code></td>
<td></td>
<td><code>R</code><span style="font-size: 0.8em;"><i>p</i>+1</span><code></code></td>
</tr>
<tr>
<td align=right><span style="font-size: 0.8em;"><i>print 1 byte</i></span></td>
<td></td>
<td><code>L1 <span style="color: #005500">L1</span></code></td>
<td></td>
<td><code>L1</code></td>
</tr>
<tr>
<td align=right><i><span style="font-size: 0.8em;">print 4 bytes</span></i></td>
<td></td>
<td><code>L4 <span style="color: #005500">R</span></code><span style="color: #005500"><span style="font-size: 0.8em;"><i>p</i>+1</span></span><code><span style="color: #005500"> L1 L1 L4</span></code></td>
<td></td>
<td><code>R</code><span style="font-size: 0.8em;"><i>p</i>+1</span><code> L1 L1 L4</code></td>
</tr>
<tr>
<td align=right><i><span style="font-size: 0.8em;">repeat last 4 printed bytes</span></i></td>
<td></td>
<td><code>R4</code></td>
<td></td>
<td><code>R</code><span style="font-size: 0.8em;"><i>p</i>+1</span><code> L1 L1 L4</code></td>
</tr>
<tr>
<td align=right><i><span style="font-size: 0.8em;">print 4 bytes</span></i></td>
<td></td>
<td><code>L4 <span style="color: #005500">R4 L4 R4 L4</span></code></td>
<td></td>
<td><code>R4 L4 R4 L4</code></td>
</tr>
<tr>
<td align=right><i><span style="font-size: 0.8em;">repeat last 4 printed bytes</span></i></td>
<td></td>
<td><code>R4</code></td>
<td></td>
<td><code>R4 L4 R4 L4</code></td>
</tr>
<tr>
<td align=right><i><span style="font-size: 0.8em;">print 4 bytes</span></i></td>
<td></td>
<td><code>L4 <span style="color: #005500">R4 L0 L0 L</span></code><span style="color: #005500"><span style="font-size: 0.8em;"><i>s</i>+1</span></span><code><span style="color: #005500"></span></code></td>
<td></td>
<td><code>R4 L0 L0 L</code><span style="font-size: 0.8em;"><i>s</i>+1</span><code></code></td>
</tr>
<tr>
<td align=right><i><span style="font-size: 0.8em;">repeat last 4 printed bytes</span></i></td>
<td></td>
<td><code>R4</code></td>
<td></td>
<td><code>R4 L0 L0 L</code><span style="font-size: 0.8em;"><i>s</i>+1</span><code></code></td>
</tr>
<tr>
<td align=right><i><span style="font-size: 0.8em;">no-op</span></i></td>
<td></td>
<td><code>L0</code></td>
<td></td>
<td></td>
</tr>
<tr>
<td align=right><i><span style="font-size: 0.8em;">no-op</span></i></td>
<td></td>
<td><code>L0</code></td>
<td></td>
<td></td>
</tr>
<tr>
<td align=right><span style="font-size: 0.8em;"><i>print </i>s<i>+1 bytes</i></span></td>
<td></td>
<td><code>L</code><span style="font-size: 0.8em;"><i>s</i>+1</span><code> <span style="color: #005500">R</span></code><span style="color: #005500"><span style="font-size: 0.8em;"><i>s</i>+1</span></span><code><span style="color: #005500"> [S]</span></code></td>
<td></td>
<td><code>R</code><span style="font-size: 0.8em;"><i>s</i>+1</span><code> [S]</code></td>
</tr>
<tr>
<td align=right><span style="font-size: 0.8em;"><i>repeat last </i>s<i>+1 bytes</i></span></td>
<td></td>
<td><code>R</code><span style="font-size: 0.8em;"><i>s</i>+1</span><code></code></td>
<td></td>
<td><code>R</code><span style="font-size: 0.8em;"><i>s</i>+1</span><code> [S]</code></td>
</tr>
<tr>
<td align=right><i><span style="font-size: 0.8em;">print suffix</span></i></td>
<td></td>
<td><code>[S]</code></td>
<td></td>
<td><code>S</code></td>
</tr>
</table>
</center>
<br>
<p class=lp>
(The byte sequence in the Output column is <code><i>P</i></code>, then
the byte sequence from the Code column, then <code><i>S</i></code>.)
</p>
<h3>Self-reproducing zip files</h3>
<p class=pp>
Now the rubber meets the road.
We've solved the main theoretical obstacle to making a self-reproducing
zip file, but there are a couple practical obstacles
still in our way.
</p>
<p class=pp>
The first obstacle is to translate our self-reproducing Lempel-Ziv program,
written in simplified opcodes, into the real opcode encoding.
<a href="http://www.ietf.org/rfc/rfc1951.txt">RFC 1951</a> describes the DEFLATE format used in both gzip and zip: a sequence of blocks, each of which
is a sequence of opcodes encoded using Huffman codes.
Huffman codes assign different length bit strings
to different opcodes,
breaking our assumption above that opcodes have
fixed length.
But wait!
We can, with some care, find a set of fixed-size encodings
that says what we need to be able to express.
</p>
<p class=pp>
In DEFLATE, there are literal blocks and opcode blocks.
The header at the beginning of a literal block is 5 bytes:
</p>
<center>
<img src="/zip1.png">
</center>
<p class=pp>
If the translation of our <code>L</code> opcodes above
are 5 bytes each, the translation of the <code>R</code> opcodes
must also be 5 bytes each, with all the byte counts
above scaled by a factor of 5.
(For example, <code>L4</code> now has a 20-byte argument,
and <code>R4</code> repeats the last 20 bytes of output.)
The opcode block
with a single <code>repeat(20,20)</code> instruction falls well short of
5 bytes:
</p>
<center>
<img src="/zip2.png">
</center>
<p class=lp>Luckily, an opcode block containing two
<code>repeat(20,10)</code> instructions has the same effect and is exactly 5 bytes:
</p>
<center>
<img src="/zip3.png">
</center>
<p class=lp>
Encoding the other sized repeats
(<code>R</code><span style="font-size: 0.8em;"><i>p</i>+1</span> and
<code>R</code><span style="font-size: 0.8em;"><i>s</i>+1</span>)
takes more effort
and some sleazy tricks, but it turns out that
we can design 5-byte codes that repeat any amount
from 9 to 64 bytes.
For example, here are the repeat blocks for 10 bytes and for 40 bytes:
</p>
<center>
<img src="/zip4.png">
<br>
<img src="/zip5.png">
</center>
<p class=lp>
The repeat block for 10 bytes is two bits too short,
but every repeat block is followed by a literal block,
which starts with three zero bits and then padding
to the next byte boundary.
If a repeat block ends two bits short of a byte
but is followed by a literal block, the literal block's
padding will insert the extra two bits.
Similarly, the repeat block for 40 bytes is five bits too long,
but they're all zero bits.
Starting a literal block five bits too late
steals the bits from the padding.
Both of these tricks only work because the last 7 bits of
any repeat block are zero and the bits in the first byte
of any literal block are also zero,
so the boundary isn't directly visible.
If the literal block started with a one bit,
this sleazy trick wouldn't work.
</p>
<p class=pp>The second obstacle is that zip archives (and gzip files)
record a CRC32 checksum of the uncompressed data.
Since the uncompressed data is the zip archive,
the data being checksummed includes the checksum itself.
So we need to find a value <i>x</i> such that writing <i>x</i> into
the checksum field causes the file to checksum to <i>x</i>.
Recursion strikes back.
</p>
<p class=pp>
The CRC32 checksum computation interprets the entire file as a big number and computes
the remainder when you divide that number by a specific constant
using a specific kind of division.
We could go through the effort of setting up the appropriate
equations and solving for <i>x</i>.
But frankly, we've already solved one nasty recursive puzzle
today, and <a href="http://www.youtube.com/watch?v=TQBLTB5f3j0">enough is enough</a>.
There are only four billion possibilities for <i>x</i>:
we can write a program to try each in turn, until it finds one that works.
</p>
<p class=pp>
If you want to recreate these files yourself, there are a
few more minor obstacles, like making sure the tar file is a multiple
of 512 bytes and compressing the rather large zip trailer to
at most 59 bytes so that <code>R</code><span style="font-size: 0.8em;"><i>s</i>+1</span> is
at most <code>R</code><span style="font-size: 0.8em;">64</span>.
But they're just a simple matter of programming.
</p>
<p class=pp>
So there you have it:
<code><a href="http://swtch.com/r.gz">r.gz</a></code> (gzip files all the way down),
<code><a href="http://swtch.com/r.tar.gz">r.tar.gz</a></code> (gzipped tar files all the way down),
and
<code><a href="http://swtch.com/r.zip">r.zip</a></code> (zip files all the way down).
I regret that I have been unable to find any programs
that insist on decompressing these files recursively, ad infinitum.
It would have been fun to watch them squirm, but
it looks like much less sophisticated
<a href="http://en.wikipedia.org/wiki/Zip_bomb">zip bombs</a> have spoiled the fun.
</p>
<p class=pp>
If you're feeling particularly ambitious, here is
<a href="http://swtch.com/rgzip.go">rgzip.go</a>,
the <a href="http://golang.org/">Go</a> program that generated these files.
I wonder if you can create a zip file that contains a gzipped tar file
that contains the original zip file.
Ken Thompson suggested trying to make a zip file that
contains a slightly larger copy of itself, recursively,
so that as you dive down the chain of zip files
each one gets a little bigger.
(If you do manage either of these, please leave a comment.)
</p>
<br>
<p class=lp><font size=-1>P.S. I can't end the post without sharing my favorite self-reproducing program: the one-line shell script <code>#!/bin/cat</code></font>.
</p></p>
</div>
</div>
</div>
+
+
+ UTF-8: Bits, Bytes, and Benefits
+ tag:research.swtch.com,2012:research.swtch.com/utf8
+
+ 2010-03-05T00:00:00-05:00
+ 2010-03-05T00:00:00-05:00
+ The reasons to switch to UTF-8
+
<p><p class=pp>
UTF-8 is a way to encode Unicode code points—integer values from
0 through 10FFFF—into a byte stream,
and it is far simpler than many people realize.
The easiest way to make it confusing or complicated
is to treat it as a black box, never looking inside.
So let's start by looking inside. Here it is:
</p>
<center>
<table cellspacing=5 cellpadding=0 border=0>
<tr height=10><th colspan=4></th></tr>
<tr><th align=center colspan=2>Unicode code points</th><th width=10><th align=center>UTF-8 encoding (binary)</th></tr>
<tr height=10><td colspan=4></td></tr>
<tr><td align=right>00-7F</td><td>(7 bits)</td><td></td><td align=right>0<i>tuvwxyz</i></td></tr>
<tr><td align=right>0080-07FF</td><td>(11 bits)</td><td></td><td align=right>110<i>pqrst</i> 10<i>uvwxyz</i></td></tr>
<tr><td align=right>0800-FFFF</td><td>(16 bits)</td><td></td><td align=right>1110<i>jklm</i> 10<i>npqrst</i> 10<i>uvwxyz</i></td></tr>
<tr><td align=right valign=top>010000-10FFFF</td><td>(21 bits)</td><td></td><td align=right valign=top>11110<i>efg</i> 10<i>hijklm</i> 10<i>npqrst</i> 10<i>uvwxyz</i></td>
<tr height=10><td colspan=4></td></tr>
</table>
</center>
<p class=lp>
The convenient properties of UTF-8 are all consequences of the choice of encoding.
</p>
<ol>
<li><i>All ASCII files are already UTF-8 files.</i><br>
The first 128 Unicode code points are the 7-bit ASCII character set,
and UTF-8 preserves their one-byte encoding.
</li>
<li><i>ASCII bytes always represent themselves in UTF-8 files. They never appear as part of other UTF-8 sequences.</i><br>
All the non-ASCII UTF-8 sequences consist of bytes
with the high bit set, so if you see the byte 0x7A in a UTF-8 file,
you can be sure it represents the character <code>z</code>.
</li>
<li><i>ASCII bytes are always represented as themselves in UTF-8 files. They cannot be hidden inside multibyte UTF-8 sequences.</i><br>
The ASCII <code>z</code> 01111010 cannot be encoded as a two-byte UTF-8 sequence
11000001 10111010</code>. Code points must be encoded using the shortest
possible sequence.
A corollary is that decoders must detect long-winded sequences as invalid.
In practice, it is useful for a decoder to use the Unicode replacement
character, code point FFFD, as the decoding of an invalid UTF-8 sequence
rather than stop processing the text.
</li>
<li><i>UTF-8 is self-synchronizing.</i><br>
Let's call a byte of the form 10<i>xxxxxx</i>
a continuation byte.
Every UTF-8 sequence is a byte that is not a continuation byte
followed by zero or more continuation bytes.
If you start processing a UTF-8 file at an arbitrary point,
you might not be at the beginning of a UTF-8 encoding,
but you can easily find one: skip over
continuation bytes until you find a non-continuation byte.
(The same applies to scanning backward.)
</li>
<li><i>Substring search is just byte string search.</i><br>
Properties 2, 3, and 4 imply that given a string
of correctly encoded UTF-8, the only way those bytes
can appear in a larger UTF-8 text is when they represent the
same code points. So you can use any 8-bit safe byte at a time
search function, like <code>strchr</code> or <code>strstr</code>, to run the search.
</li>
<li><i>Most programs that handle 8-bit files safely can handle UTF-8 safely.</i><br>
This also follows from Properties 2, 3, and 4.
I say “most” programs, because programs that
take apart a byte sequence expecting one character per byte
will not behave correctly, but very few programs do that.
It is far more common to split input at newline characters,
or split whitespace-separated fields, or do other similar parsing
around specific ASCII characters.
For example, Unix tools like cat, cmp, cp, diff, echo, head, tail, and tee
can process UTF-8 files as if they were plain ASCII files.
Most operating system kernels should also be able to handle
UTF-8 file names without any special arrangement, since the
only operations done on file names are comparisons
and splitting at <code>/</code>.
In contrast, tools like grep, sed, and wc, which inspect arbitrary
individual characters, do need modification.
</li>
<li><i>UTF-8 sequences sort in code point order.</i><br>
You can verify this by inspecting the encodings in the table above.
This means that Unix tools like join, ls, and sort (without options) don't need to handle
UTF-8 specially.
</li>
<li><i>UTF-8 has no “byte order.”</i><br>
UTF-8 is a byte encoding. It is not little endian or big endian.
Unicode defines a byte order mark (BOM) code point FFFE,
which are used to determine the byte order of a stream of
raw 16-bit values, like UCS-2 or UTF-16.
It has no place in a UTF-8 file.
Some programs like to write a UTF-8-encoded BOM
at the beginning of UTF-8 files, but this is unnecessary
(and annoying to programs that don't expect it).
</li>
</ol>
<p class=lp>
UTF-8 does give up the ability to do random
access using code point indices.
Programs that need to jump to the <i>n</i>th
Unicode code point in a file or on a line—text editors are the canonical example—will
typically convert incoming UTF-8 to an internal representation
like an array of code points and then convert back to UTF-8
for output,
but most programs are simpler when written to manipulate UTF-8 directly.
</p>
<p class=pp>
Programs that make UTF-8 more complicated than it needs to be
are typically trying to be too general,
not wanting to make assumptions that might not be true of
other encodings.
But there are good tools to convert other encodings to UTF-8,
and it is slowly becoming the standard encoding:
even the fraction of web pages
written in UTF-8 is
<a href="http://googleblog.blogspot.com/2010/01/unicode-nearing-50-of-web.html">nearing 50%</a>.
UTF-8 was explicitly designed
to have these nice properties. Take advantage of them.
</p>
<p class=pp>
For more on UTF-8, see “<a href="http://plan9.bell-labs.com/sys/doc/utf.html">Hello World
or
Καλημέρα κόσμε
or
こんにちは 世界</a>,” by Rob Pike
and Ken Thompson, and also this <a href="http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt">history</a>.
</p>
<br>
<font size=-1>
<p class=lp>
Notes: Property 6 assumes the tools do not strip the high bit from each byte.
Such mangling was common years ago but is very uncommon now.
Property 7 assumes the comparison is done treating
the bytes as unsigned, but such behavior is mandated
by the ANSI C standard for <code>memcmp</code>,
<code>strcmp</code>, and <code>strncmp</code>.
</p>
</font></p>
+
+
+ Computing History at Bell Labs
+ tag:research.swtch.com,2012:research.swtch.com/bell-labs
+
+ 2008-04-09T00:00:00-04:00
+ 2008-04-09T00:00:00-04:00
+ Doug McIlroy's rememberances
+
<p><p class=pp>
In 1997, on his retirement from Bell Labs, Doug McIlroy gave a
fascinating talk about the “<a href="http://cm.bell-labs.com/cm/cs/doug97.html"><b>History of Computing at Bell Labs</b></a>.”
That page contains audio for the talk in Real Audio format (it <i>was</i> 1997).
Almost ten years ago I transcribed the audio but never did anything with it.
The transcript is below.
</p>
<p class=pp>
My favorite parts of the talk are the description of the bi-quinary decimal relay calculator
and the description of a team that spent over a year tracking down a race condition bug in
a missile detector (reliability was king: today you'd just stamp
“cannot reproduce” and send the report back).
But the whole thing contains many fantastic stories.
It's well worth the read or listen.
I also like his recollection of programming using cards: “It's the kind of thing you can be nostalgic about, but it wasn't actually fun.”
</p>
<p class=pp>
For more information, Bernard D. Holbrook and W. Stanley Brown's 1982
technical report
“<a href="http://cm.research.bell-labs.com/cm/cs/cstr/cstr99.html">A History of Computing Research at Bell Laboratories (1937-1975)</a>”
covers the earlier history in more detail.
</p>
<p><i>Corrections added August 19, 2009.</i></p>
<br>
<br>
<p class=lp><i>Transcript of “<a href="http://cm.bell-labs.com/cm/cs/doug97.html">History of Computing at Bell Labs:</a>”</i></p>
<p class=pp>
Computing at Bell Labs is certainly an outgrowth of the
<a href="http://cm.bell-labs.com/cm/ms/history/history.html">mathematics department</a>, which grew from that first hiring
in 1897, G A Campbell. When Bell Labs was formally founded
in 1925, what it had been was the engineering department
of Western Electric.
When it was formally founded in 1925,
almost from the beginning there was a math department with Thornton Fry as the department head, and if you look at some of Fry's work, it turns out that
he was fussing around in 1929 with trying to discover
information theory. It didn't actually gel until twenty years later with Shannon.</p>
<p class=pp><span style="font-size: 0.7em;">1:10</span>
Of course, most of the mathematics at that time was continuous.
One was interested in analyzing circuits and propagation. And indeed, this is what led to the growth of computing in Bell Laboratories. The computations could not all be done symbolically. There were not closed form solutions. There was lots of numerical computation done.
The math department had a fair stable of computers,
which in those days meant people. [laughter]</p>
<p class=pp><span style="font-size: 0.7em;">2:00</span>
And in the late '30s, <a href="http://en.wikipedia.org/wiki/George_Stibitz">George Stibitz</a> had an idea that some of
the work that they were doing on hand calculators might be
automated by using some of the equipment that the Bell System
was installing in central offices, namely relay circuits.
He went home, and on his kitchen table, he built out of relays
a binary arithmetic circuit. He decided that binary was really
the right way to compute.
However, when he finally came to build some equipment,
he determined that binary to decimal conversion and
decimal to binary conversion was a drag, and he didn't
want to put it in the equipment, and so he finally built
in 1939, a relay calculator that worked in decimal,
and it worked in complex arithmetic.
Do you have a hand calculator now that does complex arithmetic?
Ten-digit, I believe, complex computations: add, subtract,
multiply, and divide.
The I/O equipment was teletypes, so essentially all the stuff to make such
machines out of was there.
Since the I/O was teletypes, it could be remotely accessed,
and there were in fact four stations in the West Street Laboratories
of Bell Labs. West Street is down on the left side of Manhattan.
I had the good fortune to work there one summer, right next to a
district where you're likely to get bowled over by rolling ?beads? hanging from racks or tumbling ?cabbages?. The building is still there. It's called <a href="http://query.nytimes.com/gst/fullpage.html?res=950DE3DB1F38F931A35751C0A96F948260">Westbeth Apartments</a>. It's now an artist's colony.</p>
<p class=pp><span style="font-size: 0.7em;">4:29</span>
Anyway, in West Street, there were four separate remote stations from which the complex calculator could be accessed. It was not time sharing. You actually reserved your time on the machine, and only one of the four terminals worked at a time.
In 1940, this machine was shown off to the world at the AMS annual convention, which happened to be held in Hanover at Dartmouth that year, and mathematicians could wonder at remote computing, doing computation on an electromechanical calculator at 300 miles away.</p>
<p class=pp><span style="font-size: 0.7em;">5:22</span>
Stibitz went on from there to make a whole series of relay machines. Many of them were made for the government during the war. They were named, imaginatively, Mark I through Mark VI.
I have read some of his patents. They're kind of fun. One is a patent on conditional transfer. [laughter] And how do you do a conditional transfer?
Well these gadgets were, the relay calculator was run from your fingers, I mean the complex calculator.
The later calculators, of course, if your fingers were a teletype, you could perfectly well feed a paper tape in,
because that was standard practice. And these later machines were intended really to be run more from paper tape.
And the conditional transfer was this: you had two teletypes, and there's a code that says "time to read from the other teletype". Loops were of course easy to do. You take paper and [laughter; presumably Doug curled a piece of paper to form a physical loop].
These machines never got to the point of having stored programs.
But they got quite big. I saw, one of them was here in 1954, and I did see it, behind glass, and if you've ever seen these machines in the, there's one in the Franklin Institute in Philadelphia, and there's one in the Science Museum in San Jose, you know these machines that drop balls that go wandering sliding around and turning battle wheels and ringing bells and who knows what. It kind of looked like that.
It was a very quiet room, with just a little clicking of relays, which is what a central office used to be like. It was the one air-conditioned room in Murray Hill, I think. This machine ran, the Mark VI, well I think that was the Mark V, the Mark VI actually went to Aberdeen.
This machine ran for a good number of years, probably six, eight.
And it is said that it never made an undetected error. [laughter]</p>
<p class=pp><span style="font-size: 0.7em;">8:30</span>
What that means is that it never made an error that it did not diagnose itself and stop.
Relay technology was very very defensive. The telephone switching system had to work. It was full of self-checking,
and so were the calculators, so were the calculators that Stibitz made.</p>
<p class=pp><span style="font-size: 0.7em;">9:04</span>
Arithmetic was done in bi-quinary, a two out of five representation for decimal integers, and if there weren't exactly two out of five relays activated it would stop.
This machine ran unattended over the weekends. People would
bring their tapes in, and the operator would paste everybody's tapes together.
There was a beginning of job code on the tape and there was also a time indicator.
If the machine ran out of time, it automatically stopped and went to the next job. If the machine caught itself in an error, it backed up to the current job and tried it again.
They would load this machine on Friday night, and on Monday morning, all the tapes, all the entries would be available on output tapes.</p>
<p class=pp>Question: I take it they were using a different representation for loops
and conditionals by then.</p>
<p class=pp>Doug: Loops were done actually by they would run back and forth across the tape now, on this machine.</p>
<p class=pp><span style="font-size: 0.7em;">10:40</span>
Then came the transistor in '48.
At Whippany, they actually had a transistorized computer, which was a respectable minicomputer, a box about this big, running in 1954, it ran from 1954 to 1956 solidly as a test run.
The notion was that this computer might fly in an airplane.
And during that two-year test run, one diode failed.
In 1957, this machine called <a href="http://www.cedmagic.com/history/tradic-transistorized.html">TRADIC</a>, did in fact fly in an airplane, but to the best of my knowledge, that machine was a demonstration machine. It didn't turn into a production machine.
About that time, we started buying commercial machines.
It's wonderful to think about the set of different architectures that existed in that time. The first machine we got was called a <a href="http://www.columbia.edu/acis/history/cpc.html">CPC from IBM</a>. And all it was was a big accounting machine with a very special plugboard on the side that provided an interpreter for doing ten-digit decimal arithmetic, including
opcodes for the trig functions and square root.</p>
<p class=pp><span style="font-size: 0.7em;">12:30</span>
It was also not a computer as we know it today,
because it wasn't stored program, it had twenty-four memory locations as I recall, and it took its program instead of from tapes, from cards. This was not a total advantage. A tape didn't get into trouble if you dropped it on the floor. [laughter].
CPC, the operator would stand in front of it, and there, you
would go through loops by taking cards out, it took human intervention, to take the cards out of the output of the card reader and put them in the ?top?. I actually ran some programs on the CPC ?...?. It's the kind of thing you can be nostalgic about, but it wasn't actually fun.
[laughter]</p>
<p class=pp><span style="font-size: 0.7em;">13:30</span>
The next machine was an <a href="http://www.columbia.edu/acis/history/650.html">IBM 650</a>, and here, this was a stored program, with the memory being on drum. There was no operating system for it. It came with a manual: this is what the machine does. And Michael Wolontis made an interpreter called the <a href="http://hopl.murdoch.edu.au/showlanguage.prx?exp=6497&language=Wolontis-Bell%20Interpreter">L1 interpreter</a> for this machine, so you could actually program in, the manual told you how to program in binary, and L1 allowed you to give something like 10 for add and 9 for subtract, and program in decimal instead. And of course that machine required interesting optimization, because it was a nice thing if the next program step were stored somewhere -- each program step had the address of the following step in it, and you would try to locate them around the drum so to minimize latency. So there were all kinds of optimizers around, but I don't think Bell Labs made ?...? based on this called "soap" from Carnegie Mellon. That machine didn't last very long. Fortunately, a machine with core memory came out from IBM in about '56, the 704. Bell Labs was a little slow in getting one, in '58. Again, the machine came without an operating system.
In fact, but it did have Fortran, which really changed the world.
It suddenly made it easy to write programs. But the way Fortran came from IBM, it came with a thing called the Fortran Stop Book.
This was a list of what happened, a diagnostic would execute the halt instruction, the operator would go read the panel lights and discover where the machine had stopped, you would then go look up in the stop book what that meant.
Bell Labs, with George Mealy and Glenn Hanson, made an operating system, and one of the things they did was to bring the stop book to heel. They took the compiler, replaced all the stop instructions with jumps to somewhere, and allowed the program instead of stopping to go on to the next trial.
By the time I arrived at Bell Labs in 1958, this thing was running nicely.</p>
<p class=pp><span style="font-size: 0.7em;">16:36</span>
Bell Labs continued to be a major player in operating systems.
This was called BESYS. BE was the share abbreviation for Bell Labs. Each company that belonged to Share, which was the IBM users group, ahd a two letter abbreviation. It's hard to imagine taking all the computer users now and giving them a two-letter abbreviation. BESYS went through many generations, up to BESYS 5, I believe. Each one with innovations. IBM delivered a machine, the 7090, in 1960. This machine had interrupts in it, but IBM didn't use them. But BESYS did. And that sent IBM back to the drawing board to make it work. [Laughter]</p>
<p class=pp><span style="font-size: 0.7em;">17:48</span>
Rob Pike: It also didn't have memory protection.</p>
<p class=pp>Doug: It didn't have memory protection either, and a lot of people actually got IBM to put memory protection in the 7090, so that one could leave the operating system resident in the presence of a wild program, an idea that the PC didn't discover until, last year or something like that. [laughter]</p>
<p class=pp>Big players then, <a href="http://en.wikipedia.org/wiki/Richard_Hamming">Dick Hamming</a>, a name that I'm sure everybody knows,
was sort of the numerical analysis guru, and a seer.
He liked to make outrageous predictions. He predicted in 1960, that half of Bell Labs was going to be busy doing something with computers eventually.
?...? exaggerating some ?...? abstract in his thought.
He was wrong.
Half was a gross underestimate. Dick Hamming retired twenty years ago, and just this June he completed his full twenty years term in the Navy, which entitles him again to retire from the Naval Postgraduate Institute in Monterey. Stibitz, incidentally died, I think within the last year.
He was doing medical instrumentation at Dartmouth essentially, near the end.</p>
<p class=pp><span style="font-size: 0.7em;">20:00</span>
Various problems intrigued, besides the numerical problems, which in fact were stock in trade, and were the real justification for buying machines, until at least the '70s I would say. But some non-numerical problems had begun to tickle the palette of the math department. Even G A Campbell got interested in graph theory, the reason being he wanted to think of all the possible ways you could take the three wires and the various parts of the telephone and connect them together, and try permutations to see what you could do about reducing side ?...? by putting things into the various parts of the circuit, and devised every possibly way of connecting the telephone up. And that was sort of the beginning of combinatorics at Bell Labs. John Reardon, a mathematician parlayed this into a major subject. Two problems which are now deemed as computing problems, have intrigued the math department for a very long time, and those are the minimum spanning tree problem, and the wonderfully ?comment about Joe Kruskal, laughter?</p>
<p class=pp><span style="font-size: 0.7em;">21:50</span>
And in the 50s Bob Prim and Kruskal, who I don't think worked on the Labs at that point, invented algorithms for the minimum spanning tree. Somehow or other, computer scientists usually learn these algorithms, one of the two at least, as Dijkstra's algorithm, but he was a latecomer.</p>
<p class=pp>Another pet was the traveling salesman. There's been a long list of people at Bell Labs who played with that: Shen Lin and Ron Graham and David Johnson and dozens more, oh and ?...?. And then another problem is the Steiner minimum spanning tree, where you're allowed to add points to the graph. Every one of these problems grew, actually had a justification in telephone billing. One jurisdiction or another would specify that the way you bill for a private line network was in one jurisdiction by the minimum spanning tree. In another jurisdiction, by the traveling salesman route. NP-completeness wasn't a word in the vocabulary of ?...? [laughter]. And the <a href="http://en.wikipedia.org/wiki/Steiner_tree">Steiner problem</a> came up because customers discovered they could beat the system by inventing offices in the middle of Tennessee that had nothing to do with their business, but they could put the office at a Steiner point and reduce their phone bill by adding to what the service that the Bell System had to give them. So all of these problems actually had some justification in billing besides the fun.</p>
<p class=pp><span style="font-size: 0.7em;">24:15</span>
Come the 60s, we actually started to hire people for computing per se. I was perhaps the third person who was hired with a Ph.D. to help take care of the computers and I'm told that the then director and head of the math department, Hendrick Bode, had said to his people, "yeah, you can hire this guy, instead of a real mathematician, but what's he gonna be doing in five years?" [laughter]</p>
<p class=pp><span style="font-size: 0.7em;">25:02</span>
Nevertheless, we started hiring for real in about '67. Computer science got split off from the math department. I had the good fortune to move into the office that I've been in ever since then. Computing began to make, get a personality of its own. One of the interesting people that came to Bell Labs for a while was Hao Wang. Is his name well known? [Pause] One nod. Hao Wang was a philosopher and logician, and we got a letter from him in England out of the blue saying "hey you know, can I come and use your computers? I have an idea about theorem proving." There was theorem proving in the air in the late 50s, and it was mostly pretty thin stuff. Obvious that the methods being proposed wouldn't possibly do anything more difficult than solve tic-tac-toe problems by enumeration. Wang had a notion that he could mechanically prove theorems in the style of Whitehead and Russell's great treatise Principia Mathematica in the early patr of the century. He came here, learned how to program in machine language, and took all of Volume I of Principia Mathematica --
if you've ever hefted Principia, well that's about all it's good for, it's a real good door stop. It's really big. But it's theorem after theorem after theorem in propositional calculus. Of course, there's a decision procedure for propositional calculus, but he was proving them more in the style of Whitehead and Russell. And when he finally got them all coded and put them into the computer, he proved the entire contents of this immense book in eight minutes.
This was actually a neat accomplishment. Also that was the beginning of all the language theory. We hired people like <a href="http://www1.cs.columbia.edu/~aho/">Al Aho</a> and <a href="http://infolab.stanford.edu/~ullman/">Jeff Ullman</a>, who probed around every possible model of grammars, syntax, and all of the things that are now in the standard undergraduate curriculum, were pretty well nailed down here, on syntax and finite state machines and so on were pretty well nailed down in the 60s. Speaking of finite state machines, in the 50s, both Mealy and Moore, who have two of the well-known models of finite state machines, were here.</p>
<p class=pp><span style="font-size: 0.7em;">28:40</span>
During the 60s, we undertook an enormous development project in the guise of research, which was <a href="http://www.multicians.org/">MULTICS</a>, and it was the notion of MULTICS was computing was the public utility of the future. Machines were very expensive, and ?indeed? like you don't own your own electric generator, you rely on the power company to do generation for you, and it was seen that this was a good way to do computing -- time sharing -- and it was also recognized that shared data was a very good thing. MIT pioneered this and Bell Labs joined in on the MULTICS project, and this occupied five years of system programming effort, until Bell Labs pulled out, because it turned out that MULTICS was too ambitious for the hardware at the time, and also with 80 people on it was not exactly a research project. But, that led to various people who were on the project, in particular <a href="http://en.wikipedia.org/wiki/Ken_Thompson">Ken Thompson</a> -- right there -- to think about how to -- <a href="http://netlib.bell-labs.com/who/dmr/">Dennis Ritchie</a> and Rudd Canaday were in on this too -- to think about how you might make a pleasant operating system with a little less resources.</p>
<p class=pp><span style="font-size: 0.7em;">30:30</span>
And Ken found -- this is a story that's often been told, so I won't go into very much of unix -- Ken found an old machine cast off in the corner, the <a href="http://en.wikipedia.org/wiki/GE-600_series">PDP-7</a>, and put up this little operating system on it, and we had immense <a href="http://en.wikipedia.org/wiki/GE-600_series">GE635</a> available at the comp center at the time, and I remember as the department head, muscling in to use this little computer to be, to get to be Unix's first user, customer, because it was so much pleasanter to use this tiny machine than it was to use the big and capable machine in the comp center. And of course the rest of the story is known to everybody and has affected all college campuses in the country.</p>
<p class=pp><span style="font-size: 0.7em;">31:33</span>
Along with the operating system work, there was a fair amount of language work done at Bell Labs. Often curious off-beat languages. One of my favorites was called <a href="http://hopl.murdoch.edu.au/showlanguage.prx?exp=6937&language=BLODI-B">Blodi</a>, B L O D I, a block diagram compiler by Kelly and Vyssotsky. Perhaps the most interesting early uses of computers in the sense of being unexpected, were those that came from the acoustics research department, and what the Blodi compiler was invented in the acoustic research department for doing digital simulations of sample data system. DSPs are classic sample data systems,
where instead of passing analog signals around, you pass around streams of numerical values. And Blodi allowed you to say here's a delay unit, here's an amplifier, here's an adder, the standard piece parts for a sample data system, and each one was described on a card, and with description of what it's wired to. It was then compiled into one enormous single straight line loop for one time step. Of course, you had to rearrange the code because some one part of the sample data system would feed another and produce really very efficient 7090 code for simulating sample data systems.
By in large, from that time forth, the acoustic department stopped making hardware. It was much easier to do signal processing digitally than previous ways that had been analog. Blodi had an interesting property. It was the only programming language I know where -- this is not my original observation, Vyssotsky said -- where you could take the deck of cards, throw it up the stairs, and pick them up at the bottom of the stairs, feed them into the computer again, and get the same program out. Blodi had two, aside from syntax diagnostics, it did have one diagnostic when it would fail to compile, and that was "somewhere in your system is a loop that consists of all delays or has no delays" and you can imagine how they handled that.</p>
<p class=pp><span style="font-size: 0.7em;">35:09</span>
Another interesting programming language of the 60s was <a href="http://www.knowltonmosaics.com/">Ken Knowlten</a>'s <a href="http://beflix.com/beflix.php">Beflix</a>. This was for making movies on something with resolution kind of comparable to 640x480, really coarse, and the
programming notion in here was bugs. You put on your grid a bunch of bugs, and each bug carried along some data as baggage,
and then you would do things like cellular automata operations. You could program it or you could kind of let it go by itself. If a red bug is next to a blue bug then it turns into a green bug on the following step and so on. <span style="font-size: 0.7em;">36:28</span> He and Lillian Schwartz made some interesting abstract movies at the time. It also did some interesting picture processing. One wonderful picture of a reclining nude, something about the size of that blackboard over there, all made of pixels about a half inch high each with a different little picture in it, picked out for their density, and so if you looked at it close up it consisted of pickaxes and candles and dogs, and if you looked at it far enough away, it was a <a href="http://blog.the-eg.com/2007/12/03/ken-knowlton-mosaics/">reclining nude</a>. That picture got a lot of play all around the country.</p>
<p class=pp>Lorinda Cherry: That was with Leon, wasn't it? That was with <a href="http://design.osu.edu/carlson/history/lesson4.html#bell">Leon Harmon</a>.</p>
<p class=pp>Doug: Was that Harmon?</p>
<p class=pp>Lorinda: ?...?</p>
<p class=pp>Doug: Harmon was also an interesting character. He did more things than pictures. I'm glad you reminded me of him. I had him written down here. Harmon was a guy who among other things did a block diagram compiler for writing a handwriting recognition program. I never did understand how his scheme worked, and in fact I guess it didn't work too well. [laughter]
It didn't do any production ?things? but it was an absolutely
immense sample data circuit for doing handwriting recognition.
Harmon's most famous work was trying to estimate the information content in a face. And every one of these pictures which are a cliche now, that show a face digitized very coarsely, go back to Harmon's <a href="http://www.doubletakeimages.com/history.htm">first psychological experiments</a>, when he tried to find out how many bits of picture he needed to try to make a face recognizable. He went around and digitized about 256 faces from Bell Labs and did real psychological experiments asking which faces could be distinguished from other ones. I had the good fortune to have one of the most distinguishable faces, and consequently you'll find me in freshman psychology texts through no fault of my own.</p>
<p class=pp><span style="font-size: 0.7em;">39:15</span>
Another thing going on the 60s was the halting beginning here of interactive computing. And again the credit has to go to the acoustics research department, for good and sufficient reason. They wanted to be able to feed signals into the machine, and look at them, and get them back out. They bought yet another weird architecture machine called the <a href="http://www.piercefuller.com/library/pb250.html">Packard Bell 250</a>, where the memory elements were <a href="http://en.wikipedia.org/wiki/Delay_line_memory">mercury delay lines</a>.</p>
<p class=pp>Question: Packard Bell?</p>
<p class=pp>Doug: Packard Bell, same one that makes PCs today.</p>
<p class=pp><span style="font-size: 0.7em;">40:10</span>
They hung this off of the comp center 7090 and put in a scheme for quickly shipping jobs into the job stream on the 7090. The Packard Bell was the real-time terminal that you could play with and repair stuff, ?...? off the 7090, get it back, and then you could play it. From that grew some graphics machines also, built by ?...? et al. And it was one of the old graphics machines
in fact that Ken picked up to build Unix on.</p>
<p class=pp><span style="font-size: 0.7em;">40:55</span>
Another thing that went on in the acoustics department was synthetic speech and music. <a href="http://csounds.com/mathews/index.html">Max Mathews</a>, who was the the director of the department has long been interested in computer music. In fact since retirement he spent a lot of time with Pierre Boulez in Paris at a wonderful institute with lots of money simply for making synthetic music. He had a language called Music 5. Synthetic speech or, well first of all simply speech processing was pioneered particularly by <a href="http://en.wikipedia.org/wiki/John_Larry_Kelly,_Jr">John Kelly</a>. I remember my first contact with speech processing. It was customary for computer operators, for the benefit of computer operators, to put a loudspeaker on the low bit of some register on the machine, and normally the operator would just hear kind of white noise. But if you got into a loop, suddenly the machine would scream, and this signal could be used to the operator "oh the machines in a loop. Go stop it and go on to the next job." I remember feeding them an Ackermann's function routine once. [laughter] They were right. It was a silly loop. But anyway. One day, the operators were ?...?. The machine started singing. Out of the blue. “Help! I'm caught in a loop.”. [laughter] And in a broad Texas accent, which was the recorded voice of John Kelly.</p>
<p class=pp><span style="font-size: 0.7em;">43:14</span>
However. From there Kelly went on to do some speech synthesis. Of course there's been a lot more speech synthesis work done since, by <span style="font-size: 0.7em;">43:31</span> folks like Cecil Coker, Joe Olive. But they produced a record, which unfortunately I can't play because records are not modern anymore. And everybody got one in the Bell Labs Record, which is a magazine, contained once a record from the acoustics department, with both speech and music and one very famous combination where the computer played and sang "A Bicycle Built For Two".</p>
<p class=pp>?...?</p>
<p class=pp><span style="font-size: 0.7em;">44:32</span>
At the same time as all this stuff is going on here, needless
to say computing is going on in the rest of the Labs. it was about early 1960 when the math department lost its monopoly on computing machines and other people started buying them too, but for switching. The first experiments with switching computers were operational in around 1960. They were planned for several years prior to that; essentially as soon as the transistor was invented, the making of electronic rather than electromechanical switching machines was anticipated. Part of the saga of the switching machines is cheap memory. These machines had enormous memories -- thousands of words. [laughter] And it was said that the present worth of each word of memory that programmers saved across the Bell System was something like eleven dollars, as I recall. And it was worthwhile to struggle to save some memory. Also, programs were permanent. You were going to load up the switching machine with switching program and that was going to run. You didn't change it every minute or two. And it would be cheaper to put it in read only memory than in core memory. And there was a whole series of wild read-only memories, both tried and built.
The first experimental Essex System had a thing called the flying spot store
which was large photographic plates with bits on them and CRTs projecting on the plates and you would detect underneath on the photodetector whether the bit was set or not. That was the program store of Essex. The program store of the first ESS systems consisted of twistors, which I actually am not sure I understand to this day, but they consist of iron wire with a copper wire wrapped around them and vice versa. There were also experiments with an IC type memory called the waffle iron. Then there was a period when magnetic bubbles were all the rage. As far as I know, although microelectronics made a lot of memory, most of the memory work at Bell Labs has not had much effect on ?...?. Nice tries though.</p>
<p class=pp><span style="font-size: 0.7em;">48:28</span>
Another thing that folks began to work on was the application of (and of course, right from the start) computers to data processing. When you owned equipment scattered through every street in the country, and you have a hundred million customers, and you have bills for a hundred million transactions a day, there's really some big data processing going on. And indeed in the early 60s, AT&T was thinking of making its own data processing computers solely for billing. Somehow they pulled out of that, and gave all the technology to IBM, and one piece of that technology went into use in high end equipment called tractor tapes. Inch wide magnetic tapes that would be used for a while.</p>
<p class=pp><span style="font-size: 0.7em;">49:50</span>
By in large, although Bell Labs has participated until fairly recently in data processing in quite a big way, AT&T never really quite trusted the Labs to do it right because here is where the money is. I can recall one occasion when during strike of temporary employees, a fill-in employee like from the
Laboratories and so on, lost a day's billing tape in Chicago. And that was a million dollars. And that's generally speaking the money people did not until fairly recently trust Bell Labs to take good care of money, even though they trusted the Labs very well to make extremely reliable computing equipment for switches.
The downtime on switches is still spectacular by any industry standards. The design for the first ones was two hours down in 40 years, and the design was met. Great emphasis on reliability and redundancy, testing.</p>
<p class=pp><span style="font-size: 0.7em;">51:35</span>
Another branch of computing was for the government. The whole Whippany Laboratories [time check]
Whippany, where we took on contracts for the government particularly in the computing era in anti-missile defense, missile defense, and underwater sound. Missile defense was a very impressive undertaking. It was about in the early '63 time frame when it was estimated the amount of computation to do a reasonable job of tracking incoming missiles would be 30 M floating point operations a second. In the day of the Cray that doesn't sound like a great lot, but it's more than your high end PCs can do. And the machines were supposed to be reliable. They designed the machines at Whippany, a twelve-processor multiprocessor, to no specs, enormously rugged, one watt transistors. This thing in real life performed remarkably well. There were sixty-five missile shots, tests across the Pacific Ocean ?...? and Lorinda Cherry here actually sat there waiting for them to come in. [laughter] And only a half dozen of them really failed. As a measure of the interest in reliability, one of them failed apparently due to processor error. Two people were assigned to look at the dumps, enormous amounts of telemetry and logging information were taken during these tests, which are truly expensive to run. Two people were assigned to look at the dumps. A year later they had not found the trouble. The team was beefed up. They finally decided that there was a race condition in one circuit. They then realized that this particular kind of race condition had not been tested for in all the simulations. They went back and simulated the entire hardware system to see if its a remote possibility of any similar cases, found twelve of them, and changed the hardware. But to spend over a year looking for a bug is a sign of what reliability meant.</p>
<p class=pp><span style="font-size: 0.7em;">54:56</span>
Since I'm coming up on the end of an hour, one could go on and on and on,</p>
<p class=pp>Crowd: go on, go on. [laughter]</p>
<p class=pp><span style="font-size: 0.7em;">55:10</span>
Doug: I think I'd like to end up by mentioning a few of the programs that have been written at Bell Labs that I think are most surprising. Of course there are lots of grand programs that have been written.</p>
<p class=pp>I already mentioned the block diagram compiler.</p>
<p class=pp>Another really remarkable piece of work was <a href="http://cm.bell-labs.com/cm/cs/doc/74/eqn.ps.gz">eqn</a>, the equation
typesetting language, which has been imitated since, by Lorinda Cherry and Brian Kernighan. The notion of taking an auditory syntax, the way people talk about equations, but only talk, this was not borrowed from any written notation before, getting the auditory one down on paper, that was very successful and surprising.</p>
<p class=pp>Another of my favorites, and again Lorinda Cherry was in this one, with Bob Morris, was typo. This was a program for finding spelling errors. It didn't know the first thing about spelling. It would read a document, measure its statistics, and print out the words of the document in increasing order of what it thought the likelihood of that word having come from the same statistical source as the document. The words that did not come from the statistical source of the document were likely to be typos, and now I mean typos as distinct from spelling errors, where you actually hit the wrong key. Those tend to be off the wall, whereas phonetic spelling errors you'll never find. And this worked remarkably well. Typing errors would come right up to the top of the list. A really really neat program.</p>
<p class=pp><span style="font-size: 0.7em;">57:50</span>
Another one of my favorites was by Brenda Baker called <a href="http://doi.acm.org/10.1145/800168.811545">struct</a>, which took Fortran programs and converted them into a structured programming language called Ratfor, which was Fortran with C syntax. This seemed like a possible undertaking, like something you do by the seat of the pants and you get something out. In fact, folks at Lockheed had done things like that before. But Brenda managed to find theorems that said there's really only one form, there's a canonical form into which you can structure a Fortran program, and she did this. It took your Fortran program, completely mashed it, put it out perhaps in almost certainly a different order than it was in Fortran connected by GOTOs, without any GOTOs, and the really remarkable thing was that authors of the program who clearly knew the way they wrote it in the first place, preferred it after it had been rearranged by Brendan. I was astonished at the outcome of that project.</p>
<p class=pp><span style="font-size: 0.7em;">59:19</span>
Another first that happened around here was by Fred Grampp, who got interested in computer security. One day he decided he would make a program for sniffing the security arrangements on a computer, as a service: Fred would never do anything crooked. [laughter] This particular program did a remarkable job, and founded a whole minor industry within the company. A department was set up to take this idea and parlay it, and indeed ever since there has been some improvement in the way computer centers are managed, at least until we got Berkeley Unix.</p>
<p class=pp><span style="font-size: 0.7em;">60:24</span>
And the last interesting program that I have time to mention is one by <a href="http://research.microsoft.com/users/church/">Ken Church</a>. He was dealing with -- text processing has always been a continuing ?...? of the research, and in some sense it has an application to our business because we're handling speech, but he got into consulting with the department in North Carolina that has to translate manuals. There are millions of pages of manuals in the Bell System and its successors, and ever since we've gone global, these things had to get translated into many languages.</p>
<p class=pp><span style="font-size: 0.7em;">61:28</span>
To help in this, he was making tools which would put up on the screen, graphed on the screen quickly a piece of text and its translation, because a translator, particularly a technical translator, wants to know, the last time we mentioned this word how was it translated. You don't want to be creative in translating technical text. You'd like to be able to go back into the archives and pull up examples of translated text. And the neat thing here is the idea for how do you align texts in two languages. You've got the original, you've got the translated one, how do you bring up on the screen, the two sentences that go together? And the following scam worked beautifully. This is on western languages. <span style="font-size: 0.7em;">62:33</span>
Simply look for common four letter tetragrams, four letter combinations between the two and as best as you can, line them up as nearly linearly with the lengths of the two types as possible. And this <a href="http://acl.ldc.upenn.edu/W/W93/W93-0301.pdf">very simple idea</a> works like storm. Something for nothing. I like that.</p>
<p class=pp><span style="font-size: 0.7em;">63:10</span>
The last thing is one slogan that sort of got started with Unix and is just rife within the industry now. Software tools. We were making software tools in Unix before we knew we were, just like the Molière character was amazed at discovering he'd been speaking prose all his life. [laughter] But then <a href="http://www.amazon.com/-/dp/020103669X">Kernighan and Plauger</a> came along and christened what was going on, making simple generally useful and compositional programs to do one thing and do it well and to fit together. They called it software tools, made a book, wrote a book, and this notion now is abroad in the industry. And it really did begin all up in the little attic room where you [points?] sat for many years writing up here.</p>
<p class=pp> Oh I forgot to. I haven't used any slides. I've brought some, but I don't like looking at bullets and you wouldn't either, and I forgot to show you the one exhibit I brought, which I borrowed from Bob Kurshan. When Bell Labs was founded, it had of course some calculating machines, and it had one wonderful computer. This. That was bought in 1918. There's almost no other computing equipment from any time prior to ten years ago that still exists in Bell Labs. This is an <a href="http://infolab.stanford.edu/pub/voy/museum/pictures/display/2-5-Mechanical.html">integraph</a>. It has two styluses. You trace a curve on a piece of paper with one stylus and the other stylus draws the indefinite integral here. There was somebody in the math department who gave this service to the whole company, with about 24 hours turnaround time, calculating integrals. Our recent vice president Arno Penzias actually did, he calculated integrals differently, with a different background. He had a chemical balance, and he cut the curves out of the paper and weighed them. This was bought in 1918, so it's eighty years old. It used to be shiny metal, it's a little bit rusty now. But it still works.</p>
<p class=pp><span style="font-size: 0.7em;">66:30</span>
Well, that's a once over lightly of a whole lot of things that have gone on at Bell Labs. It's just such a fun place that one I said I just could go on and on. If you're interested, there actually is a history written. This is only one of about six volumes, <a href="http://www.amazon.com/gp/product/0932764061">this</a> is the one that has the mathematical computer sciences, the kind of things that I've mostly talked about here. A few people have copies of them. For some reason, the AT&T publishing house thinks that because they're history they're obsolete, and they stopped printing them. [laughter]</p>
<p class=pp>Thank you, and that's all.</p></p>
+
+
+ Using Uninitialized Memory for Fun and Profit
+ tag:research.swtch.com,2012:research.swtch.com/sparse
+
+ 2008-03-14T00:00:00-04:00
+ 2008-03-14T00:00:00-04:00
+ An unusual but very useful data structure
+
<p><p class=lp>
This is the story of a clever trick that's been around for
at least 35 years, in which array values can be left
uninitialized and then read during normal operations,
yet the code behaves correctly no matter what garbage
is sitting in the array.
Like the best programming tricks, this one is the right tool for the
job in certain situations.
The sleaziness of uninitialized data
access is offset by performance improvements:
some important operations change from linear
to constant time.
</p>
<p class=pp>
Alfred Aho, John Hopcroft, and Jeffrey Ullman's 1974 book
<i>The Design and Analysis of Computer Algorithms</i>
hints at the trick in an exercise (Chapter 2, exercise 2.12):
</p>
<blockquote>
Develop a technique to initialize an entry of a matrix to zero
the first time it is accessed, thereby eliminating the <i>O</i>(||<i>V</i>||<sup>2</sup>) time
to initialize an adjacency matrix.
</blockquote>
<p class=lp>
Jon Bentley's 1986 book <a href="http://www.cs.bell-labs.com/cm/cs/pearls/"><i>Programming Pearls</i></a> expands
on the exercise (Column 1, exercise 8; <a href="http://www.cs.bell-labs.com/cm/cs/pearls/sec016.html">exercise 9</a> in the Second Edition):
</p>
<blockquote>
One problem with trading more space for less time is that
initializing the space can itself take a great deal of time.
Show how to circumvent this problem by designing a technique
to initialize an entry of a vector to zero the first time it is
accessed. Your scheme should use constant time for initialization
and each vector access; you may use extra space proportional
to the size of the vector. Because this method reduces
initialization time by using even more space, it should be
considered only when space is cheap, time is dear, and
the vector is sparse.
</blockquote>
<p class=lp>
Aho, Hopcroft, and Ullman's exercise talks about a matrix and
Bentley's exercise talks about a vector, but for now let's consider
just a simple set of integers.
</p>
<p class=pp>
One popular representation of a set of <i>n</i> integers ranging
from 0 to <i>m</i> is a bit vector, with 1 bits at the
positions corresponding to the integers in the set.
Adding a new integer to the set, removing an integer
from the set, and checking whether a particular integer
is in the set are all very fast constant-time operations
(just a few bit operations each).
Unfortunately, two important operations are slow:
iterating over all the elements in the set
takes time <i>O</i>(<i>m</i>), as does clearing the set.
If the common case is that
<i>m</i> is much larger than <i>n</i>
(that is, the set is only sparsely
populated) and iterating or clearing the set
happens frequently, then it could be better to
use a representation that makes those operations
more efficient. That's where the trick comes in.
</p>
<p class=pp>
Preston Briggs and Linda Torczon's 1993 paper,
“<a href="http://citeseer.ist.psu.edu/briggs93efficient.html"><b>An Efficient Representation for Sparse Sets</b></a>,”
describes the trick in detail.
Their solution represents the sparse set using an integer
array named <code>dense</code> and an integer <code>n</code>
that counts the number of elements in <code>dense</code>.
The <i>dense</i> array is simply a packed list of the elements in the
set, stored in order of insertion.
If the set contains the elements 5, 1, and 4, then <code>n = 3</code> and
<code>dense[0] = 5</code>, <code>dense[1] = 1</code>, <code>dense[2] = 4</code>:
</p>
<center>
<img src="/sparse0.png" />
</center>
<p class=pp>
Together <code>n</code> and <code>dense</code> are
enough information to reconstruct the set, but this representation
is not very fast.
To make it fast, Briggs and Torczon
add a second array named <code>sparse</code>
which maps integers to their indices in <code>dense</code>.
Continuing the example,
<code>sparse[5] = 0</code>, <code>sparse[1] = 1</code>,
<code>sparse[4] = 2</code>.
Essentially, the set is a pair of arrays that point at
each other:
</p>
<center>
<img src="/sparse0b.png" />
</center>
<p class=pp>
Adding a member to the set requires updating both of these arrays:
</p>
<pre class=indent>
add-member(i):
dense[n] = i
sparse[i] = n
n++
</pre>
<p class=lp>
It's not as efficient as flipping a bit in a bit vector, but it's
still very fast and constant time.
</p>
<p class=pp>
To check whether <code>i</code> is in the set, you verify that
the two arrays point at each other for that element:
</p>
<pre class=indent>
is-member(i):
return sparse[i] < n && dense[sparse[i]] == i
</pre>
<p class=lp>
If <code>i</code> is not in the set, then <i>it doesn't matter what <code>sparse[i]</code> is set to</i>:
either <code>sparse[i]</code>
will be bigger than <code>n</code> or it will point at a value in
<code>dense</code> that doesn't point back at it.
Either way, we're not fooled. For example, suppose <code>sparse</code>
actually looks like:
</p>
<center>
<img src="/sparse1.png" />
</center>
<p class=lp>
<code>Is-member</code> knows to ignore
members of sparse that point past <code>n</code> or that
point at cells in <code>dense</code> that don't point back,
ignoring the grayed out entries:
<center>
<img src="/sparse2.png" />
</center>
<p class=pp>
Notice what just happened:
<code>sparse</code> can have <i>any arbitrary values</i> in
the positions for integers not in the set,
those values actually get used during membership
tests, and yet the membership test behaves correctly!
(This would drive <a href="http://valgrind.org/">valgrind</a> nuts.)
</p>
<p class=pp>
Clearing the set can be done in constant time:
</p>
<pre class=indent>
clear-set():
n = 0
</pre>
<p class=lp>
Zeroing <code>n</code> effectively clears
<code>dense</code> (the code only ever accesses
entries in dense with indices less than <code>n</code>), and
<code>sparse</code> can be uninitialized, so there's no
need to clear out the old values.
</p>
<p class=pp>
This sparse set representation has one more trick up its sleeve:
the <code>dense</code> array allows an
efficient implementation of set iteration.
</p>
<pre class=indent>
iterate():
for(i=0; i<n; i++)
yield dense[i]
</pre>
<p class=pp>
Let's compare the run times of a bit vector
implementation against the sparse set:
</p>
<center>
<table>
<tr>
<td><i>Operation</i>
<td align=center width=10>
<td align=center><i>Bit Vector</i>
<td align=center width=10>
<td align=center><i>Sparse set</i>
</tr>
<tr>
<td>is-member
<td>
<td align=center><i>O</i>(1)
<td>
<td align=center><i>O</i>(1)
</tr>
<tr>
<td>add-member
<td>
<td align=center><i>O</i>(1)
<td>
<td align=center><i>O</i>(1)
</tr>
<tr>
<td>clear-set
<td><td align=center><i>O</i>(<i>m</i>)
<td><td align=center><i>O</i>(1)
</tr>
<tr>
<td>iterate
<td><td align=center><i>O</i>(<i>m</i>)
<td><td align=center><i>O</i>(<i>n</i>)
</tr>
</table>
</center>
<p class=lp>
The sparse set is as fast or faster than bit vectors for
every operation. The only problem is the space cost:
two words replace each bit.
Still, there are times when the speed differences are enough
to balance the added memory cost.
Briggs and Torczon point out that liveness sets used
during register allocation inside a compiler are usually
small and are cleared very frequently, making sparse sets the
representation of choice.
</p>
<p class=pp>
Another situation where sparse sets are the better choice
is work queue-based graph traversal algorithms.
Iteration over sparse sets visits elements
in the order they were inserted (above, 5, 1, 4),
so that new entries inserted during the iteration
will be visited later in the same iteration.
In contrast, iteration over bit vectors visits elements in
integer order (1, 4, 5), so that new elements inserted
during traversal might be missed, requiring repeated
iterations.
</p>
<p class=pp>
Returning to the original exercises, it is trivial to change
the set into a vector (or matrix) by making <code>dense</code>
an array of index-value pairs instead of just indices.
Alternately, one might add the value to the <code>sparse</code>
array or to a new array.
The relative space overhead isn't as bad if you would have been
storing values anyway.
</p>
<p class=pp>
Briggs and Torczon's paper implements additional set
operations and examines performance speedups from
using sparse sets inside a real compiler.
</p></p>
+
+
+ Play Tic-Tac-Toe with Knuth
+ tag:research.swtch.com,2012:research.swtch.com/tictactoe
+
+ 2008-01-25T00:00:00-05:00
+ 2008-01-25T00:00:00-05:00
+ The only winning move is not to play.
+
<p><p class=lp>Section 7.1.2 of the <b><a href="http://www-cs-faculty.stanford.edu/~knuth/taocp.html#vol4">Volume 4 pre-fascicle 0A</a></b> of Donald Knuth's <i>The Art of Computer Programming</i> is titled “Boolean Evaluation.” In it, Knuth considers the construction of a set of nine boolean functions telling the correct next move in an optimal game of tic-tac-toe. In a footnote, Knuth tells this story:</p>
<blockquote><p class=lp>This setup is based on an exhibit from the early 1950s at the Museum of Science and Industry in Chicago, where the author was first introduced to the magic of switching circuits. The machine in Chicago, designed by researchers at Bell Telephone Laboratories, allowed me to go first; yet I soon discovered there was no way to defeat it. Therefore I decided to move as stupidly as possible, hoping that the designers had not anticipated such bizarre behavior. In fact I allowed the machine to reach a position where it had two winning moves; and it seized <i>both</i> of them! Moving twice is of course a flagrant violation of the rules, so I had won a moral victory even though the machine had announced that I had lost.</p></blockquote>
<p class=lp>
That story alone is fairly amusing. But turning the page, the reader finds a quotation from Charles Babbage's <i><a href="http://onlinebooks.library.upenn.edu/webbin/book/lookupid?key=olbp36384">Passages from the Life of a Philosopher</a></i>, published in 1864:</p>
<blockquote><p class=lp>I commenced an examination of a game called “tit-tat-to” ... to ascertain what number of combinations were required for all the possible variety of moves and situations. I found this to be comparatively insignificant. ... A difficulty, however, arose of a novel kind. When the automaton had to move, it might occur that there were two different moves, each equally conducive to his winning the game. ... Unless, also, some provision were made, the machine would attempt two contradictory motions.</p></blockquote>
<p class=lp>
The only real winning move is not to play.</p></p>
+
+
+ Crabs, the bitmap terror!
+ tag:research.swtch.com,2012:research.swtch.com/crabs
+
+ 2008-01-09T00:00:00-05:00
+ 2008-01-09T00:00:00-05:00
+ A destructive, pointless violation of the rules
+
<p><p class=lp>Today, window systems seem as inevitable as hierarchical file systems, a fundamental building block of computer systems. But it wasn't always that way. This paper could only have been written in the beginning, when everything about user interfaces was up for grabs.</p>
<blockquote><p class=lp>A bitmap screen is a graphic universe where windows, cursors and icons live in harmony, cooperating with each other to achieve functionality and esthetics. A lot of effort goes into making this universe consistent, the basic law being that every window is a self contained, protected world. In particular, (1) a window shall not be affected by the internal activities of another window. (2) A window shall not be affected by activities of the window system not concerning it directly, i.e. (2.1) it shall not notice being obscured (partially or totally) by other windows or obscuring (partially or totally) other windows, (2.2) it shall not see the <i>image</i> of the cursor sliding on its surface (it can only ask for its position).</p>
<p class=pp>
Of course it is difficult to resist the temptation to break these rules. Violations can be destructive or non-destructive, useful or pointless. Useful non-destructive violations include programs printing out an image of the screen, or magnifying part of the screen in a <i>lens</i> window. Useful destructive violations are represented by the <i>pen</i> program, which allows one to scribble on the screen. Pointless non-destructive violations include a magnet program, where a moving picture of a magnet attracts the cursor, so that one has to continuously pull away from it to keep working. The first pointless, destructive program we wrote was <i>crabs</i>.</p>
</blockquote>
<p class=lp>As the crabs walk over the screen, they leave gray behind, “erasing” the apps underfoot:</p>
<blockquote><img src="/crabs1.png">
</blockquote>
<p class=lp>
For the rest of the story, see Luca Cardelli's “<a style="font-weight: bold;" href="http://lucacardelli.name/Papers/Crabs.pdf">Crabs: the bitmap terror!</a>” (6.7MB). Additional details in “<a href="http://lucacardelli.name/Papers/Crabs%20%28History%20and%20Screen%20Dumps%29.pdf">Crabs (History and Screen Dumps)</a>” (57.1MB).</p></p>
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_utdelningsseglaren.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_utdelningsseglaren.xml
new file mode 100644
index 000000000..58a518cd4
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_utdelningsseglaren.xml
@@ -0,0 +1,26 @@
+tag:blogger.com,1999:blog-59121094879325213362017-12-13T22:53:57.391+01:00Utdelningsseglaren- Propelled by Dividends Since 2016Utdelningsseglarenhttp://www.blogger.com/profile/14006299737185131908noreply@blogger.comBlogger239125tag:blogger.com,1999:blog-5912109487932521336.post-43841519593786266602017-12-12T18:24:00.002+01:002017-12-12T18:24:53.966+01:00Tips på 6 podcasts<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-F9djqTL3q74/WjAMYBOzXHI/AAAAAAAABSI/Y4v0A4LKUX8UII70pHVMAMgUtzzWLPnXQCLcBGAs/s1600/ho%25CC%2588rlurar.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://3.bp.blogspot.com/-F9djqTL3q74/WjAMYBOzXHI/AAAAAAAABSI/Y4v0A4LKUX8UII70pHVMAMgUtzzWLPnXQCLcBGAs/s320/ho%25CC%2588rlurar.jpg" width="320"></a></div><span style="font-family: arial;"><span style="font-size: 18.24px; white-space: pre-wrap;">Tittar man runt på bloggar och Twitter verkar det just nu trendigt att tipsa om poddar.</span></span><br><span style="font-family: arial;"><span style="font-size: 18.24px; white-space: pre-wrap;"><br></span></span><span style="font-family: arial;"><span style="font-size: 18.24px; white-space: pre-wrap;">Utdelningsseglaren kan förstås inte vara sämre - här kommer därför mina 6 tips på några kända och mindre kända poddar.</span></span><br><a href="http://utdelningsseglaren.blogspot.com/2017/12/tips-pa-6-podcasts.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com7tag:blogger.com,1999:blog-5912109487932521336.post-41509512178411022012017-12-09T19:58:00.001+01:002017-12-12T18:30:57.035+01:00Intervju i Dagens Industri<div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-U_Ge67jrGH4/WiwsDotU9zI/AAAAAAAABRs/1db0CqRakaEfQBuKymwptEFR_HiZXf2ZACLcBGAs/s1600/Fo%25CC%2588rstasidan%2BDI.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1292" data-original-width="1300" height="318" src="https://4.bp.blogspot.com/-U_Ge67jrGH4/WiwsDotU9zI/AAAAAAAABRs/1db0CqRakaEfQBuKymwptEFR_HiZXf2ZACLcBGAs/s320/Fo%25CC%2588rstasidan%2BDI.png" width="320"></a></div><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 18.24px; line-height: 145%; white-space: pre-wrap;">Märks att intresset för aktieinvesteringar och utdelningar är på top - den lite svagare börsutveckling på sistone till trots.</span><br><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 18.24px; line-height: 145%; white-space: pre-wrap;"><br></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 18.24px; line-height: 145%; white-space: pre-wrap;">För några dagar sedan blev jag intervjuad i Dagens Industri angående Seglarportföljen och den snart stundande pensionering.</span><br><a href="http://utdelningsseglaren.blogspot.com/2017/12/intervju-i-dagens-industri.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com12tag:blogger.com,1999:blog-5912109487932521336.post-24866704624048245482017-12-07T20:07:00.001+01:002017-12-07T20:17:18.431+01:00Köp & sälj i Seglarportföljen<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 18.24px; line-height: 145%; white-space: pre-wrap;">Fortsätter göra ändringar i Seglarportföljen inför den stundande <a href="http://utdelningsseglaren.blogspot.se/2017/11/sista-arbetsdagen-blir-19-januari.html" target="_blank"><b>pensioneringen</b></a> - här är senaste transaktionerna.</span><br><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 18.24px; line-height: 145%; white-space: pre-wrap;"><br></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 18.24px; line-height: 145%; white-space: pre-wrap;">Aktuell <a href="http://utdelningsseglaren.blogspot.se/p/portfoljen.html" target="_blank"><b>Seglarportfölj</b></a> kan du som vanligt se genom länken uppe till höger på bloggen.</span><br><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 18.24px; line-height: 145%; white-space: pre-wrap;"><br></span><span style="font-family: "arial";"><span style="font-size: 18.24px; white-space: pre-wrap;">Here we go!</span></span><br><a href="http://utdelningsseglaren.blogspot.com/2017/12/kop-salj-i-seglarportfoljen.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com3tag:blogger.com,1999:blog-5912109487932521336.post-46458268660183127352017-12-05T17:55:00.002+01:002017-12-06T13:56:24.395+01:00Ekonomin inför pension<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-GF6LwuN-erQ/Wia1zz20pbI/AAAAAAAABRc/ulLi5sZe9qIBKdgSyGoBlc6wuawIn7nIACLcBGAs/s1600/freedom.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1440" height="240" src="https://3.bp.blogspot.com/-GF6LwuN-erQ/Wia1zz20pbI/AAAAAAAABRc/ulLi5sZe9qIBKdgSyGoBlc6wuawIn7nIACLcBGAs/s320/freedom.jpg" width="320"></a></div><span style="font-family: "arial";"><span style="font-size: 18.24px; white-space: pre-wrap;">Nu tittar vi på hur min ekonomi ser ut. Frågan är i allra högsta grad aktuell då jag slutar mitt jobb den 19 januari.</span></span><br><span style="font-family: "arial";"><span style="font-size: 18.24px; white-space: pre-wrap;"><br></span></span><span style="font-family: "arial";"><span style="font-size: 18.24px; white-space: pre-wrap;">Istället för att mäta i absoluta belopp redovisar jag det i antal månadskostnader. </span></span><br><a href="http://utdelningsseglaren.blogspot.com/2017/12/ekonomin-infor-pension.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com7tag:blogger.com,1999:blog-5912109487932521336.post-68568095669949257812017-12-03T17:13:00.000+01:002017-12-03T17:55:55.865+01:00Belåningen i Seglarportföljen<div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-xnKP9d-QhaU/WiQelYTiHEI/AAAAAAAABQ4/xPTKVuGO_rwh-7cR_xTjEfH043NEbR_igCLcBGAs/s1600/va%25CC%258Ag.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="789" data-original-width="1280" height="197" src="https://4.bp.blogspot.com/-xnKP9d-QhaU/WiQelYTiHEI/AAAAAAAABQ4/xPTKVuGO_rwh-7cR_xTjEfH043NEbR_igCLcBGAs/s320/va%25CC%258Ag.png" width="320"></a></div><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Belåningen av Seglarportföljen ligger just nu temporärt strax över 10% vilket jag har för avsikt att justera ned något under december månad.</span><br><a href="http://utdelningsseglaren.blogspot.com/2017/12/belaningen-i-seglarportfoljen.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com8tag:blogger.com,1999:blog-5912109487932521336.post-86002920399255882162017-11-30T20:15:00.000+01:002017-11-30T23:57:07.524+01:00Sista arbetsdagen blir 19 januari<div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-svZXtpgH8dc/WiBRsRUwBvI/AAAAAAAAAFI/B-RWumqpNwow1sr_gjdexNhMBQ_1f2GnwCLcBGAs/s1600/frihet.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="853" data-original-width="1280" height="213" src="https://2.bp.blogspot.com/-svZXtpgH8dc/WiBRsRUwBvI/AAAAAAAAAFI/B-RWumqpNwow1sr_gjdexNhMBQ_1f2GnwCLcBGAs/s320/frihet.jpg" width="320"></a></div><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Idag har jag sagt upp mitt rullande konsultuppdrag utan att ha något annat jobb inbokat.</span><br><a href="http://utdelningsseglaren.blogspot.com/2017/11/sista-arbetsdagen-blir-19-januari.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/14006299737185131908noreply@blogger.com45tag:blogger.com,1999:blog-5912109487932521336.post-50895360684925941232017-11-17T20:25:00.000+01:002017-11-17T21:46:47.584+01:00Köp & sälj i Seglarportföljen<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-jTlRu44oQHA/Wg81ubVx4hI/AAAAAAAABP8/buiFMAz9Ed0R7yQ1R5aOeDH9MZ-TBwK8wCLcBGAs/s1600/bo%25CC%2588rsen.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="690" data-original-width="1260" height="175" src="https://3.bp.blogspot.com/-jTlRu44oQHA/Wg81ubVx4hI/AAAAAAAABP8/buiFMAz9Ed0R7yQ1R5aOeDH9MZ-TBwK8wCLcBGAs/s320/bo%25CC%2588rsen.jpeg" width="320"></a></div><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Nyligen tillbaka från en semestervecka i Portugal med sambon. Underbart väder där nu med runt 18 - 20 grader på dagarna men ganska mycket kallare på kvällar och nätter. Får återkomma med separat inlägg kring det.</span><br><a href="http://utdelningsseglaren.blogspot.com/2017/11/kop-salj-i-seglarportfoljen.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com11tag:blogger.com,1999:blog-5912109487932521336.post-13921241456717317542017-11-15T14:06:00.000+01:002017-11-15T19:59:24.828+01:00Bolån med 1,29% i ränta<div class="separator" style="clear: both; text-align: left;"><span style="background-color: white; color: #333333; font-family: "arial"; font-size: xx-small; white-space: pre-wrap;">Inlägget innehåller </span><a href="http://utdelningsseglaren.blogspot.se/p/affilate.html" style="background-color: white; color: #0101d8; font-family: arial; font-size: x-small; text-decoration-line: none; white-space: pre-wrap;" target="_blank">affiliatelänkar</a></div><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;"><br></span><br><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-1tcIWm2-E5s/WgwzCR6YaUI/AAAAAAAABPg/UzjZg7D1qg0wSES1F_8THKCD-bS-TV5dACEwYBhgL/s1600/bola%25CC%258Anera%25CC%2588ntor.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="439" data-original-width="649" height="216" src="https://3.bp.blogspot.com/-1tcIWm2-E5s/WgwzCR6YaUI/AAAAAAAABPg/UzjZg7D1qg0wSES1F_8THKCD-bS-TV5dACEwYBhgL/s320/bola%25CC%258Anera%25CC%2588ntor.png" width="320"></a></div><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Igår kom <a href="https://www.di.se/nyheter/avanza-smyger-ut-bolan/" target="_blank">nyheten</a> att Avanza lanserar bolån med låg ränta för den stora massan.</span><br><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;"><br></span><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Det är inte riktigt lika bra deal som för oss med private banking med 0,79% men med en rörlig 3-månaders ränta om 1,29% har de nog stora möjligheter att få många nya kunder på detta. </span><br><a href="http://utdelningsseglaren.blogspot.com/2017/11/bolan-med-129-i-ranta.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com12tag:blogger.com,1999:blog-5912109487932521336.post-5999841939477352552017-11-07T21:34:00.000+01:002017-11-08T10:05:28.564+01:00Kostnader för courtage<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-cnX4Y0d3BAM/WgIXby8m-II/AAAAAAAABOY/OFuExwqLPhg0puY-osmViVI73__8RHIrACLcBGAs/s1600/kostnad.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="640" data-original-width="960" height="213" src="https://3.bp.blogspot.com/-cnX4Y0d3BAM/WgIXby8m-II/AAAAAAAABOY/OFuExwqLPhg0puY-osmViVI73__8RHIrACLcBGAs/s320/kostnad.jpg" width="320"></a></div><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">När man köper och säljer aktier gäller det ju som bekant att hålla koll så att kostnaderna för courtage inte drar iväg för mycket. </span><br><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;"><br></span><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Efter att nu handlat på börsen under några år tänkte jag att det var dags för en sammanställning.</span><br><a href="http://utdelningsseglaren.blogspot.com/2017/11/kostnader-for-courtage.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com15tag:blogger.com,1999:blog-5912109487932521336.post-79371408325657788402017-11-05T16:33:00.000+01:002017-11-05T16:49:17.264+01:00Portföljmallen kommer här<div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-EA00ylG0pAU/Wf8fvPTRQDI/AAAAAAAABNE/vDZM7nkPcCocivuZ9VxtaGI4OuJJv2buQCLcBGAs/s1600/utdelningskalender.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="379" data-original-width="1059" height="142" src="https://2.bp.blogspot.com/-EA00ylG0pAU/Wf8fvPTRQDI/AAAAAAAABNE/vDZM7nkPcCocivuZ9VxtaGI4OuJJv2buQCLcBGAs/s400/utdelningskalender.png" width="400"></a></div><span style="color: #333333; font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">Har sedan tidigare lovat att dela med mig av min mall för portfölj och utdelningskalender. </span></span><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Den är baserad på Google sheets och går att </span><a href="https://docs.google.com/spreadsheets/d/17P_VTYAH0h9lFJjtrEYkuoFCceGDiYypTLLtqJOgtSo/edit?usp=sharing" style="font-family: arial; font-size: 17.3333px; white-space: pre-wrap;" target="_blank"><b>ladda ner här</b></a><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">.</span><br><a href="http://utdelningsseglaren.blogspot.com/2017/11/portfoljmallen-kommer-har.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com6tag:blogger.com,1999:blog-5912109487932521336.post-26807685135629694692017-10-30T20:12:00.000+01:002017-10-30T21:52:49.741+01:00Lyssna på ljudböcker gratis<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-tRYjaNJp320/WfX4_Mw2yjI/AAAAAAAABMs/5EoWCWJTzOUh7EvF7ktswyOAoY6UpNYSQCEwYBhgL/s1600/biblio.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="797" data-original-width="1431" height="178" src="https://3.bp.blogspot.com/-tRYjaNJp320/WfX4_Mw2yjI/AAAAAAAABMs/5EoWCWJTzOUh7EvF7ktswyOAoY6UpNYSQCEwYBhgL/s320/biblio.png" width="320"></a></div><div style="text-align: left;"><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Känner du till att man från och med i september i år kan lyssna på ljudböcker helt gratis?</span></div><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;"><br></span><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Tänkte väl det - här kommer därför några riktigt bra tips för hur du kan lyssna på ljudböcker utan att betala ett enda öre.</span><br><a href="http://utdelningsseglaren.blogspot.com/2017/10/lyssna-pa-ljudbocker-gratis.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com13tag:blogger.com,1999:blog-5912109487932521336.post-87655127771839394952017-10-28T15:08:00.002+02:002017-10-29T15:51:17.811+01:00Första månaden över 100.000 sidvisningar<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-FWGc-vcx7gQ/WfRz7x1acLI/AAAAAAAABLY/E846FOERdlYGMAj4Yx8jRvR6ZSRY4QDvgCLcBGAs/s1600/webstats2017-10-28.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="189" data-original-width="422" height="143" src="https://3.bp.blogspot.com/-FWGc-vcx7gQ/WfRz7x1acLI/AAAAAAAABLY/E846FOERdlYGMAj4Yx8jRvR6ZSRY4QDvgCLcBGAs/s320/webstats2017-10-28.png" width="320"></a></div><span style="color: #333333; font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">Bloggen fortsätter att utvecklas - både genom fler besökare och att innehållet sakta men säkert expanderar.</span></span><br><a href="http://utdelningsseglaren.blogspot.com/2017/10/forsta-manaden-over-100000-sidvisningar.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com2tag:blogger.com,1999:blog-5912109487932521336.post-52030677198657665472017-10-25T19:45:00.000+02:002017-10-25T22:48:56.604+02:00Var på "Rich Dad Workshop"<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-KymAquCEhzE/WfDLFEXgRiI/AAAAAAAABK8/UYYO7dJXomA9d3lHlh3kmpXjLMxYdyEKQCLcBGAs/s1600/Richdad.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="508" data-original-width="554" height="293" src="https://3.bp.blogspot.com/-KymAquCEhzE/WfDLFEXgRiI/AAAAAAAABK8/UYYO7dJXomA9d3lHlh3kmpXjLMxYdyEKQCLcBGAs/s320/Richdad.png" width="320"></a></div><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Efter att jag under förmiddagen igår såg <a href="https://twitter.com/kapitaletradio/status/922747803306221569" target="_blank"><b>denna tweet</b></a> om att det det var en gratis "Rich Dad Workshop" i stan kollade jag genast upp det på nätet, gjorde en anmälan och närvarande på mötet ett par timmar senare.</span><br><a href="http://utdelningsseglaren.blogspot.com/2017/10/var-pa-rich-dad-workshop.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com4tag:blogger.com,1999:blog-5912109487932521336.post-34761041908513970622017-10-22T18:03:00.000+02:002017-12-03T01:34:29.543+01:00Skydda dig mot ID-kapning<div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-QkdUJhfYi70/WeygEWk22JI/AAAAAAAABKs/pP4lIrb-5CosUBb4nCZtsvjMCZw8GRL6QCLcBGAs/s1600/ha%25CC%2588ngla%25CC%258As.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="638" data-original-width="960" height="212" src="https://1.bp.blogspot.com/-QkdUJhfYi70/WeygEWk22JI/AAAAAAAABKs/pP4lIrb-5CosUBb4nCZtsvjMCZw8GRL6QCLcBGAs/s320/ha%25CC%2588ngla%25CC%258As.jpg" width="320"></a></div><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Känner du oro för vem som kan logga in på ditt konto, läsa din post och ändra din uppgifter hos skatteverket?</span><br><span style="color: #333333; font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;"><br></span></span><span style="color: #333333; font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">Bra att du är orolig - för det borde du vara!</span></span><br><a href="http://utdelningsseglaren.blogspot.com/2017/10/biffa-upp-din-sakerhet.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com16tag:blogger.com,1999:blog-5912109487932521336.post-42150833104852531172017-10-19T16:31:00.000+02:002017-11-30T22:22:25.080+01:00Filmtajm nr 5: Milton Friedman<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-k7xIKkUGJiA/Wd47q7X9RMI/AAAAAAAABJQ/eu-elpvWZVU3jZBBzutTmKgFnTYISGrTQCEwYBhgL/s1600/milton2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="300" data-original-width="225" src="https://4.bp.blogspot.com/-k7xIKkUGJiA/Wd47q7X9RMI/AAAAAAAABJQ/eu-elpvWZVU3jZBBzutTmKgFnTYISGrTQCEwYBhgL/s1600/milton2.jpg"></a></div><a href="https://en.wikipedia.org/wiki/Milton_Friedman" style="font-family: arial; font-size: 17.3333px; white-space: pre-wrap;" target="_blank">Milton Friedman</a><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;"> - Nobelpristagare i ekonomi och kanske en av de mest betydelsefulla ekonomerna de senaste 50 åren. </span><br><br><span style="color: #333333; font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">I filmerna nedan förklarar han de grundläggande teorierna om hur ekonomi, marknader och pengar fungerar.</span></span><br><span style="color: #333333; font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;"><br></span></span><span style="color: #333333; font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">Även om man inte delar hans slutsatser så får man ändå ge honom rätt i att världen i rask takt har rört sig mot mer frihandel, mer kapitalism och mer marknadsekonomi. </span></span><br><a href="http://utdelningsseglaren.blogspot.com/2017/10/filmtajm-nr-5-milton-friedman.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com17tag:blogger.com,1999:blog-5912109487932521336.post-4382001823561484822017-10-17T18:27:00.000+02:002017-10-17T20:31:48.998+02:00Tre ord som gör dig rik<div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-JpNOQkONN4M/WeYvBV5XgTI/AAAAAAAABKY/higNUWa5dQs-Rcrri5d8WYx73dtclalnwCLcBGAs/s1600/funkardetutan.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="637" data-original-width="960" height="212" src="https://4.bp.blogspot.com/-JpNOQkONN4M/WeYvBV5XgTI/AAAAAAAABKY/higNUWa5dQs-Rcrri5d8WYx73dtclalnwCLcBGAs/s320/funkardetutan.jpg" width="320"></a></div><span style="font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">Varje gång du kommer på dig själv med att vilja köpa något ska du </span></span><span style="font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">stanna upp och </span></span><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">fundera på den helt grundläggande frågan: </span><br><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;"><br></span><br><div style="text-align: center;"><span style="font-family: "arial"; font-size: large;"><span style="background-color: white; font-size: x-large; white-space: pre-wrap;"><i>" funkar det utan? "</i></span></span></div><div style="text-align: center;"><br></div><a href="http://utdelningsseglaren.blogspot.com/2017/10/tre-ord-som-gor-dig-rik.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com12tag:blogger.com,1999:blog-5912109487932521336.post-38380625759134459562017-10-15T10:33:00.001+02:002017-10-29T13:36:39.483+01:00Intervjuad i SvD, del 2<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-k5ct39YimH8/WeMRo5mGx9I/AAAAAAAABKE/CXal_u4fFKklpOrg1rvMFOrbd3Dwb4CNACEwYBhgL/s1600/hemligainvesteraren.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="721" data-original-width="849" height="270" src="https://3.bp.blogspot.com/-k5ct39YimH8/WeMRo5mGx9I/AAAAAAAABKE/CXal_u4fFKklpOrg1rvMFOrbd3Dwb4CNACEwYBhgL/s320/hemligainvesteraren.png" width="320"></a></div><span style="font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">Idag kom den egentliga intervjun med mig på SvD. Artikeln heter "Lev på utdelning - hemlige investerarens supertips".</span></span><br><span style="font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;"><br></span></span><span style="font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">Länk till artikeln på <a href="https://www.svd.se/lev-pa-utdelning--hemlige-investerarens-supertips" target="_blank">svd.se</a>.</span></span><br><span style="font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;"><br></span></span><span style="font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">Tyvärr är den också låst bakom betalvägg men har ordnat så att du kan läsa den digitalt <a href="https://drive.google.com/file/d/0B58_wOu_N00zWm5DRDJnMG9uSVk/view?usp=sharing" target="_blank">här</a> (välj att ladda ner).</span></span><br><a href="http://utdelningsseglaren.blogspot.com/2017/10/intervjuad-i-svd-del-2.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com8tag:blogger.com,1999:blog-5912109487932521336.post-74363031636076082032017-10-14T09:25:00.002+02:002017-10-29T13:37:36.689+01:00Intervjuad i SvD<div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-ItL2zWgbns4/WeG5Dj9Sg0I/AAAAAAAABJk/9t-rnOp11I4QaEeAYkD0_Q47J1gb1ArtACLcBGAs/s1600/svd.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="336" data-original-width="735" height="146" src="https://1.bp.blogspot.com/-ItL2zWgbns4/WeG5Dj9Sg0I/AAAAAAAABJk/9t-rnOp11I4QaEeAYkD0_Q47J1gb1ArtACLcBGAs/s320/svd.png" width="320"></a></div><span style="font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">För några veckor sedan blev jag intervjuad av tidningen SvD angående att jag lever på mina utdelningar. </span></span><br><span style="font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;"><br></span></span><span style="font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">Resultatet finns nu i den tryckta tidningen samt på <a href="https://www.svd.se/rakna-pa-enkla-tumregeln--kan-du-bli-ekonomiskt-fri" target="_blank">svd.se</a></span></span><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;"> att läsa. </span><br><a href="http://utdelningsseglaren.blogspot.com/2017/10/intervjuad-i-svd.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com5tag:blogger.com,1999:blog-5912109487932521336.post-23428587203074269112017-10-10T19:16:00.000+02:002017-12-03T02:10:02.635+01:00Investeringsfilosofi<div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-WoLwkv6GLUk/WdzmcCuKNGI/AAAAAAAABI8/MQ0TglvFOdQyBW8dXsKP8W5ZLqAGDRuywCLcBGAs/s1600/buybuysellsell.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="945" data-original-width="1024" height="294" src="https://1.bp.blogspot.com/-WoLwkv6GLUk/WdzmcCuKNGI/AAAAAAAABI8/MQ0TglvFOdQyBW8dXsKP8W5ZLqAGDRuywCLcBGAs/s320/buybuysellsell.jpg" width="320"></a></div><span style="background-color: white; color: #333333; font-family: "arial"; font-size: medium; white-space: pre-wrap;">Här kommer ett försök till investeringsfilosofi i form av en konversation mellan far och son - s</span><span style="background-color: white; color: #333333; font-family: "arial"; font-size: medium; white-space: pre-wrap;">jälvfallet på lagom molnfri höjd.</span><br><a href="http://utdelningsseglaren.blogspot.com/2017/10/min-investeringsfilosofi.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com13tag:blogger.com,1999:blog-5912109487932521336.post-71274507450159366302017-10-08T13:12:00.000+02:002017-12-04T00:06:15.211+01:00Så blir du vinnare på bolånet<div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-stH1aShNDOg/WdoHk8-lBoI/AAAAAAAABIs/_mvbx3RU7Uk84Qa45uoQT8XqV8n5HmutACLcBGAs/s1600/hus.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="635" data-original-width="960" height="211" src="https://4.bp.blogspot.com/-stH1aShNDOg/WdoHk8-lBoI/AAAAAAAABIs/_mvbx3RU7Uk84Qa45uoQT8XqV8n5HmutACLcBGAs/s320/hus.jpg" width="320"></a></div><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Är såå trött på att höra usla rekommendationer från s k sparekonomer som med jämna mellanrum dyker upp i media och tycker att "just nu är det en bra idé att du binder räntan på bolånet". </span><br><a href="http://utdelningsseglaren.blogspot.com/2017/10/sa-blir-du-vinnare-pa-bolanet.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com19tag:blogger.com,1999:blog-5912109487932521336.post-23111958528151687022017-10-02T17:39:00.000+02:002017-10-02T17:55:22.491+02:00Bloggen är köpt?<span style="color: #333333; font-family: "arial";"><span style="background-color: white;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Har varit en del diskussioner om mängden reklam, utvalda samarbeten (affiliates) och sponsrade inlägg hos oss ekonomibloggare. </span></span></span><br><div><span style="color: #333333; font-family: "arial";"><span style="background-color: white;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br></span></span></span></div><div><span style="color: #333333; font-family: "arial";"><span style="background-color: white;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Det är nog en och annan läsare som funderar på följande två frågor:</span></span></span></div><blockquote class="tr_bq"><ul><li><span style="color: #333333; font-family: "arial";"><span style="background-color: white;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Går det att lita på att det man läser är sant, och</span></span></span> </li></ul></blockquote><blockquote class="tr_bq"><ul><li><span style="color: #333333; font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">Hur mycket "reklam" orkar man stå ut med</span></span></li></ul></blockquote><a href="http://utdelningsseglaren.blogspot.com/2017/10/bloggen-ar-kopt.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com15tag:blogger.com,1999:blog-5912109487932521336.post-87045024867974870182017-09-27T15:34:00.003+02:002017-09-27T17:13:31.260+02:00Asymmetriska utgifter<span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Som ni vet har jag redan uppnått mitt långsiktiga sparmål - en stabil utdelningsportfölj som <a href="http://utdelningsseglaren.blogspot.se/2017/02/forsta-kalenderaret-som-finansiellt.html" target="_blank">täcker kostnaderna</a> för det liv jag lever nu. </span><br><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;"><br></span><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Med anledning av detta tillför jag just nu inte några nya pengar till portföljen utan de slantar som kan sparas går istället till bygga buffertar enligt principerna för <a href="https://utdelningsseglaren.blogspot.se/2017/06/slutat-spara.html" target="_blank">Wibblekonto</a>.</span><br><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;"><br></span><span style="color: #333333; font-family: "arial";"><span style="background-color: white; font-size: 17.3333px; white-space: pre-wrap;">Att jag nått mitt sparmål betyder också att jag växlar upp mitt spenderande inom vissa områden. Några exempel på ökat utflöde av pengar under senaste året är: </span></span><br><a href="http://utdelningsseglaren.blogspot.com/2017/09/asymetriska-utgifter.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com7tag:blogger.com,1999:blog-5912109487932521336.post-21308533384836250462017-09-26T22:34:00.000+02:002017-09-26T23:11:06.312+02:00Senaste transaktionerna i Seglarportföljen<span style="background-color: white; color: #333333; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Aktiviteten för att justera portföljen fortgår. Följande transaktioner har genomförts <a href="https://utdelningsseglaren.blogspot.se/2017/08/annu-mer-kop-salj.html" target="_blank">sedan sist</a>.</span><br><a href="http://utdelningsseglaren.blogspot.com/2017/09/senaste-transaktionerna-i.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com3tag:blogger.com,1999:blog-5912109487932521336.post-56364368087274807482017-09-25T15:33:00.000+02:002017-09-25T21:53:21.142+02:00Hur tjänar man pengar på aktiearbitrage?<span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Fick följande fråga på <a href="http://utdelningsseglaren.blogspot.se/2016/12/fixade-fyra-gratisluncher.html" target="_blank">det inlägg</a> där jag beskrev hur jag tjänar pengar på de ständigt varierande prisskillnaderna mellan A- och B-aktier. </span><br><br><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">---klipp----</span><br><span style="background-color: white; font-family: "arial" , "tahoma" , "helvetica" , "freesans" , sans-serif; font-size: 12.6px; text-align: justify;">Hänger inte riktigt med i resonemanget att byta aktier mellan A- och B-slagen. Ta till exempel Investor där skillnaden idag är 2,26%. </span><br><br style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12.6px; text-align: justify;"><span style="background-color: white; font-family: "arial" , "tahoma" , "helvetica" , "freesans" , sans-serif; font-size: 12.6px; text-align: justify;">Jag har ca 800 Investor B-aktier. Om jag säljer dessa och köper A-aktier skulle jag få 818 A-aktier. Mitt courtage för affären blir ca 900 kr (0,15% courtage). </span><br><br style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12.6px; text-align: justify;"><span style="background-color: white; font-family: "arial" , "tahoma" , "helvetica" , "freesans" , sans-serif; font-size: 12.6px; text-align: justify;">Hänger med på att jag får mer utdelning (ca 11 kr/aktie X 18 st = 200 kr per år). I ditt fall ovan skriver du att du får en engångsförtjänst på 9 000 kr, det är där jag inte hänger med riktigt. Mina B-aktier var värda 800 x 389,2 = 311 000 kr och mina A-aktier 818 x 380,6 = 311 000 kr. Från det senare beloppet ska oxå courtaget dras. Hmmm...??</span><br><br style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12.6px; text-align: justify;"><span style="background-color: white; font-family: "arial" , "tahoma" , "helvetica" , "freesans" , sans-serif; font-size: 12.6px; text-align: justify;">Kan du förklara så en nybörjare fattar hur man kan tjäna på detta vore jag mycket tacksam ;-)</span><br><br style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12.6px; text-align: justify;"><span style="background-color: white; font-family: "arial" , "tahoma" , "helvetica" , "freesans" , sans-serif; font-size: 12.6px; text-align: justify;">/Jörgen</span><br><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">---/klipp----</span><br><a href="http://utdelningsseglaren.blogspot.com/2017/09/hur-tjanar-man-pengar-pa-aktiearbitrage.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com4tag:blogger.com,1999:blog-5912109487932521336.post-54900800502807724982017-09-13T18:58:00.000+02:002017-10-04T19:35:07.876+02:00300.000 kr till dig eller banken?<div><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-RvNHxvgzARw/Wbli5Y_v61I/AAAAAAAABH4/42yolS5fqdw0HTnd1qTXZ1pJ677j_UrYACLcBGAs/s1600/dollars.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="439" data-original-width="661" height="212" src="https://2.bp.blogspot.com/-RvNHxvgzARw/Wbli5Y_v61I/AAAAAAAABH4/42yolS5fqdw0HTnd1qTXZ1pJ677j_UrYACLcBGAs/s320/dollars.jpg" width="320"></a></div><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Du går till ett "rådgivningsmöte" på banken. </span><br><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;"><br></span><span style="background-color: white; font-family: "arial"; font-size: 17.3333px; white-space: pre-wrap;">Tidigare har du har försökt förstå vad som på lång sikt kan bli en lönsam investering till låg risk och lyckats snappa upp att ett månadssparande i en globalfond kan vara ett bra val - speciellt om man bara satsar i en fond. </span></div><div></div><a href="http://utdelningsseglaren.blogspot.com/2017/09/300000-kr-till-dig-eller-banken.html#more">Läs mer »</a><div class="blogger-post-footer">Annons:
+ https://track.adtraction.com/t/t?a=1124961058&as=1158023516&t=2&tk=1</div>Utdelningsseglarenhttp://www.blogger.com/profile/17889805012294990207noreply@blogger.com8
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_youtube.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_youtube.xml
new file mode 100644
index 000000000..03c84bafc
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/atom_youtube.xml
@@ -0,0 +1,1464 @@
+
+
+
+ yt:channel:UC7_gcs09iThXybpVgjHZ_7g
+ UC7_gcs09iThXybpVgjHZ_7g
+ PBS Space Time
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2015-02-09T16:24:44+00:00
+
+ yt:video:q-6oU3jXAho
+ q-6oU3jXAho
+ UC7_gcs09iThXybpVgjHZ_7g
+ Can You Observe a Typical Universe?
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-11-18T19:45:00+00:00
+ 2019-11-18T19:45:01+00:00
+
+ Can You Observe a Typical Universe?
+
+
+ Sign Up on Patreon to get access to the Space Time Discord!
+ https://www.patreon.com/pbsspacetime
+
+ Check out the Space Time Merch Store
+ https://pbsspacetime.com/
+
+ The moment you started observing reality, you hopelessly polluted any conclusions you might make about it. The anthropic principle guarantees that you are NOT seeing the universe in most typical state. But used correctly, this highly controversial idea can be extremely powerful. So, how do you correctly use the anthropic principle?
+
+ Hosted by Matt O'Dowd
+ Written by Matt O'Dowd
+ Graphics by Leonardo Scholzer & Adriano Leal
+ Directed by: Andrew Kornhaber
+ Executive Producers: Eric Brown & Andrew Kornhaber
+
+ Special Thanks to Dr. Flournoy!!! Check out his lectures Below:
+ Particle Physics: https://www.youtube.com/playlist?list=PLDlWMHnDwylijo0yfs3xUN9ad6-YZjPLT
+ General Relativity: https://www.youtube.com/playlist?list=PLDlWMHnDwyliMevB36wgRbjXhJkoN_RUQ
+
+ According to the original definitions by Brandon Carter, the weak anthropic principle states that we must live in a place and time in the universe capable of supporting observers - in our case, a habitable biosphere, and the strong anthropic principle, which states that the universe itself must have the conditions necessary for producing environments that, in turn, produce observers. That means the fundamental constants and initial conditions of the universe must be just right to allow nice habitable planets to one day form. Let’s just call it the anthropic principle: we necessarily observe from an environment capable of producing observers; be that environment a planet within a universe or a universe within a multiverse.
+
+ Thanks to Our Patreon Supporters
+
+ Big Bang Supporters:
+ Alex Flournoy
+ Alexander Tamas
+ Craig Stonaha
+ David Barnholdt
+ David Nicklas
+ Fabrice Eap
+ John S
+ Juan Benet
+ matt miller
+ Morgan Hough
+
+ Quasar Supporters
+ Mark Heising
+ Mark Rosenthal
+ Vinnie Falco
+
+ Hypernova Supporters
+ chuck zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ Mathew
+ Matthew O'Connor
+ Syed Ansar
+ Timothy McCulloch
+
+
+
+
+
+
+
+ yt:video:YmOVoIpaPrc
+ YmOVoIpaPrc
+ UC7_gcs09iThXybpVgjHZ_7g
+ Does Life Need a Multiverse to Exist?
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-11-11T19:45:00+00:00
+ 2019-11-20T00:59:32+00:00
+
+ Does Life Need a Multiverse to Exist?
+
+
+ Sign Up on Patreon to get access to the Space Time Discord!
+ https://www.patreon.com/pbsspacetime
+
+ Check out the Space Time Merch Store
+ https://pbsspacetime.com/
+
+ Life exists in our universe. There we go - one hopefully uncontroversial statement. Therefore our universe is capable of producing and supporting life. How am I going? Two for two? Let’s try for three: therefore there are countless universes. Hmmm. Did I break my streak?
+
+ Hosted by Matt O'Dowd
+ Written by Matt O'Dowd
+ Graphics by Leonardo Scholzer & Adriano Leal
+ Directed by: Andrew Kornhaber
+ Executive Producers: Eric Brown & Andrew Kornhaber
+
+ Our universe seems to operate according to a set of fundamental rules that we try to understand and model with the equations of our laws of physics. Those equations always include one or more fundamental constants - simple numbers that set the scale for the equation. We can’t determine the values of these constants from pure theory - we have to measure them in the real universe. These are things like the speed of light, the Planck constant, the masses of the elementary particles, and the constants defining the relative strengths of the fundamental forces - the so-called coupling constants.
+
+ Special Thanks to Our Patreon Supporters
+
+ Big Bang
+ Alexander Tamas
+ Craig Stonaha
+ David Barnholdt
+ David Nicklas
+ Fabrice Eap
+ John S
+ Juan Benet
+ matt miller
+ Morgan Hough
+
+ Quasar
+ Mark Heising
+ Mark Rosenthal
+ Vinnie Falco
+
+ Hypernova
+ Chuck Zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ Mathew
+ Matthew O'Connor
+ Syed Ansar
+ Timothy McCulloch
+
+ Gamma Ray Burst
+ A G
+ Adrian Hatch
+ Adrien Molyneux
+ AlecZero
+ Andreas Nautsch
+ Bradley Jenkins
+ Brandon labonte
+ Dan Warren
+ Daniel Lyons
+ David Bethala
+ DFaulk
+ Eric Kiebler
+ Frederic Simon
+ Geoffrey Short
+ Graydon Goss
+ Greg Smith
+ James Flowers
+ Jamie Frederick
+ John Funai
+ John Griffith
+ John Michael Kerr
+ John Pollock
+ John Robinson
+ Jonathan Nesfeder
+ Joseph Dillman
+ Josh Thomas
+ Kevin Lee
+ Kevin Warne
+ Kyle Hofer
+ Malte Ubl
+ Michael Conroy
+ Nick Virtue
+ Nick Wright
+ Paul Rose
+ Scott Gossett
+ Sean Warniaha
+ Steve Bradshaw
+ Tatiana Vorovchenko
+ Tim Stephani
+ Tonyface
+ Yurii Konovaliuk
+
+
+
+
+
+
+
+ yt:video:8wa1l7M5gU8
+ 8wa1l7M5gU8
+ UC7_gcs09iThXybpVgjHZ_7g
+ Why We Might Be Alone in the Universe
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-11-04T19:45:00+00:00
+ 2019-11-13T16:32:19+00:00
+
+ Why We Might Be Alone in the Universe
+
+
+ Sign Up on Patreon to get access to the Space Time Discord!
+ https://www.patreon.com/pbsspacetime
+
+ Check out the Space Time Merch Store
+ https://pbsspacetime.com/
+
+ Why does it appear, that humanity is the lone intelligence in the universe? The answer might be that planet Earth is more unique than we've previously assumed. The rare earth hypothesis posits exactly this - that a range of factors made Earth exceptionally unusual and uniquely able to produce intelligent life.
+
+ In upcoming episodes we’ll be exploring the anthropic principle and its two main versions - the strong and the weak anthropic principles. The strong anthropic principle tells us that the observed universe must be able to produce observers - including the contentious idea that this predicts the existence of universes beyond our own. But in today's episode we’re going to focus on the weak anthropic principle. It says that we must find ourselves in a part of the universe capable of supporting us. For example, in a planetary biosphere rather than floating in the void between the galaxies. This may seems tautological, but accounting for this observer selection bias is important to understanding why the universe looks the way it does from our perspective. And the weak anthropic principle is much more useful than that. When combined with the apparent absence of alien civilizations, it may tell us why intelligent life is incredibly rare in our universe.
+
+ Hosted by Matt O'Dowd
+ Written by Matt O'Dowd
+ Graphics by Leonardo Scholzer & Adriano Leal
+ Directed by: Andrew Kornhaber
+ Executive Producers: Eric Brown & Andrew Kornhaber
+
+ Special Thanks to Our Patreon Supporters
+
+ BIg Bang Supporters:
+ Alexander Tamas
+ David Barnholdt
+ David Nicklas
+ Fabrice Eap
+ John S
+ Juan Benet
+ matt miller
+ Morgan Hough
+
+ Quasar Supporters
+ Mark Heising
+ Mark Rosenthal
+ Vinnie Falco
+
+ Hypernova
+ chuck zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ joe pearce
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ Mathew
+ Matthew O'Connor
+ Syed Ansar
+
+ Gamma Ray Burst
+ A G
+ Adrian Hatch
+ Adrien Molyneux
+ AlecZero
+ Andreas Nautsch
+ Bradley Jenkins
+ Brandon labonte
+ Dan Warren
+ Daniel Lyons
+ David Bethala
+ DFaulk
+ Frederic Simon
+ Geoffrey Short
+ Graydon Goss
+ Greg Smith
+ James Flowers
+ John Funai
+ John Griffith
+ John Michael Kerr
+ John Pollock
+ John Robinson
+ Jonathan Nesfeder
+ Joseph Dillman
+ Josh Thomas
+ Kevin Lee
+ Kevin Warne
+ Kyle Hofer
+ Malte Ubl
+ Nick Virtue
+ Nick Wright
+ Paul Rose
+ Scott Gossett
+ Sean Warniaha
+ Tim Stephani
+ Tonyface
+ Yurii Konovaliuk
+
+
+
+
+
+
+
+ yt:video:pGnMiGrYmPE
+ pGnMiGrYmPE
+ UC7_gcs09iThXybpVgjHZ_7g
+ Is Time Travel Impossible?
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-10-21T18:45:00+00:00
+ 2019-11-01T14:35:25+00:00
+
+ Is Time Travel Impossible?
+
+
+ Sign Up on Patreon to get access to the Space Time Discord!
+ https://www.patreon.com/pbsspacetime
+
+ Check out the Space Time Merch Store
+ https://pbsspacetime.com/
+
+ Time travel stories are cool because both the past and future are somehow more interesting that the present and because everyone wants a redo. But so far it appears we’re doomed to live consumed by regret in the eternal, boring present. Time marches on, inexorably and only forward. Or so we thought until Einstein came along. His special and general theories of relativity changed the way we think about time forever, and believe it or not, their raw equations permit time travel. They even tell us how to do it. So let’s review the possibilities, and decide how possible they really are.
+
+ Hosted by Matt O'Dowd
+ Written by Matt O'Dowd
+ Graphics by Leonardo Scholzer & Adriano Leal
+ Directed by: Andrew Kornhaber
+ Executive Producers: Eric Brown & Andrew Kornhaber
+
+ Special Thanks to our Big Bang Supporters
+
+ Big Bang
+ Alexander Tamas
+ Craig Stonaha
+ David Barnholdt
+ David Nicklas
+ Fabrice Eap
+ John S
+ Juan Benet
+ matt miller
+ Morgan Hough
+
+ Quasar
+ Mark Heising
+ Mark Rosenthal
+ Vinnie Falco
+
+ Hypernova
+ chuck zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ joe pearce
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ Mathew
+ Matthew O'Connor
+ Syed Ansar
+
+ Gamma Ray Burst
+ A G
+ Adrien Molyneux
+ AlecZero
+ Andreas Nautsch
+ Bradley Jenkins
+ Brandon labonte
+ Brian
+ Dan Warren
+ Daniel Lyons
+ David Bethala
+ DFaulk
+ Frederic Simon
+ Geoffrey Short
+ Graydon Goss
+ Greg Smith
+ James Flowers
+ Jamie Frederick
+ John Funai
+ John Griffith
+ John Michael Kerr
+ John Pollock
+ John Robinson
+ Jonathan Nesfeder
+ Joseph Dillman
+ Josh Thomas
+ Kevin Lee
+ Kevin Warne
+ Kyle Hofer
+ Malte Ubl
+ Michael Conroy
+ Nick Virtue
+ Nick Wright
+ Paul Rose
+ Scott Gossett
+ Sean Warniaha
+ Tatiana Vorovchenko
+ Tim Stephani
+ Tonyface
+ Yurii Konovaliuk
+
+
+
+
+
+
+
+ yt:video:L2suMPiuog4
+ L2suMPiuog4
+ UC7_gcs09iThXybpVgjHZ_7g
+ Loop Quantum Gravity Explained
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-10-15T18:45:00+00:00
+ 2019-10-20T06:09:45+00:00
+
+ Loop Quantum Gravity Explained
+
+
+ Sign Up on Patreon to get access to the Space Time Discord!
+ https://www.patreon.com/pbsspacetime
+
+ Check out the Space Time Merch Store
+ https://pbsspacetime.com/
+
+ It’s time we talked about loop quantum gravity. What exactly is it? What are the loops? And can it really defeat string theory in our quest for a Theory of Everything?
+
+ Hosted by Matt O'Dowd
+ Written by Graeme Gossel & Matt O'Dowd
+ Graphics by Leonardo Scholzer
+ Directed by: Andrew Kornhaber
+ Executive Producers: Eric Brown & Andrew Kornhaber
+
+ The holy grail of physics is to connect our understanding of the tiny scales of atoms and subatomic particles with that of the vast scales of planets, galaxies, and the entire universe. To connect quantum physics with Einstein’s general theory of relativity. Our search for a theory of quantum gravity is a century old, and we’ve talked quite a bit about it already, including what’s probably the lead contender - string theory. But string theory isn’t the only game in town - or so some physicists believe. There may be another way to reconcile the physics of the tiny and the gigantic - another way to a theory of quantum gravity that avoids a lot of conceptual baggage like tiny wiggling strings made of coiled up extra dimensions. That other way would be loop quantum gravity, and today we’re going to learn exactly what it is.
+
+ Special Thanks to Our Patreon Supporters
+
+ Big Bang Supporters:
+ David Barnholdt
+ David Boyer
+ David Nicklas
+ Fabrice Eap
+ Juan Benet
+ matt miller
+ Morgan Hough
+
+ Quasar:
+ Mark Heising
+ Mark Rosenthal
+ Vinnie Falco
+
+ Hypernova:
+ chuck zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ joe pearce
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ Mathew
+ Matthew O'Connor
+ Syed Ansar
+
+ Gamma Ray Burst:
+ A G
+ Adrien Molyneux
+ AlecZero
+ Andreas Nautsch
+ Bradley Jenkins
+ Brandon labonte
+ Brian
+ Dan Warren
+ Daniel Lyons
+ David Bethala
+ DFaulk
+ Frederic Simon
+ Geoffrey Short
+ Graydon Goss
+ Greg Smith
+ James Flowers
+ John Funai
+ John Griffith
+ John Michael Kerr
+ John Pollock
+ John Robinson
+ Jonathan Nesfeder
+ Joseph Dillman
+ Josh Thomas
+ Kevin Lee
+ Kevin Warne
+ Kyle Hofer
+ Malte Ubl
+ Nick Virtue
+ Nick Wright
+ Paul Rose
+ Scott Gossett
+ Sean Warniaha
+ Tim Stephani
+ Tonyface
+ Yurii Konovaliuk
+
+
+
+
+
+
+
+ yt:video:fKgQYOlpxmo
+ fKgQYOlpxmo
+ UC7_gcs09iThXybpVgjHZ_7g
+ Black Hole Harmonics
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-10-07T18:45:00+00:00
+ 2019-10-24T11:39:33+00:00
+
+ Black Hole Harmonics
+
+
+ Learn more at https://www.brilliant.org/spacetime
+
+ Black holes are crazy enough on their own – but crash two together and you end up with a roiling blob of inescapable space that vibrates like a beaten drum. And the rich harmonics of those vibrations, seen through gravitational waves, could hold the secrets to the nature of the fabric of spacetime itself. Today on space time journal club we’ll explore the papers that claim to have detected black hole harmonics. We’ll also give you the latest updates on the most recent – in some cases quite bizarre - LIGO detections.
+
+ Sign Up on Patreon to get access to the Space Time Discord!
+ https://www.patreon.com/pbsspacetime
+
+ Check out the Space Time Merch Store
+ https://pbsspacetime.com/
+
+ Hosted by Matt O'Dowd
+ Written by Matt O'Dowd
+ Graphics by Murilo Lopes
+ Directed by: Andrew Kornhaber
+ Executive Producers: Eric Brown & Andrew Kornhaber
+
+ When physicists talk about black holes they’re usually referring to highly theoretical objects – static, unchanging black holes viewed from “infinitely” far away. This makes everything clean and simple enough to attempt the already notoriously complex calculations of black hole physics. But real black holes are created in the violent deaths of massive stars, and there’s nothing clean about that. And we now know that black holes merge – and in the process produce gravitational radiation that we’ve only just managed to detect with the miraculous work of the LIGO and VIRGO gravitational wave observatories. In the instant after its merger, the new, joined black hole looks nothing like the idealized theoretical black hole.
+
+ Special Thanks To All Our Patreon Supporters
+
+ Big Bang Supporters
+ Anton Lifshits
+ David Barnholdt
+ David Boyer
+ David Nicklas
+ Fabrice Eap
+ Juan Benet
+ matt miller
+ Morgan Hough
+
+ Quasar Supporters
+ Mark Heising
+ Mark Rosenthal
+ Vinnie Falco
+
+ Hypernova
+ Chuck Zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ Joe Pearce
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ Mathew
+ Matthew O'Connor
+ Syed Ansar
+
+ Gamma Ray Burst Supporters
+ A G
+ Adrien Molyneux
+ AlecZero
+ Andreas Nautsch
+ Bradley Jenkins
+ Brandon labonte
+ Brian
+ Dan Warren
+ Daniel Lyons
+ David Bethala
+ DFaulk
+ Frederic Simon
+ Geoffrey Short
+ Graydon Goss
+ Greg Smith
+ James Flowers
+ James Quintero
+ John Funai
+ John Griffith
+ John Michael Kerr
+ John Pollock
+ John Robinson
+ Jonathan Nesfeder
+ Joseph Dillman
+ Josh Thomas
+ Justin Lloyd
+ Kevin Lee
+ Kevin Warne
+ Kyle Hofer
+ Malte Ubl
+ Nick Virtue
+ Nick Wright
+ Paul Rose
+ Scott Gossett
+ Sean Warniaha
+ Tim Stephani
+ Tonyface
+ Yurii Konovaliuk
+
+
+
+
+
+
+
+ yt:video:XglOw2_lozc
+ XglOw2_lozc
+ UC7_gcs09iThXybpVgjHZ_7g
+ How Many Universes Are There?
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-09-30T18:15:00+00:00
+ 2019-10-10T04:43:07+00:00
+
+ How Many Universes Are There?
+
+
+ Sign Up on Patreon to get access to the Space Time Discord!
+ https://www.patreon.com/pbsspacetime
+
+ Check out the Space Time Merch Store
+ https://pbsspacetime.com/
+
+ The universe is big, but it’s peanuts compared to the eternally inflating multiverse. But just how many universes are there? What are they like? And most importantly, what can they tell us about … aliens?
+
+ Challenge Answer Winners
+
+ Steven Mertens
+ David DeLaney
+ Chris Lotery
+ Eneko
+ Fabien Sangouard
+ Ian Bonnell
+
+ *Please email your selection from the Space Time Merch Store along with your address to pbsspacetime@gmail.com with the subject line “Challenge Question Winner”
+
+ Hosted by Matt O'Dowd
+ Written by Matt O'Dowd
+ Graphics by Leonardo Scholzer
+ Directed by: Andrew Kornhaber
+ Executive Producers: Eric Brown & Andrew Kornhaber
+
+ Imagine it: the observable part of our universe is 93 billion light years across, and that’s just a small fraction of the stuff created in our Big Bang. But in the eternal inflation picture, ours is just one among uncountable bubble universes. Bubbles that are continuously appearing and growing within a vastly larger spacetime that itself expands at an exponentially accelerating rate. A greater inflationary spacetime whose expansion never ends. We looked at the bizarre idea of eternal inflation in recent episodes – but we stopped short of exploring the full implications of this proposition. Those implications are, frankly, completely nuts. Some may also be true.
+
+ Big Bang Supporters:
+ Alexander Tamas
+ Anton Lifshits
+ David Barnholdt
+ David Boyer
+ David Nicklas
+ Fabrice Eap
+ Juan Benet
+ Justin Lloyd
+ Matt Miller
+ Morgan Hough
+
+ Quasar Supporters:
+ Mark Heising
+ Mark Rosenthal
+ Vinnie Falco
+
+ Hypernova Supporters:
+ Chuck Zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ Joe Pearce
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ Matthew
+ Matthew O'Connor
+ Syed Ansar
+
+ Gamma Ray Burst Supporters:
+ A.G.
+ Adrian Molyneux
+ Alec Zero
+ Andreas Nautsch
+ Bradley Jenkins
+ Brandon Labonte
+ Brian
+ Dan Warren
+ Daniel Lyons
+ David Behtala
+ DFaulk
+ Dustan Jones
+ Geoffrey Short
+ Greg Smith
+ James Flowers
+ James Quintero
+ John Funai
+ John Michael Kerr
+ John Pollock
+ John Robinson
+ Jonathan Nesfeder
+ Joseph Dillman
+ Josh Thomas
+ Kevin Lee
+ Kevin Warne
+ Kyle Hofer
+ Malte Ubl
+ Mark Vasile
+ Nick Virtue
+ Nick Wright
+ Paul Rose
+ Scott Gossett
+ Sean Warniaha
+ Steve Bradshaw
+ Tim Stephani
+ Tonyface
+ Yurii Konovaliuk
+
+
+
+
+
+
+
+ yt:video:CzJIWxplAbQ
+ CzJIWxplAbQ
+ UC7_gcs09iThXybpVgjHZ_7g
+ Is Pluto a Planet?
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-09-23T18:45:00+00:00
+ 2019-09-27T16:34:41+00:00
+
+ Is Pluto a Planet?
+
+
+ Sign Up on Patreon to get access to the Space Time Discord!
+ https://www.patreon.com/pbsspacetime
+
+ Sign up for the mailing list to get episode notifications and hear special announcements!
+ https://mailchi.mp/1a6eb8f2717d/spacetime
+
+ You know what a planet is, right? A big round thing that orbits a star. Uh, not so fast. The surprisingly vicious debate over the planetary status of Pluto has given us a fascinating glimpse into what a scientific definition really is. And perhaps the word planet is too vague to be used as a scientific definition at all.
+
+ Hosted by Matt O'Dowd
+ Written by Drew Rosen and Matt O'Dowd
+ Graphics by Leonardo Scholzer
+ Directed by: Andrew Kornhaber
+ Produced By: Kornhaber Brown
+
+ Check out the new Space Time Merch Store!
+ https://pbsspacetime.com/
+
+ We love to classify things. Labels help us keep stuff organized in our heads. In science, categorization provides a fast and easy way to know the properties of a member of the group just by knowing what group it belongs to. Chemists group elements on the periodic table, those groups exhibit similar chemical behavior that reflect outer-shell electron number. Biologists group organisms by similar physical characteristics, and this taxonomy reflects genetic relationships. Astronomers are all about space taxonomy. We classify galaxies based on their shape, black holes based on how they feed, stars based on their colour and brightness, and planets by… well, by a set of criteria that has caused more tension and heartbreak than any made-up grouping scheme really should. Because a change in that scheme demoted Pluto from planet to not-planet. Today we’re going to settle whether this was reasonable, and whether we should keep the word “planet” at all.
+
+ Big Bang Supporters:
+ Alexander Tamas
+ Anton Lifshits
+ David Barnholdt
+ David Boyer
+ David Nicklas
+ Fabrice Eap
+ Juan Benet
+ Justin Lloyd
+ Matt Miller
+ Morgan Hough
+
+ Quasar Supporters:
+ Mark Heising
+ Mark Rosenthal
+ Vinnie Falco
+
+ Hypernova Supporters:
+ Chuck Zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ Matthew
+ Matthew O'Connor
+ Syed Ansar
+
+ Gamma Ray Burst Supporters:
+ Adrian Molyneux
+ Alec Zero
+ Andreas Nautsch
+ Bradley Jenkins
+ Brandon Labonte
+ Brian
+ Dan Warren
+ Daniel Lyons
+ David Behtala
+ DFaulk
+ Dustan Jones
+ Geoffrey Short
+ James Flowers
+ James Quintero
+ Jason
+ John Funai
+ John Michael Kerr
+ John Pollock
+ Jonah
+ Jonathan Nesfeder
+ Joseph Dillman
+ Josh Thomas
+ Kevin Lee
+ Kevin Warne
+ Kyle Hofer
+ Malte Ubl
+ Mark Vasile
+ Nick Virtue
+ Nick Wright
+ Paul Rose
+ Scott Gossett
+ Steve Bradshaw
+ Sigurd Ruud Frivik
+ Tim Stephani
+ Yurii Konovaliuk
+
+
+
+
+
+
+
+ yt:video:FshtPsOTCP4
+ FshtPsOTCP4
+ UC7_gcs09iThXybpVgjHZ_7g
+ Could We Terraform Mars?
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-09-16T18:45:01+00:00
+ 2019-09-20T19:15:46+00:00
+
+ Could We Terraform Mars?
+
+
+ To discover more go to http://lego.build/CITYSpace
+
+ Humanity’s future is glorious. As we master space travel, we’ll hop from one lifeless world to the next. Life will blossom in our path and the galaxy with shimmer with beautiful Earth-like orbs. Hmmm… maybe. This won’t sound so far fetched if we prove we can do it at least once. If we successfully terraform Mars.
+
+ Hosted by Matt O'Dowd
+ Written by Matt O'Dowd
+ Graphics by Murilo Lopes
+ Directed by: Andrew Kornhaber
+ Produced By: Kornhaber Brown
+
+ Support Space Time on Patreon
+ https://www.patreon.com/pbsspacetime
+
+ Check out the new Space Time Merch Store!
+ https://pbsspacetime.com/
+
+ We already have the technology to bring humans safely to Mars and set up small settlements - or at least could do within a generation. But those settlements will need to be cocooned - shielded against the deadly cold, intense radiation, and the fatal lack of atmospheric pressure. Surely if we want to thrive on Mars – to make it into our second home – these settlers, or their descendants, will need to be able open the airlocks, shed their spacesuits, and step out onto a survivable surface. We’ll need to terraform Mars, as our first step in terraforming the galaxy.
+
+ Red Iris Mars habitat by James Telfer: http://bit.ly/JamesTelferRedIris
+
+ Want Even More Great Space Content? Check out the Exciting Summer of Space Playlist
+ https://www.youtube.com/playlist?list...
+
+ Big Bang Supporters:
+ Alexander Tamas
+ Anton Lifshits
+ David Nicklas
+ Fabrice Eap
+ Juan Benet
+ Morgan Hough
+
+ Quasar Supporters:
+ Mark Heising
+ Mark Rosenthal
+ Vinnie Falco
+
+ Hypernova Supporters:
+ Chuck Zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ Matthew
+ Matthew O'Connor
+ Syed Ansar
+
+ Gamma Ray Burst Supporters:
+ Adrien Hatch
+ Adrian Molyneux
+ Alexey Eromenko
+ Andreas Nautsch
+ Bradley Jenkins
+ Brandon Labonte
+ Carlo Mogavero
+ Dan Warren
+ Daniel Lyons
+ David Behtala
+ DFaulk
+ Dustan Jones
+ Geoffrey Short
+ James Flowers
+ James Quintero
+ John Funai
+ John Pollock
+ Jonah
+ Jonathan Nesfeder
+ Joseph Dillman
+ Josh Thomas
+ Kevin Lee
+ Kevin Warne
+ Kyle Hofer
+ Malte Ubl
+ Mark Vasile
+ Nathan Hitchings
+ Nicholas Nachefski
+ Nick Virtue
+ Paul Rose
+ Scott Gossett
+ Sigurd Ruud Frivik
+ Taras Vozniuk
+ Tim Jones
+ Tim Stephani
+ Yurii Konovaliuk
+ سلطان الخليفي
+
+
+
+
+
+
+
+ yt:video:51usJ74pPP8
+ 51usJ74pPP8
+ UC7_gcs09iThXybpVgjHZ_7g
+ Is Earth's Magnetic Field Reversing?
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-09-03T18:45:00+00:00
+ 2019-10-10T18:42:27+00:00
+
+ Is Earth's Magnetic Field Reversing?
+
+
+ Please Take the PBS Digital Studios Annual Survey Here: https://www.pbsresearch.org/c/r/ST_YTvideo
+
+ It's very helpful and you could win a free T-Shirt!
+
+ Support Space Time on Patreon
+ https://www.patreon.com/pbsspacetime
+
+ Check out the new Space Time Merch Store!
+ https://pbsspacetime.com/
+
+ Earth’s magnetic field protects us from deadly space radiation. What if it were drastically weakened, as a precursor to flipping upside down? I mean, it has before … many, many times..
+
+ Hosted by Matt O'Dowd
+ Written by Matt O'Dowd
+ Graphics by Leonardo Scholzer
+ Directed by: Andrew Kornhaber
+ Produced By: Kornhaber Brown
+
+ Special Thanks to Lathrop Lab at University of Maryland:
+ https://complex.umd.edu/
+
+ Check Out Lathrop Lab's YouTube Channel to learn more about their 3-meter experiment that models the Earth's core:
+ https://www.youtube.com/channel/UC-nUrQmFR3pFgEVwW0qAURA
+
+ Spaceship Earth has a literal deflector shield. A geomagnetic field. Lines of magnetic force, forged by currents in the planet’s molten core, erupt from the surface close to the north south geographic poles, connecting to each other to wreath the planet in a dipole field, like a gigantic bar magnet. Magnetic fields exert a force on moving charged particles, causing them to spiral around those force lines. That’s helpful, because Earth is constantly bombarded by very fast moving charged particles, especially coming from the Sun. Our magnetic field deflects the worst of these. Not all planets are so lucky. Mars, with its solid core, has no such shield – and so the red planet’s atmosphere was stripped away by the solar wind billions of years ago.
+
+
+ Want Even More Great Space Content? Check out the Exciting Summer of Space Playlist
+ https://www.youtube.com/playlist?list=PLoFRvPlmME6FOQtdDKyOUzKJiTE6KXsK3
+
+ Big Bang Supporters:
+ Alexander Tamas
+ Anton Lifshits
+ David Nicklas
+ Fabrice Eap
+ Juan Benet
+ Morgan Hough
+
+ Quasar Supporters:
+ Mark Heising
+ Mark Rosenthal
+ Vinnie Falco
+
+ Hypernova Supporters:
+ Chuck Zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ Matthew
+ Matthew O'Connor
+ Syed Ansar
+
+ Gamma Ray Burst Supporters:
+ Adrien Hatch
+ Adrian Molyneux
+ Alexey Eromenko
+ Andreas Nautsch
+ Bradley Jenkins
+ Brandon Labonte
+ Carlo Mogavero
+ Dan Warren
+ Daniel Lyons
+ David Behtala
+ DFaulk
+ Dustan Jones
+ Geoffrey Short
+ James Flowers
+ James Quintero
+ John Funai
+ John Pollock
+ Jonah
+ Jonathan Nesfeder
+ Joseph Dillman
+ Josh Thomas
+ Kevin Lee
+ Kevin Warne
+ Kyle Hofer
+ Malte Ubl
+ Mark Vasile
+ Nathan Hitchings
+ Nicholas Nachefski
+ Nick Virtue
+ Paul Rose
+ Scott Gossett
+ Sigurd Ruud Frivik
+ Taras Vozniuk
+ Tim Jones
+ Tim Stephani
+ Yurii Konovaliuk
+ سلطان الخليفي
+
+
+
+
+
+
+
+ yt:video:n8cEZM1lN5g
+ n8cEZM1lN5g
+ UC7_gcs09iThXybpVgjHZ_7g
+ How To Become an Astrophysicist + Challenge Question!
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-08-26T18:45:00+00:00
+ 2019-10-10T18:21:27+00:00
+
+ How To Become an Astrophysicist + Challenge Question!
+
+
+ Check out the new Space Time Merch Store!
+ https://pbsspacetime.com/
+
+ Support Space Time on Patreon
+ https://www.patreon.com/pbsspacetime
+
+ Do you want to major in Astrophysics? Are you thinking about becoming (or ever just wondered how one becomes) an Astrophysicists? Do you want to know Matt O’Dowd’s origin story? Then buckle up and enjoy the ride and try your astrophysics skill in calculating bubble universes to try to win some free Space Time Swag from the Merch Store.
+
+ Hosted by Matt O'Dowd
+ Written by Matt O'Dowd
+ Graphics by Murilo Lopes
+ Directed by: Eric Brown
+ Produced By: Kornhaber Brown
+
+ To Jump to Challenge Question:
+ https://youtu.be/n8cEZM1lN5g?t=617
+
+ Email Challenge Answer to by 9/9/19:
+ PBSSpacetime@gmail.com
+ Subject line: Eternal Inflation Challenge
+
+ Want Even More Great Space Content? Check out the Exciting STELLAR Playlist
+ https://www.youtube.com/playlist?list...
+
+ Big Bang Supporters:
+ Alexander Tamas
+ Anton Lifshits
+ David Nicklas
+ Fabrice Eap
+ Juan Benet
+ Morgan Hough
+
+ Quasar Supporters:
+ Mark Heising
+ Mark Rosenthal
+ Vinnie Falco
+
+ Hypernova Supporters:
+ Chuck Zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ Matthew
+ Matthew O'Connor
+ Syed Ansar
+
+ Gamma Ray Burst Supporters:
+ Adrien Hatch
+ Adrian Molyneux
+ Alexey Eromenko
+ Andreas Nautsch
+ Bradley Jenkins
+ Brandon Labonte
+ Carlo Mogavero
+ Dan Warren
+ Daniel Lyons
+ David Behtala
+ DFaulk
+ Dustan Jones
+ Geoffrey Short
+ James Flowers
+ James Quintero
+ John Funai
+ John Pollock
+ Jonah
+ Jonathan Nesfeder
+ Joseph Dillman
+ Josh Thomas
+ Kevin Warne
+ Kyle Hofer
+ Malte Ubl
+ Mark Vasile
+ Nathan Hitchings
+ Nicholas Nachefski
+ Nick Virtue
+ Paul Rose
+ Scott Gossett
+ Sigurd Ruud Frivik
+ Taras Vozniuk
+ Tim Jones
+ Tim Stephani
+ Yurii Konovaliuk
+ سلطان الخليفي
+
+
+
+
+
+
+
+ yt:video:chsLw2siRW0
+ chsLw2siRW0
+ UC7_gcs09iThXybpVgjHZ_7g
+ What Happened Before the Big Bang?
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-08-19T18:45:02+00:00
+ 2019-09-03T21:14:23+00:00
+
+ What Happened Before the Big Bang?
+
+
+ Check out the new Space Time Merch Store!
+ https://pbsspacetime.com/
+
+ Support Space Time on Patreon
+ https://www.patreon.com/pbsspacetime
+
+ We actually have a pretty good idea of what might have happened before the Big Bang. That is, as long as we define the Big Bang as the extremely hot, dense, rapidly expanding universe that is described by Einstein’s equations. That picture of the universe is very solid down to about a trillionth of a second after the supposed beginning of time. We can make good guesses down to about 10^-30th of a second. But before that?
+
+ Hosted by Matt O'Dowd
+ Written by Matt O'Dowd
+ Graphics by Leonardo Scholzer
+ Directed by Andrew Kornhaber
+ Produced By: Kornhaber Brown
+
+ Check out the Big Bang and Cosmic Inflation Playlist to learn More
+ https://www.youtube.com/watch?v=aPStj2ZuXug&list=PLsPUh22kYmNCc3WCKb5yF136QSRf0xErm
+
+ Want Even More Great Space Content? Check out the Exciting STELLAR Playlist
+ https://www.youtube.com/playlist?list=PL1mtdjDVOoOqY7QPHGa9OppO_pjf91lbV
+
+ Big Bang Supporters:
+
+ Alexander Tamas
+ Anton Lifshits
+ David Nicklas
+ Fabrice Eap
+ Juan Benet
+ Morgan Hough
+
+ Quasar Supporters:
+
+ Mark Heising
+ Mark Rosenthal
+ Vinnie Falco
+
+ Hypernova Supporters:
+ Chuck Zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ Matthew
+ Matthew O'Connor
+ Syed Ansar
+
+ Gamma Ray Burst Supporters:
+
+ Adrien Hatch
+ Adrian Molyneux
+ Alexey Eromenko
+ Andreas Nautsch
+ Bradley Jenkins
+ Brandon Labonte
+ Carlo Mogavero
+ Dan Warren
+ Daniel Lyons
+ David Behtala
+ DFaulk
+ Dustan Jones
+ Geoffrey Short
+ James Flowers
+ James Quintero
+ John Funai
+ John Pollock
+ Jonah
+ Jonathan Nesfeder
+ Joseph Dillman
+ Josh Thomas
+ Kevin Warne
+ Kyle Hofer
+ Malte Ubl
+ Mark Vasile
+ Nathan Hitchings
+ Nicholas Nachefski
+ Nick Virtue
+ Paul Rose
+ Scott Gossett
+ Sigurd Ruud Frivik
+ Taras Vozniuk
+ Tim Jones
+ Tim Stephani
+ Yurii Konovaliuk
+ سلطان الخليفي
+
+
+
+
+
+
+
+ yt:video:-5j98wi_M2w
+ -5j98wi_M2w
+ UC7_gcs09iThXybpVgjHZ_7g
+ Exploring a HUGE Radio Telescope in VR 180
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-08-12T20:00:00+00:00
+ 2019-11-13T02:36:50+00:00
+
+ Exploring a HUGE Radio Telescope in VR 180
+
+
+ This is a VR180 video so pop on your Google Cardboard or VR Headset to be totally immersed in our world! No headset? No problem. Move your mobile phone around and catch the total 180 experience. Have fun looking down from the catwalk!
+
+ How can you build a telescope that can see the entire night sky without moving its dish? Well in this special episode of Space Time we took a tour of the Arecibo Observatory with a VR 180 camera so you could explore the incredible ingenuity of Arecibo's giant spherical dish that allows it to reflect light from every spot on the sky in a symmetric way. We also talked to Dr. Abel Méndez about Exoplantes and Aliens!
+
+ Check out our interview with Dr. Abel Méndez about Finding Exoplanets and Talking to Aliens:
+ https://youtu.be/RrH9LwD1bx4
+
+ Hosted by Matt O’Dowd
+ Written by: Matt O’Dowd
+ Directed by: Eric Brown
+ Director of Photography: Eric Brouse
+ Sound: Brett Van Duesen
+ Editing: Brian Nils Johnson
+ Assistant Editing: Daniel Sircar
+ Produced By: Kornhaber Brown
+
+ Check out the new Space Time Merch Store!
+ https://pbsspacetime.com/
+
+ Support Space Time on Patreon
+ https://www.patreon.com/pbsspacetime
+
+
+
+
+
+
+
+ yt:video:xJCX2NlhdTc
+ xJCX2NlhdTc
+ UC7_gcs09iThXybpVgjHZ_7g
+ What Caused the Big Bang?
+
+
+ PBS Space Time
+ https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g
+
+ 2019-08-06T19:20:51+00:00
+ 2019-08-18T07:39:22+00:00
+
+ What Caused the Big Bang?
+
+
+ Check out the new Space Time Merch Store!
+ https://pbsspacetime.com/
+
+ Support Space Time on Patreon
+ https://www.patreon.com/pbsspacetime
+
+ Every astronomy textbook tells us that soon after the Big Bang, there was a period of exponentially accelerating expansion called cosmic inflation. In a tiny fraction of a second, inflationary expansion multiplied the size of the universe by a larger factor than in the following 13 and a half billion years of regular expansion. This story seems like a bit of a … stretch. Is there really any mechanism that could cause something like this to happen? What what we’re covering today – the real physics of cosmic inflation.
+
+ Hosted by Matt O'Dowd
+ Written by Matt O'Dowd
+ Graphics by Leonardo Scholzer
+ Directed by Andrew Kornhaber
+ Produced By: Kornhaber Brown
+
+ Dark Energy Playlist:
+ https://www.youtube.com/playlist?list=PLsPUh22kYmNA6WUmOsEEi32zi_RdSUF4i
+
+ The Quantum Vacuum and Hawking Radiation Playlist
+ https://www.youtube.com/watch?v=OvgZqGxF3eo&list=PLsPUh22kYmNAHB1W2_Ka2F83sObdczwKr
+
+ Most cosmologists buy some variation of the inflation hypothesis. It seems to very neatly solve some of the biggest questions in cosmology. Those being: why is matter and energy so smoothly spread out across the entire observable universe? And why is the geometry of the universe so flat? Neither should be expected unless the universe expanded much more rapidly early on. We explored these problems in an earlier video – worth a look if you really want to get inflation. Another problem fixed by inflation is the absence of magnetic monopoles – strange particles predicted to have been produced in the early universe. We’ll come back to those another time.
+
+
+ Big Bang Supporters:
+
+ Anton Lifshits
+ David Nicklas
+ Fabrice Eap
+ Juan Benet
+ Justin Lloyd
+ Morgan Hough
+
+ Quasar Supporters:
+
+ Mark Heising
+ Mark Rosenthal
+ Tambe Barsbay
+ Vinnie Falco
+
+ Hypernova Supporters:
+ Chuck Zegar
+ Danton Spivey
+ Donal Botkin
+ Edmund Fokschaner
+ Hank S
+ John Hofmann
+ John R. Slavik
+ Jordan Young
+ Joseph Salomone
+ kkm
+ Mark Heising
+ Matthew
+ Matthew O'Connor
+ Syed Ansar
+
+ Gamma Ray Burst Supporters:
+
+ Adrien Hatch
+ Alexey Eromenko
+ Andreas Nautsch
+ Bradley Jenkins
+ Brandon Labonte
+ Carlo Mogavero
+ Daniel Lyons
+ David Behtala
+ DFaulk
+ Dustan Jones
+ Geoffrey Short
+ James Flowers
+ James Quintero
+ John Funai
+ John Pollock
+ Jonah
+ Jonathan Nesfeder
+ Joseph Dillman
+ Joseph Emison
+ Josh Thomas
+ Kevin Warne
+ Kyle Hofer
+ Malte Ubl
+ Mark Vasile
+ Nathan Hitchings
+ Nick Virtue
+ Paul Rose
+ Ryan Jones
+ Scott Gossett
+ Sigurd Ruud Frivik
+ Tim Jones
+ Tim Stephani
+ Tommy Mogensen
+ Yurii Konovaliuk
+ سلطان الخليفي
+
+
+
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/cowboyprogrammer.html b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/cowboyprogrammer.html
new file mode 100644
index 000000000..2032ba996
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/cowboyprogrammer.html
@@ -0,0 +1,821 @@
+
+
+
+ Cowboy Programmer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ In Gimp you go to Image in the top menu bar and select Mode followed by Indexed. Now you see a popup where you can select the number of colors for a generated optimum palette.
+You’ll have to experiment a little because it will depend on your image.
+I used this approach to shrink the size of the cover image in the_zopfli post from a 37KB (JPG) to just 15KB (PNG, all PNG sizes listed include Zopfli compression btw).
+
+
+ A clear difference between Debian/Ubuntu and for example Red Hat/Fedora is that packages which include system services will enable and start those services at install time in Debian/Ubuntu whereas they will not start automatically in Red Hat/Fedora.
+Sometimes it would be very convenient if the service would not start automatically, for example if you need to configure the service before starting it for the first time.
+To prevent the automatic start of system services at install time in Debian, just set the RUNLEVEL environment variable like so:
+
+
+ Having an encrypted hard drive is all well and good, but chances are that if someone is gonna steal your laptop, it’s probably not going to be turned off. Most likely, it will be stolen in a powered-on state. And so your encrypted hard drive doesn’t increase your security at all since it’s currently unlocked.
+In my mind, it’s a slight improvement if the computer somehow can shutdown if someone is trying to gain access to it.
+
+
+ Update 2016-11-22: Made the Makefile compatible with BSD sed (MacOS)
+One advantage that static sites, such as those built by Hugo, provide is fast loading times. Because there is no processing to be done, no server side rendering, no database lookups, loading times are just as fast as you can serve the files that make up the page. This means that bandwidth becomes the primary bottleneck, which incidentally is one of the factors used by Google to calculate your search ranking.
+
+
+ So I recently migrated this site from Ghost to Hugo after reading a nice article about the Hugo in Linux Voice #20 (funnily enough, the same issue also features an article about Ghost). I originally made the switch to Ghost from Jekyll back in 2014 or so mainly because I could not find a good theme to use. Ghost also seemed to have a lot of cool features and it’s fun to try new things.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/cowboyprogrammer_atom.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/cowboyprogrammer_atom.xml
new file mode 100644
index 000000000..1d59f937a
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/cowboyprogrammer_atom.xml
@@ -0,0 +1,1757 @@
+
+
+ https://cowboyprogrammer.org/
+ Cowboy Programmer
+ 2018-03-05T23:00:00+02:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+ Hugo -- gohugo.io
+ Recent content in Cowboy Programmer on Cowboy Programmer
+ https://cowboyprogrammer.org/css/images/logo.png
+ Powered by [Hugo](//gohugo.io) and [Icarus Theme](http://themes.gohugo.io/theme/hugo-icarus/).
+
+
+
+ https://cowboyprogrammer.org/2018/03/fixed-vs-variable-interest-rates/
+
+ A comparison between fixed and variable interest rates
+ 2018-03-05T23:00:00+02:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ The data I am using is originally from SwedBank and all data and
+code is available at GitLab. The data contains interest
+rates at 5 years fixed term, 2 years fixed term, and 3 months fixed
+term (also called variable rate in Sweden) for those dates when any
+rate was changed. The first rates are from 1989-11-01 and the last are
+from 2018-02-12. Example of the data:
+
+
+
+
+
+
5y
+
2y
+
3m
+
+
+
Date
+
+
+
+
+
+
+
+
1989-11-22
+
13.50
+
13.50
+
12.75
+
+
+
1991-01-14
+
14.00
+
14.75
+
15.25
+
+
+
1993-01-13
+
12.75
+
13.00
+
13.75
+
+
+
1994-11-21
+
11.75
+
11.50
+
9.75
+
+
+
1996-03-12
+
9.85
+
8.95
+
9.10
+
+
+
2005-09-09
+
3.55
+
2.97
+
3.15
+
+
+
2005-10-03
+
3.69
+
3.09
+
3.15
+
+
+
2007-12-21
+
5.36
+
5.25
+
5.15
+
+
+
2008-01-24
+
5.13
+
4.94
+
5.15
+
+
+
2009-03-20
+
4.26
+
2.83
+
2.20
+
+
+
+
+
To make the calculations more convenient I assume that loans are only
+fixed the first day of the month. Example:
+
+
+
+
+
+
5y
+
2y
+
3m
+
+
+
Date
+
+
+
+
+
+
+
+
1990-06-01
+
14.50
+
14.50
+
13.95
+
+
+
1992-03-01
+
12.50
+
13.00
+
14.75
+
+
+
1993-06-01
+
10.75
+
10.50
+
11.50
+
+
+
1998-02-01
+
6.70
+
6.40
+
5.80
+
+
+
2001-09-01
+
6.55
+
5.95
+
5.90
+
+
+
2004-11-01
+
4.85
+
3.90
+
3.65
+
+
+
2009-05-01
+
4.15
+
2.73
+
1.97
+
+
+
2010-08-01
+
3.99
+
2.90
+
2.17
+
+
+
2011-05-01
+
5.29
+
4.39
+
3.88
+
+
+
2011-11-01
+
4.59
+
4.14
+
4.35
+
+
+
+
+
If we graph the interest rates we get:
+
+
+
+
You can see a clear peak in the variable rate when the riksbank set
+the repo rate at 500% (mortgages “only” reached 24%). You can also see
+that during the early nineties the variable rate was higher than the
+fixed rates during relatively long periods. But to compare the actual
+cost over the fixed term we have to compare average rates.
+
+
For example, let us compare the actual average rates from the first of
+July 1991 during 5 years for variable rate (11.96%) and 5 years fixed
+term (12.25%). Even though with variable rate you’d have had a rate of
+24% during a quarter you’d still pay less in total over the 5 years.
+
+
If the same calculation is made for every month you can see how much
+you would have earned/lost depending on when you started your fixed
+term. Since 5 years is not evenly divisible by 2 years, the 2 years
+fixed term refers to what the average rate would have been during the
+first 5 of the 6 years.
+
+
+
+
It’s quite clear that variable rate has nearly always been the most
+profitable alternative. At three seperate occasions it would have been
+more profitable to pick a 5 year fixed term: at the of 1989, the
+beginning of 1997, and in the middle of 2005. I won’t comment on the 2
+years fixed term since it’s not a fair comparison to only look at 5 out of
+6 years.
+
+
If we compare 2 years fixed term with variable rate:
+
+
+
+
Also here the most profitable choice is generally the variable rate
+however during times of rising interest rates getting a fixed 2 year
+term has been the better choice on several occasions. An important
+difference to the 5 years term is that you’re not locked in for long
+when the rates finally go down again (and you’re able to switch to
+variable rate).
+
+
If we compare all terms during 10 years:
+
+
+
+
Here it is clear that the variable rate is the most profitable.
+
+
Even though it has been possible at certain occasions (29 years and
+only 3 short occasions!) to get a fixed term for 5 years and pay less
+overall than with variable rate, I think it’s far too improbable that
+one is able to do it at the right time. You’re almost guaranteed to be
+paying more in the end.
+
+
Getting a fixed term for 2 years is more probable to be profitable,
+but even here it is more probable not to be.
+]]>
+
+
+
+ https://cowboyprogrammer.org/2016/10/reduce-colors-in-images/
+
+ Reduce the size of images even further by reducing number of colors with Gimp
+ 2016-10-21T00:27:00+02:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ In Gimp you go to Image in the top menu bar and select Mode
+followed by Indexed. Now you see a popup where you can select the
+number of colors for a generated optimum palette.
+
+
You’ll have to experiment a little because it will depend on your
+image.
+
+
I used this approach to shrink the size of the cover image in
+the_zopfli post from a 37KB (JPG) to just 15KB
+(PNG, all PNG sizes listed include Zopfli compression btw).
+
+
Straight JPG to PNG conversion: 124KB
+
+
+
+
First off, I exported the JPG file as a PNG file. This PNG file had a
+whopping 124KB! Clearly there was some bloat being stored.
+
+
256 colors: 40KB
+
+
Reducing from RGB to only 256 colors has no visible effect to my eyes.
+
+
+
+
128 colors: 34KB
+
+
Still no difference.
+
+
+
+
64 colors: 25KB
+
+
You can start to see some artifacting in the shadow behind the text.
+
+
+
+
32 colors: 15KB
+
+
In my opinion this is the sweet spot. The shadow artifacting is barely
+noticable but the size is significantly reduced.
+
+
+
+
16 colors: 11KB
+
+
Clear artifacting in the text shadow and the yellow (fire?) in the
+background has developed an outline.
+
+
+
+
8 colors: 7.3KB
+
+
The broom has shifted in color from a clear brown to almost grey. Text
+shadow is just a grey blob at this point. Even clearer outline
+developed on the yellow background.
+
+
+
+
4 colors: 4.3KB
+
+
Interestingly enough, I think 4 colors looks better than 8 colors. The outline in the background has disappeared because there’s not enough color spectrum to render it. The broom is now black and filled areas tend to get a white separator to the outlines.
+
+
+
+
2 colors: 2.4KB
+
+
Well, at least the silhouette is well defined at this point I guess.
+
+
+]]>
+
+
+
+ https://cowboyprogrammer.org/2016/10/dont-start-service-on-install-of-debian-package/
+
+ Don't start service on installation of Debian package
+ 2016-10-19T00:00:00+02:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ A clear difference between Debian/Ubuntu and for example Red
+Hat/Fedora is that packages which include system services will enable
+and start those services at install time in Debian/Ubuntu whereas they
+will not start automatically in Red Hat/Fedora.
+
+
Sometimes it would be very convenient if the service would not start
+automatically, for example if you need to configure the service before
+starting it for the first time.
+
+
To prevent the automatic start of system services at install time in
+Debian, just set the RUNLEVEL environment variable like so:
+
+
RUNLEVEL=1 apt install -y PKG_NAME
+
+
+
Then you are free to configure your system before you start the
+service for real:
+]]>
+
+
+
+ https://cowboyprogrammer.org/2016/09/reboot_machine_on_wrong_password/
+
+ Rebooting on wrong password
+ 2016-09-28T22:57:21+02:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ Having an encrypted hard drive is all well and good, but chances are
+that if someone is gonna steal your laptop, it’s probably not going to
+be turned off. Most likely, it will be stolen in a powered-on
+state. And so your encrypted hard drive doesn’t increase your security
+at all since it’s currently unlocked.
+
+
In my mind, it’s a slight improvement if the computer somehow can
+shutdown if someone is trying to gain access to it. That way, the hard
+drive is no longer accessible and the number of possible attack
+vectors go down drastically. And so, if you type the wrong password 3
+times on my laptop, it shuts down.
+
+
This is accomplished by using PAM, and its ability to invoke an
+arbitrary script as part of the login flow via pam_exec.so. The
+script itself looks like this:
+
#!/bin/bash
+# Do not add -eu, you need to allow empty variables here!
+
+# To be used with PAM. Look in /etc/pam.d for the script that your
+# screensaver etc uses. Typically it references common-account and common-auth.
+#
+# In common-auth, add this as the first line
+#auth optional pam_exec.so debug /path/to/wrongpassword.sh
+#
+# In common-account, add this as the first line
+#account required pam_exec.so debug /path/to/wrongpassword.sh
+#
+
+COUNTFILE="/var/log/failed_login_count"
+
+# Make sure file exists
+if[ ! -f "${COUNFILE}"];then
+ touch "${COUNTFILE}"
+ chmod 777"${COUNTFILE}"
+fi
+
+# Read value in it
+COUNT=$(cat "${COUNTFILE}")
+# Increment it
+COUNT=$((COUNT+1))
+echo"${COUNT}" > "${COUNTFILE}"
+
+# if authentication
+if["${PAM_TYPE}"=="auth"]; then
+ # The count will be at 4 after 3 wrong tries
+ if["${COUNT}" -ge 4]; then
+ # Shutdown in 1 min
+ #/usr/bin/shutdown --no-wall -h +1
+ # This is a hack because the line above gives a segfault in logind
+ echo"0" > "${COUNTFILE}"
+ systemctl poweroff
+ fi
+# If authentication succeeded, and we are now in account phase
+elif["${PAM_TYPE}"=="account"]; then
+ echo"0" > "${COUNTFILE}"
+ # Cancel shutdown which was just issued
+ shutdown -c
+fi
+
+exit0
+
+
+
On my Debian system, PAM ends up looking at /etc/pam.d/common-auth
+and /etc/pam.d/common-account. These are invoked in different parts
+of the authentication flow. In common-auth, add this as the first
+line:
You can try it immediately if it works. Lock your screen, and type the
+wrong password 4 times. If it works, your computer should shut down.
+
+
WARNING: DO NOT ENABLE ON SERVERS
+
+
This is NOT something you want to do on any machine. Most notably,
+it’s probably a huge mistake to copy this verbatim on a machine which
+accepts remote connections. In that case, you essentially enable
+anyone to DOS you by entering the wrong password via SSH or
+similarly. So don’t do this if you allow remote connections to your
+machine (which shouldn’t be a thing on a laptop).
+]]>
+
+
+
+ https://cowboyprogrammer.org/2016/08/zopfli_all_the_things/
+
+ Compress all the images!
+ 2016-08-26T13:17:40+02:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ Update 2016-11-22: Made the Makefile compatible with BSD sed (MacOS)
+
+
One advantage that static sites, such as those built by Hugo,
+provide is fast loading times. Because there is no processing to be
+done, no server side rendering, no database lookups, loading times are
+just as fast as you can serve the files that make up the page. This
+means that bandwidth becomes the primary bottleneck, which
+incidentally is
+one of the factors used by Google to calculate your search ranking. See
+also
+Pagespeed Insights.
+
+
Compressing images
+
+
Because the largest pieces of a page typically consist of images, it
+stands to reason that if we can make the images smaller, we can make
+the page load faster. Luckily there exists methods that can compress
+images losslessly. That means that the quality stays exactly the
+same, the page only loads faster. That seemed like a no-brainer to me
+so I compressed all the images on the site using PNGout as
+advised by Jeff Atwood. I mean, who doesn’t
+like free bandwidth?
+
+
A new algorithm called Zopfli (open sourced by Google,
+also mentioned by Jeff) claims even better
+results than PNGout though. Results on this site’s images confirm
+those claims. Running the tool on images already compressed by
+PNGout gives output such as this:
+
./zopflipng --prefix="zopfli_" static/images/2014/Dec/Screenshot-from-2014-12-29-13-28-29.png
+Optimizing static/images/2014/Dec/Screenshot-from-2014-12-29-13-28-29.png
+Input size: 89420 (87K)
+Result size: 90361 (88K). Percentage of original: 101.052%
+Preserving original PNG since it was smaller
+
+./zopflipng --prefix="zopfli_" static/images/2014/Jun/Jenkins_install_git.png
+Optimizing static/images/2014/Jun/Jenkins_install_git.png
+Input size: 189406 (184K)
+Result size: 166362 (162K). Percentage of original: 87.834%
+Result is smaller
+
+./zopflipng --prefix="zopfli_" static/images/2014/Jun/jenkins_batch.png
+Optimizing static/images/2014/Jun/jenkins_batch.png
+Input size: 21933 (21K)
+Result size: 16255 (15K). Percentage of original: 74.112%
+Result is smaller
+
+./zopflipng --prefix="zopfli_" static/images/2014/Jun/jenkins_build_step.png
+Optimizing static/images/2014/Jun/jenkins_build_step.png
+Input size: 8184 (7K)
+Result size: 6809 (6K). Percentage of original: 83.199%
+Result is smaller
+
+./zopflipng --prefix="zopfli_" static/images/2014/Jun/jenkins_config_git.png
+Optimizing static/images/2014/Jun/jenkins_config_git.png
+Input size: 57897 (56K)
+Result size: 47164 (46K). Percentage of original: 81.462%
+Result is smaller
+
+
+
The first result in the example output shows a case where Zopfli would
+actually have made the file bigger (because it was already compressed
+by PNGout, remember). This is nothing you have to worry about because
+it’s actually smart enough that it simply copies the original file in
+that case.
+
+
Comparing to both before any compression, and PNGout, yielded the
+following results:
And this is with the default arguments. It is possible squeeze yet a
+couple of more bytes out of this if you’re willing to wait longer.
+
+
Automate it with Make
+
+
Another joy of using a simple static site is that it is possible to
+compose regular tools to do useful things. Tools like
+Make. And we can use Make to build the site, as well as
+compressing images which have not already been compressed. You could
+do it manually for each new image that you add of course but be
+honest, you know that you’re gonna forget to do it at some point. So
+let’s automate it instead!
+
+
This is the Makefile that I use to build this site with, note that
+public depends on $(PNG_SENTINELS), so I literally can’t forget to
+compress any new images added:
+
.PHONY: help build server server-with-drafts clean zopfli
+
+PNG_SENTINELS:=$(shell find . -path ./public -prune -o -name '*.png' -print | sed 's|\(.\+/\)\(.\+.png\)|\1.\2.zopfli|g')
+
+help:## Print this help text
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$'$(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
+
+server:## Run hugo server
+ hugo server
+
+server-with-drafts:## Run hugo server and include drafts
+ hugo server -D
+
+build: public ## Build site (will also compress images using zopfli)
+
+zopfli:$(PNG_SENTINELS)## Compress new images using zopfli
+
+clean:## Remove the built directory
+ @rm -rf public
+
+public:$(PNG_SENTINELS)
+ @rm -rf public
+ hugo
+
+# Zopfli sentinel rule, assumes zopflipng binary is in the same folder
+.%.png.zopfli: %.png
+ ./zopflipng --prefix="zopfli_" $<
+ @mv $(dir $<)zopfli_$(notdir $<) $<
+ @touch $@
+
+
+
For best performance, run make with parallel jobs (change 4 to your
+number CPUs): make -j4 zopfli.
+
+
To know which files have already been compressed without actually
+running Zopfli on it again (which takes a while), sentinel files are
+created with this pattern: .<imgfilename>.zopfli. Thus, the next
+time around, zopfli is only invoked for files which have not already
+been compressed, making it a one-time operation. And when everything
+has already been compressed, you’ll just get this:
+
make: Nothing to be done for 'zopfli'.
+
+]]>
+
+
+
+ https://cowboyprogrammer.org/2016/07/migrating_from_ghost_to_hugo/
+
+ Migrating from Ghost to Hugo
+ 2016-07-25T23:55:38+02:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ So I recently migrated this site from Ghost to Hugo
+after reading a nice article about the Hugo in
+Linux Voice #20 (funnily enough, the same issue also
+features an article about Ghost). I originally made the switch to
+Ghost from Jekyll back in 2014 or so mainly because I could
+not find a good theme to use. Ghost also seemed to have a lot of cool
+features and it’s fun to try new things.
+
+
I think it’s safe to say that I am hardly a prolific blogger. I mainly
+write about stuff which I personally cannot find on the web which I
+think should exist, because I will likely need it myself sometime in
+the future. So it’s hardly a surprise that I am not in the target
+audience for Ghost.
+
+
Things about Ghost which annoy me
+
+
+
It’s written in NodeJS — people who think JS is a good server
+language also tend to think that it’s a good idea to depend on just
+about any package, and download it in every single build. Which
+becomes really funny sometimes.
+
Poor selection of themes — this is subjective of
+course, but it seems to me that the free options don’t have much in
+terms of diversity. Heck, they even call it a marketplace which
+rubs me the wrong way.
+
Themes end up being quite reliant on JS if you want necessary
+features like syntax highlighting on code snippets — I often
+browse with JS disabled and should be able to view my own site.
+
Markdown parser treats newlines as significant — meaning you can’t
+have properly aligned paragraphs in your editor.
+
+
+
That last point irritates me deeply but it’s not as bad as the next point.
+
+
+
You can effectively lock an account by entering the wrong password 3
+times.
+
+
+
This requires some explanation. So Ghost, targeting teams of bloggers
+really, naturally have an account system much like Wordpress. Now, as
+I was surveying the security status of other services I am running, I
+was wondering how Ghost handled someone trying to brute force your
+account and decided to simply try it out. Type the wrong password once
+too many, and this happens:
+
+
+
+
It doesn’t lock it for a single IP address (I tried from several), it
+locks the entire account. Effectively, someone can just set up a
+script to try an account indefinitely simply with the intention to
+block someone from logging in.
+
+
The log doesn’t even show login attempts, so there is no way to
+implement sensible blocking strategies using something like fail2ban.
+
+
The whole thing left a bad taste my mouth so it was a very suitable timing to read an article on Hugo.
+
+
Things about Hugo which excite me
+
+
+
Markdown parser treats newlines correctly
+
It’s a static site generator and not a service — this meant 100MB
+(10%) of RAM became available on my server and there is no account
+to hack (or block).
+
Supports everything of Ghost (that I am aware of).
Can do server side syntax highlighting using Pygments.
+
Some really nice themes are available, and they are
+all free.
+
+
+
Migrating all data from Ghost
+
+
Migrating from Ghost also turned about to be really painless. There
+were several scripts around for exactly this but they all turned out
+to be written in odd languages, and did not actually
+migrate all the metadata in Ghost. So I wrote my own in Python with
+these killer features:
+
+
+
Migrates tags.
+
Migrates dates.
+
Migrates drafts as drafts.
+
Creates aliases in your posts which makes sure that old permalinks
+will still work!
+
Migrates cover pictures as banner images, just select a theme which
+support them.
+
Rewrites all relative links so they all still work (this includes
+images).
+
Code blocks with language definitions like ```language-java
+are changed to ```java.
+
+
#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+'''
+A simple program which migrates an exported Ghost blog to Hugo.
+It assumes your blog is using the hugo-icarus theme, but should
+work for any theme. The script will migrate your posts, including
+tags and banner images. Furthermore, it will make sure that
+all your old post urls will keep working by adding aliases to them.
+
+The only thing you need to do yourself is copying the `images/`
+directory in your ghost directory to `static/images/` in your hugo
+directory. That way, all images will work. The script will rewrite
+all urls linking to `/content/images` to just `/images`.
+'''
+
+importargparse
+importjson
+fromdatetimeimport date
+fromosimport path
+fromcollectionsimport defaultdict
+importre
+
+_post ='''
++++
+date = "{date}"
+draft = {draft}
+title = """{title}"""
+slug = "{slug}"
+tags = {tags}
+banner = "{banner}"
+aliases = {aliases}
++++
+
+{markdown}
+'''
+
+
+defmigrate(filepath, hugodir):
+ '''
+ Parse the Ghost json file and write post files
+ '''
+ withopen(filepath, "r") as fp:
+ ghost = json.load(fp)
+
+ data = ghost['db'][0]['data']
+
+ tags = {}
+ for tag in data["tags"]:
+ tags[tag["id"]] = tag["name"]
+
+ posttags = defaultdict(list)
+
+ for posttag in data["posts_tags"]:
+ posttags[posttag["post_id"]].append(tags[posttag["tag_id"]])
+
+ for post in data['posts']:
+ draft ="true"if post["status"] =="draft"else"false"
+ ts =int(post["created_at"]) /1000
+
+ banner =""if post["image"] isNoneelse post["image"]
+ # /content/ should not be part of uri anymore
+ banner = re.sub("^.*/content[s]?/", "/", banner)
+
+ target = path.join(hugodir, "content/post",
+ "{}.md".format(post["slug"]))
+
+ aliases = ["/{}/".format(post["slug"])]
+
+ print("Migrating '{}' to {}".format(post["title"],
+ target))
+
+ hugopost = _post.format(markdown=post["markdown"],
+ title=post["title"],
+ draft=draft,
+ slug=post["slug"],
+ date=date.fromtimestamp(ts).isoformat(),
+ tags=posttags[post["id"]],
+ banner=banner,
+ aliases=aliases)
+
+ # this is no longer relevant
+ hugopost = hugopost.replace("```language-", "```")
+ # /content/ should not be part of uri anymore
+ hugopost = hugopost.replace("/content/", "/")
+ hugopost = re.sub("^.*/content[s]?/", "/", hugopost)
+
+ withopen(target, 'w') as fp:
+ print(hugopost, file=fp)
+
+
+defmain():
+ parser = argparse.ArgumentParser(
+ description="Migrate an exported Ghost blog to Hugo")
+ req = parser.add_argument_group(title="required arguments")
+ req.add_argument("-f", "--file", help="JSON file exported from Ghost",
+ required=True)
+ req.add_argument("-d", "--dir", help="Directory (root) of Hugo site",
+ required=True)
+
+ args = parser.parse_args()
+
+ migrate(args.file, args.dir)
+
+
+if__name__=="__main__":
+ main()
+
+
+
Next post, I might write about what changes I made to the theme, and
+some nifty Nginx tricks you can use to stay compatible with old links.
+]]>
+
+
+
+ https://cowboyprogrammer.org/2016/05/set-refresh-rate-of-screen-from-script/
+
+ Set refresh rate of screen from script
+ 2016-05-18T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ Getting a great new 100 Hz Ultra Wide monitor does not come without its share of tweaking. So it turns out that the refresh you set on your monitor in Nvidia settings (as explained in a previous post does not apply to all the display ports. They apparently count as different screens with different settings or something.
+
+
So, here’s a handy script which you can add to your window manager’s autostart applications to set the refresh rate and resolution of your screen, regardless of which actual port you use:
+
#!/bin/bash -eu
+RES="3440x1440"
+RR="100"
+
+# Do for every output, so that it doesn't matter where you plug in
+# your monitor.
+for output in $(xrandr | grep "DP-" | sed -e "s/\(DP-.\).*/\1/"); do
+ echo"Trying to set mode on $output"
+ if xrandr --output "$output" --mode "$RES" -r "$RR"; then
+ echo"Success: $RES$RR Hz set on $output"
+ fi
+done
+
+
+
It iterates over all the display ports on your graphics card, so it doesn’t matter where you plug your monitor in.
+
+
In XFCE, you’d add this script to Application Autostart:
+
+
+]]>
+
+
+
+ https://cowboyprogrammer.org/2016/04/fixing-the-up-button-in-python-shell-history/
+
+ Fixing the up button in Python shell history
+ 2016-04-02T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ In case your python/ipython shell doesn’t have a working history, e.g. pressing ↑ only prints some nonsensical ^[[A, then you are missing either the readline or ncurses library.
+
+
+
+
Ipython is more descriptive that something is wrong, but if you’re in the habit of mostly using python as a quick calculator, you might never notice:
+
+
+]]>
+
+
+
+ https://cowboyprogrammer.org/2016/03/nvidia-gsync-on-linux/
+
+ Nvidia G-Sync and Linux
+ 2016-03-05T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ After getting a fancy new monitor with G-Sync support, I was eager to try it out in my Linux gaming setup. While Nvidia fully supports G-Sync in their Linux drivers, it turns out that other components of the system can get in the way. As explained by a post on the Nvidia forums:
+
+
+
For G-SYNC to work, the application has to be able to flip and the symptoms you’re describing here sound like it’s not able to flip in your configuration. There are a variety of reasons why flipping might not be working, but the most likely culprits here are either the compositor getting in the way, or the game not being completely full-screen. The full-screen requirement includes the game being completely unoccluded, so if your window manager is drawing something on top of the game, even just by one pixel, it will prevent flipping. Full-screen also means that it has to cover the entire X screen, which includes both monitors if you have them both enabled.
+
+
Can you please try a different window manager / desktop environment to see if the behavior changes?
+
+
+
Since only a minority of PC-gamers are actually on Linux, and only a minority of those actually have G-Sync capable monitors, Googling for assistance was… challenging. So, for any other Linux gamers out there, here is a short guide on how to enable G-Sync and verify that it works. Some of the steps are XFCE specific, as this is my window manager of choice on my gaming PC. If you are using a different window manager, you’ll have to look through your options to find the equivalent settings.
+
+
Nvidia settings
+
+
+
Sync to VBlank: Optional
+
Allow Flipping: Required
+
Allow G-SYNC: Required
+
Enable G-SYNC Visual Indicator: Optional
+
+
+
The only two required settings are flipping and G-Sync, the others are optional. Enabling Sync to VBlank (VSync) in combination with G-Sync only prevents the GPU from generating an FPS beyond your monitor’s max refresh rate (which you can’t see anyway). It is turned off below the max refresh rate when G-Sync is enabled.
+
+
The visual indicator is useful here to see that G-Sync is working. If all goes well, you should see a green “G-SYNC” text in the corner when running a game.
+
+
+
+
Disable compositor
+
+
As mentioned in the forum post, a compositor will prevent G-Sync from activating because essentially something is rendering above the game. The same reason prevents G-Sync from working in Window mode (unlike Windows, where G-Sync does not require fullscreen).
+
+
For XFCE, go to Window Manager Tweaks under Settings
+
+
+
Then under the Compositor tab, make sure the compositor is disabled
+
+
+
In addition, depending on your setup, make sure you don’t have things like Compton or Compiz enabled.
+
+
Start a game in fullscreen
+
+
As mentioned, you must run the game in fullscreen mode. G-Sync does not work with window mode in Linux.
+
+
I did notice that there are games which do not enable G-Sync. One example is “Cities: Skylines”. So make sure to try several games if you don’t see the G-Sync logo.
+
+
A good candidate here is Dota 2 since it is free to play. Dota 2 running in “Desktop-Friendly Fullscreen” does enable G-Sync. As does Portal 2 and XCOM 2.
+]]>
+
+
+
+ https://cowboyprogrammer.org/2014/12/encrypt-a-btrfs-raid5-array-in-place/
+
+ Encrypt a BTRFS RAID5-array in-place
+ 2014-12-28T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ When I decided I needed more disk space for media and virtual machine (VM) images, I decided to throw some more money at the problem and get three 3TB hard drives and run BTRFS in RAID5. It’s still somewhat experimental, but has proven very solid for me.
+
+
RAID5 means that one drive can completely fail, but all the data is still intact. All one has to do is insert a new drive and the drive will be reconstructed. While RAID5 protects against a complete drive failure, it does nothing to prevent a single bit to be flipped to due cosmic rays or electricity spikes.
+
+
BTRFS is a new filesystem for Linux which does what ZFS does for BSD. The two important features which it offers over previous systems is: copy-on-write (COW), and bitrot protection. See, when running RAID with BTRFS, if a single bit is flipped, BTRFS will detect it when you try to read the file and correct it (if running in RAID so there’s redundancy). COW means you can take snapshots of the entire drive instantly without using extra space. Space will only be required when stuff change and diverge from your snapshots.
+
+
See Arstechnica for why BTRFS is da shit for your next drive or system.
+
+
What I did not do at the time was encrypt the drives. Linux Voice #11 had a very nice article on encryption so I thought I’d set it up. And because I’m using RAID5, it is actually possible for me to encrypt my drives using dm-crypt/LUKS in-place, while the whole shebang is mounted, readable and usable :)
+
+
Some initial mistakes meant I had to actually reboot the system, so I thought I’d write down how to do it correctly. So to summarize, the goal is to convert three disks to three encrypted disks. BTRFS will be moved from using the drives directly, to using the LUKS-mapped.
+
+
Unmount the raid system (time 1 second)
+
+
Sadly, we need to unmount the volume to be able to “remove” the drive. This needs to be done so the system can understand that the drive has “vanished”. It will only stay unmounted for about a minute though.
+
+
sudo umount /path/to/vol
+
+
+
This is assuming you have configured your fstab with all the details. For example, with something like this (ALWAYS USE UUID!!)
+
+
# BTRFS Systems
+UUID="ac21dd50-e6ee-4a9e-abcd-459cba0e6913" /mnt/btrfs btrfs defaults 0 0
+
+
+
Note that no modification of the fstab will be necessary if you have used UUID.
+
+
Encrypt one of the drives (time 10 seconds)
+
+
Pick one of the drives to encrypt. Here it’s /dev/sdc:
+
+
sudo cryptsetup luksFormat -v /dev/sdc
+
+
+
Open the encrypted drive (time 30 seconds)
+
+
To use it, we have to open the drive. You can pick any name you want:
+
+
sudo cryptsetup luksOpen /dev/sdc DRIVENAME
+
+
+
To make this happen on boot, find the new UUID of /dev/sdc with blkid:
+
+
sudo blkid
+
+
+
+
+
So for me, the drive has a the following UUID:f5d3974c-529e-4574-bbfa-7f3e6db05c65. Add the following line to /etc/crypttab with your desired drive name and your UUID (without any quotes):
The final step is to remove the old drive. We can use the special name missing to remove it:
+
+
sudo btrfs device delete missing /path/to/vol
+
+
+
This can take a really long time, and by long I mean ~15 hours if you have a terrabyte of data. But, you can still use the drive during this process so just be patient.
+
+
+
+
For me it took 14 hours 34 minutes. The reason for the delay is because the delete command will force the system to rebuild the missing drive on your new encrypted volume.
+
+
Next drive, rinse and repeat
+
+
Just unmount the raid, encrypt the drive, add it back and delete the missing. Repeat for all drives in your array. Once the last drive is done, unmount the array and remount it without the -o degraded option. Now you have an encrypted RAID array.
+]]>
+
+
+
+ https://cowboyprogrammer.org/2014/08/making-an-rss-reader-app/
+
+ Making an RSS reader app
+ 2014-08-28T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ So I’ve been busy building my own RSS reader for the last few weeks. My motivation to make this app is because I got angry at gReader for displaying fullscreen-ads. The source is available on GitHub.
+
+
I started with an idea of targeting Android-L, but because it’s only in preview any app targeting L will be completely incompatible with earler versions. Hence I was forced to refrain from using the new RecyclerView which I really liked. In general I’ve been stealing as much code as possible from the Google-IO app.
+
+
It’s early still, but here are two screenshots of current progress:
+
+
+
+
+
+
To parse RSS feeds I have forked Simplistic-RSS by ShirwaM. To display images I am using Picasso by Square (awesome library). I don’t have any intention of uploading this app to the Play store at this time, at least not until I feel that it is fairly stable and feature complete. I am building it all for myself as this is the only kind of app which I actually use everyday. I figure I can talk about the difficulties that I encounter and how to solve them. So today’s topic will be:
+
+
Displaying formatted text with images
+
+
RSS feeds generally have stories formatted in HTML. For example, see the RSS feed of this blog. This is good because it means all we need to do is decode it and display it. You could use a WebView, but that would be unacceptably ugly and disgusting for an app of mine. A nicer solution is to use a normal TextView. You can actually format HTML easily and display it with:
This simple act gets you most of the way. Here’s what a story looks like with this:
+
+
+
+
+
+
Notice that in the first image, the image is missing and you don’t see that there is a list in the beginning. In the second image, the source code has no special formatting and it’s hard to tell when it starts or stops.
+
+
fromHtml is great, but it is missing functionality to handle some tags. Lucky for us, it is possible to hand it some tagHandlers for those cases. Because I am downloading images, I do the formatting in a background thread using a Loader. To this end I created the ImageTextLoader. What it does instead is:
Where the imageHandler is really simple (notice that I use Picasso to get the image from the network):
+
imgThing =new Html.ImageGetter(){
+ /**
+ * This methos is called when the HTML parser encounters an
+ * <img> tag. The <code>source</code> argument is the
+ * string from the "src" attribute; the return value should be
+ * a Drawable representation of the image or <code>null</code>
+ * for a generic replacement image. Make sure you call
+ * setBounds() on your Drawable if it doesn't already have
+ * its bounds set.
+ *
+ * @param source
+ */
+ @Override
+ public Drawable getDrawable(final String source){
+ Drawable d =null;
+ try{
+ final Bitmap b = Picasso.with(appContext).load(source).get();
+ // Get original size
+ int w = b.getWidth();
+ int h = b.getHeight();
+ // Shrink if big
+ if(w > maxSize.x|| h > maxSize.y){
+ Point newSize = scaleImage(w, h);
+ w = newSize.x;
+ h = newSize.y;
+ }
+ // Need to return a drawable
+ d =new BitmapDrawable(appContext.getResources(), b);
+ d.setBounds(0,0, w, h);
+ }catch(IOException e){
+ Log.e("JONAS",""+ e.getMessage());
+ }
+ return d;
+ }
+ };
+
+
+
The tag handler contains a bit more code, and I won’t paste all of it here. The tags which are handled can be seen in handleTag:
Note that fromHtml only notifies your handler about img-tags when they have ended, so I use that to insert a newline after each image. I would have liked to use it to get the configured size of the image, but that will have to wait for another day. For code-tags, I reduce the size of the text and make it Monospace:
+
// Source code
+privatevoidhandleCode(final Editable text,
+ finalboolean start){
+ // Should be monospace
+ if(start){
+ start(text,new Monospace());
+ start(text,new RelativeSize());
+ }else{
+ end(text, Monospace.class,
+ new TypefaceSpan("monospace"));
+ end(text, RelativeSize.class,
+ new RelativeSizeSpan(0.8f));
+ }
+}
+
+
+
The start and end methods were simply stolen straight from android.Html.
+
+
Result
+
+
Here’s the result using the added tagHandlers:
+
+
+
+
+
+
Handling clicks on links
+
+
Thankfully I had already solved the issue of clickable spans in NoNonsense Notes. See [ReaderFragment]() for this:
+
// Catch clicks on links
+mBodyTextView.setOnTouchListener(new View.OnTouchListener(){
+ @Override
+ publicbooleanonTouch(final View v,
+ final MotionEvent event){
+ TextView widget =(TextView) v;
+ Object text = widget.getText();
+ if(text instanceof Spanned){
+ Spanned buffer =(Spanned) text;
+
+ int action = event.getAction();
+
+ if(action == MotionEvent.ACTION_UP||
+ action == MotionEvent.ACTION_DOWN){
+ int x =(int) event.getX();
+ int y =(int) event.getY();
+
+ x -= widget.getTotalPaddingLeft();
+ y -= widget.getTotalPaddingTop();
+
+ x += widget.getScrollX();
+ y += widget.getScrollY();
+
+ Layout layout = widget.getLayout();
+ int line = layout.getLineForVertical(y);
+ int off = layout.getOffsetForHorizontal(line, x);
+
+ ClickableSpan[] link =
+ buffer.getSpans(off, off, ClickableSpan.class);
+
+ // Cant click to the right of a span,
+ // if the line ends with the span!
+ if(x > layout.getLineRight(line)){
+ // Don't call the span
+ }elseif(link.length!=0){
+ link[0].onClick(widget);
+ returntrue;
+ }
+ }
+ }
+ returnfalse;
+ }
+ });
+
+
+
Thus clicking on links in the TextView will open them in the browser. You could do whatever you want instead of calling link[0].onClick() however.
+
+
That’s it for today. I’ll write more about other pieces of the app soon. Things like how the database is structured or how to use ExpandableListView.
+]]>
+
+
+
+ https://cowboyprogrammer.org/2014/06/building-python-wheels-for-windows/
+
+ Building Python wheels for Windows
+ 2014-06-04T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+
+
+ One group in particular suffers from lack of package management in Windows (as I griped about here): developers. This post will largely be a big howto on how to build Python packages with Fortran/C-extensions (especially Fortran extensions seem problematic on Windows). You’d think that something like that would be clearly explained somewhere. So did I, and I was wrong. So here is my guide to building Python packages with native extensions (both C and Fortran) on Windows.
+
+
Installing Python packages
+
+
The lack of a compiler means most Windows users can’t do what *nix users do when faced with a package containing some c or fortran extensions:
+
+
python setup.py install
+
+
+
Or if it’s publicly available on PyPi for example:
+
+
pip install package
+
+
+
pip will download the source, and on any system with a compiler, compile it, then install it. So it becomes necessary to provide pre-built binaries for Windows users who don’t have a compiler. Something which no one offers a concise explanation of… until now that is. If you upload your package to PyPi, once you have followed this guide, even Windows users will be able to do pip install package.
+
+
1. Set up a Windows machine
+
+
To build Windows binaries you will need access to a Windows machine. If you don’t have a copy of Windows lying around to install in a virtual machine, you can create a free virtual machine on Amazon with Windows Server 2012. Selecting the most basic options will be fine and the machine will be free for atleast a year, at which point you can pay the few dollars per year or register for another free account.
+
+
Another note: make sure to use 64-bit Windows (Server 2012 only comes in 64-bit versions).
+
+
2. Install 32-bit compilers
+
+
Don’t ask me why Microsoft didn’t want to ship the 64-bit compiler together with the 32-bit one… The versions here are final. You cannot use newer compilers. In other words, don’t get Visual Studio 2012 and expect it to work… It’s a simple fact that you need to compile your packages with the same compiler as was used to build Python itself.
+
+
Install Visual C++ 2010 Express (for Python3)
+
+
Python3.3⁄3.4 is built with 2010 and hence all extensions must be as well.
For building Python2.7, 2008 version is required. Google for “Visual C++ 2008 Express” or try this link
+
+
3. Install 64-bit compilers
+
+
Why did you do this Microsoft, why?!
+
+
Install the Windows SDK for Visual Studio 2010 (for Python 3)
+
+
The free Visual C++ 2010 Express compiler does not include 64-bit support. That is what we need the SDK to provide. Google for “Microsoft Windows SDK for Windows 7 and .NET Framework 4” or try this link. You need the Windows 7 SDK even if you are running Windows 8. And make sure it is the version with .NET Framework 4, the one with .NET Framework 3 is for Visual Studio 2008.
+
+
Note: if you have C++ 2010 Redistributables installed, you might have
+to uninstall them first or this install might fail. It might work even if some parts of the installer fails since you only need the compiler bits.
+
+
Install the Windows SDK for Visual Studio 2008 for (Python 2.7)
+
+
Same story for Visual C++ 2008 Express which is used for Python2.7. Find “Microsoft Windows SDK for Windows 7 and .NET Framework 3.5” or try this link
Download both the 32-bit and 64 bit versions. Python2 or Python3 versions do not matter as we will be using conda environments, but you do need both 32-bit and 64-bit versions! During the installation procedure, I recommend you select the following:
+
+
+
Install for current user only (this is the default)
+
Install into: Users\YOURNAME\Anaconda and Users\YOURNAME\Anaconda-64 respectively
+
Do NOT modify the PATH, this will be done explicitly in the build script
+
Do NOT make it the default Python, we need to be able to switch easily
+
+
+
5. Create the environments
+
+
Do this for both the 32-bit and 64-bit versions.
+
+
Open a command line window and navigate to Users\YOURNAME\Anaconda\Scripts (and same for Anaconda-64 later) (Protip: use the file browser to get to the directory then shift-click
+somewhere and select ‘open command line here’).
Remember to repeat that process for the 64-bit/32-bit version as well!
+
+
6. Install git
+
+
This has nothing to do with the build process, but I will assume that you want to do git clone at some point. Download it here. In this case you absolutely DO want it to modify your PATH.
+
+
Actually building stuff
+
+
Believe it or not, but you are actually ready to compile your package. Due to multiple compilers and all that, I have made a bat-file which builds wheels for Python 2.7, 3.3 and 3.4, both for 32-bit and 64-bit:
+
+
+
+
Edit the information at the top. Now assuming everything was installed in the right place, you should just have to double click the bat-file and have built the wheel files which you can then upload to PyPi.
+
+
Building wheels automatically on commits
+
+
Having to do this manually is a drag and so I have also come up with a fully automated solution using Jenkins, a continuous integration system which monitors your git-repo and clones, builds new files as changes are committed.
+
+
Install Jenkins
+
+
Just download the native package from [jenkins-ci.org]().
+
+
Configure Jenkins
+
+
Once Jenkins is installed, it will start itself as a Windows service. Open you web browser and head to [http://localhost:8080](). You then want to go to Manage Jenkins, followed by Manage Plugins:
+
+
+
+
Go to the available tab, and filter on “GIT plugin” (already installed in the screenshot):
+
+
+
+
OK, now go back to the top (click Jenkins in upper left) and create a New Item. You want to select “free-style software project” and give it a name:
+
+
+
+
First thing you need to configure is the git source. Scroll down to Source Code Management, select git, and fill in the repo-address. If you input a public GitHub address you don’t need any credentials:
+
+
+
+
I also recommend you add one Additional behaviour: Clean before checkout to guarantee that builds do not affect each other:
+
+
+
+
Next you can setup the automatic behaviour. The easiest way is to have Jenkins poll GitHub every X minutes and check if there’s a change. Here I have configured Jenkins to check every 15 minutes:
+
+
+
+
So Jenkins knows what to do when it detects a change, you want to add a Build step, specifically Execute a Windows batch file:
+
+
+
+
In the box, just copy paste the batch file I included above. Fill in the paths to your Anaconda installs and set the repo to:
+
+
set PKG_REPO=.
+
+
+
+
+
Jenkins will handle the cloning and simply execute the script in the correct directory. As a final configuration step, tell Jenkins to archive build artifacts under Post-Build Actions since you want to be able to download the wheel files:
+
+
+
+
If you don’t upload wheels to PyPi, then you can install wheels with pip from anywhere with:
Now you’re all done. You can manually trigger builds in the left menu. Each build will have links for you to download the wheelfiles and the job’s main page will always display the links to the latest artifacts.
+
+
+
+
There are so many plugins and options available for Jenkins so play around if you want even more stuff. Some things you can do include:
+
+
+
Automatically uploading artifacts to an FTP/SSH-server.
+
Sending E-mail notifications on success/failures.
+
Build only specific branches/tags.
+
Make the server public and tie login to GitHub accounts.
+]]>
+
+
+
+ https://cowboyprogrammer.org/2014/05/people-have-been-trained-to-install-malware/
+
+ People have been trained to install malware
+ 2014-05-11T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ disclaimer: I get angry when I have to fix Windows. Expect explicit content. You have been warned.
+
+
Being computer literate can be something of a curse. Anyone with even the most rudimentary skill set has probably sometime gotten asked if they could help someone with their computer. The other day I got asked if I could help, let’s call him Roger, as he was having some problems with Windows Update. The initial symptoms could be clearly relayed by Roger:
+
+
+
The update gets to 30% then it just stops and reboots.
+
+
+
First step is always to recreate the problem and see it in action. No problem there. Telling Windows Update to proceed resulted in precisely the described result, after a fair bit of time waiting for a frigging restore point to be created. I’d read about the failing 8.1 upgrade so I half expected it to be Microsoft’s fault, even though this machine was running Windows 7. Roger didn’t need anything from the update so worst case I thought, I’ll just disable Windows Update entirely.
+
+
First things first
+
+
Once I had confirmed that there was a problem, I begun by clearing out various crapware that was installed, mainly different kinds of toolbars and some video player that seemed to be a repackaging of VLC mainly. It’s hard to see why this software is installed or where it came from. Roger uses only Word and the browser. I figure he’s the sort that clicks on various malicious ads for some reason. At least Roger has been coerced into using Chrome instead of IE…
+
+
So I uninstall everything I don’t recognize and reboot, because rebooting is something you do a lot in Windows land… OK, maybe the update will work now without all the crap installed. It’s worth a try at least.
+
+
+
Initiate the update… It creates a restore point… wait… wait… wait…. Reboot. Update still fails at 30%.
+
+
+
Trial and error
+
+
Now the real work begins. Maybe Microsoft screwed up their patches or something? There were 5 security patches waiting to be installed so let’s try them one by one.
+
+
+
First one fails.
+
Second one fails.
+
Everyone but the first and second one fails.
+
+
+
OK… Let’s just do the damn IE patches first. They also fail. And for every try, I’m forced to wait for Windows to create another damn restore point which takes several minutes. This on an almost brand new Intel NUC with an SSD.
+
+
Bored…
+
+
While waiting for the damn restore points, I am seriously considering if I can just wipe the machine and force Roger to use Linux instead. All he needs is Word. So I decide to download LibreOffice and see how their docx support is these days. Downloading 200MB takes a while on the effectively 2MBit connection. Still quicker than the now cancelled restore point. So I click through the installer, get to the progress bar, and wait. And wait. And wait.
+
+
+
Why the fuck isn’t the progress bar moving?
+
+
+
Instinctively, I open the task manager to see what the hold up is. Apparently nothing. No CPU is being used. No memory is consumed. It’s an SSD so disk speed is not an issue. Change to the services tab and same thing, nothing obvious. I try disabling the antivirus (Microsoft’s own so should be compatible right?). Good try chump, still no difference.
+
+
Second time in the task manager, I notice something though. A service which doesn’t really sound very official: safetynut. I find out where safetynut.exe lives and sure enough, it lives in something like:
+
+
+
C:\Program Files (x86)\Movie Toolbar\Safetynut
+
+
+
But I uninstalled that! Fine.. End process. To which Windows replies:
+
+
+
You don’t have permission to end this process
+
+
+
W T F
+
+
OK computer, I’m going to stop you right there. I am the administrator. I am your GOD. And as said deity, I command you to end that process!
+
+
+
God or no god, you still don’t have permission to do that
+
+
+
OK, fine, be that way. Delete C:\Program Files (x86)\Movie Toolbar\Safetynut.
+
+
+
Could not delete safetynut.dll as it is in use
+
+
+
Shaka, when the walls fell…
+
+
It’s an amazing “feature” in Windows that a program can lock a file and thus prevent you from deleting it. It’s also an amazing “feature” that the administrator can be refused the permission to do something. No recourse left but to reboot into safe mode.
+
+
To safe mode we go!
+
+
First, I go into the normal safe mode with a desktop. Still can’t delete the dll file though as it is “in use”. Time to open regedit and delete all references to safetynut from the registry. Search, delete. Rince, repeat…
+
+
Next reboot to safe mode with only a command line window. Navigate to the folder and delete the file and the folder, then reboot.
+
+
Success!
+
+
No more safetynut. Let’s try Windows Update again. Ooh, that’s a mighty fast restore point creation! And the update succeeds!
+
+
So apparently, safetynut was actively preventing Windows Update from proceeding. Roger promptly got a stern talking to about installing any software or clicking on ads/popups (I also installed adblock plus in Chrome). But it got me thinking about malware in general..
+
+
Most people are trained to install malware
+
+
In my view, none of this is the user’s fault. The fact is that Microsoft has trained everyone to install shitty software from untrusted sources. Let’s go back a few years, to the days of yore, in the time of Windows 98 and Windows 2000. If you reinstalled Windows back then, and I did a lot, then you very quickly got a routine for downloading the software you needed once Windows was installed.
+
+
First obvious things to install were the drivers for your network card, sound card and graphics card. You even possibly needed to install SATA-drivers during the actual install or the installer wouldn’t find your disk. If you did not have that on a floppy, you were screwed. But OK, you had your floppy, and you had your drivers on CD. Next you needed:
+
+
+
A browser, because Internet Explorer is still a gaping security hole
+
A firewall, because even up to XP, being exposed to the internet directly meant instant infection
+
Antivirus, anything that wasn’t Norton would do…
+
PDF-reader
+
zip/rar-extractor
+
+
+
I’d like to draw your attention to the last item. Something so mundane as a zip-extractor was not built in to Windows. XP was the first version (if I remember correctly) to include a built in zip-extractor. This specific flaw trained everyone to download Winzip or Winrar. Quite possibly, they would resort to getting a pirated serial key as well. The problem? Now users are trained to go to any website their 10-year old neighborhood tech support kid tells them to and click Download.
+
+
Here’s a screenshot of the pirate bay to illustrate (to clarify, do NOT download your software from torrent sites. It’s just an example of this behavior). The big download buttons will lead to ads, online poker or who knows. We can be quite sure that they will lead to endless evil. On the internet, never FUCKING EVER press a big styled button with the text “Download”. The link you want is the smaller green text: “get this torrent”.
+
+
+
+
Now, assuming you managed to avoid the big download buttons to download your program, you have your completely unverified .exe file or .msi file, you double click on it, and what do you get? More fucking bullshit. Here’s a screenshot of the Winzip (totally unnecessary program today) installer. Right after you agree to the Winzip Terms of Service, you get another license agreement.
+
+
+
+
How the screaming fuck are ordinary users supposed to understand that pressing Next will lead to untold horrors and pressing Decline is the way to install the software they want? They won’t of course. That’s the whole point!
+
+
I bet this is the source of 99% of all malware on Windows. And the problem is that this is a perfectly acceptable way of getting software. Macs have the same problem to some minor extent. They are also being trained to download strange files from various pages. It is NOT accepted on Linux. The reason you don’t need antivirus on Linux is not because the system is more secure. All software is brittle and insecure. The vital difference is in how Linux users get their software.
+
+
The way it should be
+
+
Here’s a screenshot of the package manager in Debian:
+
+
+
+
Now let’s say I need a c++ compiler and one was not installed already. I search for “c++ compiler” and there’s clang. To this day, I have no idea how I can get a compiler on Windows.
+
+
+
+
Installing 99% of all software is super easy and reliable on Linux. All of these packages have been checked by the people working on the distro. If any package were to install a toolbar or other malware, you can bet your ass that it would be removed from the official sources. And because this is how Linux users are trained to install their software, they will have some degree of suspicion against download links on unknown websites. Installing malware becomes notably harder than installing good software.
+
+
The coming app stores
+
+
Both OS X and Windows are trying to push their users to use their “app stores”. While I have many negative things to say about them, they should hopefully reduce the included malware problem and train users to only install garbage from trusted sources.
+]]>
+
+
+
+ https://cowboyprogrammer.org/2014/04/are-ipads-retarding-us/
+
+ Are iPads actually a step back?
+ 2014-04-26T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ Think what you will of the iPad, but it has been a huge success for Apple and people love it. It’s one of the few products that appealed (past-tense) to both the geeks and _hoi polloi_.
+
+
I remember watching the keynote where the iPhone was introduced and immediately I thought that’s the pad from Star-Trek TNG! I had to have it.
+Apple’s initial carrier exclusivity deals meant I had to wait for the iPhone 3g. Not only that, but because they partnered with a company I am sworned to destroy, I payed a guy in Italy to buy one unlocked and ship it to me for 7500SEK. Funny thing is that at the time I was a developer at Sony Ericsson, who did not think kindly of Apple entering their mobile domain. I got a lot of weird looks a work…
+
+
Then came the iPad. Again I’m thinking holy shit that’s awesome. At this point I had upgraded to an Android device (an HTC Legend) and had come to the conclusion that Android was far more interesting as a platform because of Apple’s restrictions on what apps can do. The customizability and capabilities on Android were far greater and as a developer, you appreciate that. However, there were no Android tablets. And there wouldn’t be for a long time.
+
+
I kept my cool though and managed to hold on to my money until the iPad 2 was released. I left early from work and lined up with other enthusiasts at the electronics store. At the time most people had no idea what they were going to do with it, me included, but I had to have it. I think my extended family clearly demonstrates how successful a product the iPad was. That same year I saw 3 iPads being gifted away (3 in a group of around 9 people!). By the next year, 3 more iPads were acquired. Everyone had to have one. It was one of those cases where you don’t get it until you see it for yourself.
+
+
From revolutionary to evolutionary
+
+
It is both a sign of how good the original product was and how little has changed that I never felt a reason to upgrade from the iPad 2.
+
+
+
The battery life was fantastic.
+
The screen size just right.
+
The resolution was good enough.
+
The speed was fine (until recently).
+
+
+
Hardware-wise, it was feature complete. The rest could be fixed in software. They never did though. The problem is iOS. Just as I abandoned the iPhone for Android, I now abandoned the iPad for a Nexus 7. There was so much potential being held back by the limitations of iOS.
+Stratechery explains some of my frustrations well. He means it as a defense in iOS’s favor though. But there is actually more to it than the limitations of iOS. Something inherent in the touch screen and the current mobile paradigm.
+
+
Limitations of the touch screen
+
+
I was playing R-Type 2 on my Nexus 10 and kept dying on the boss in the second level. And I realized that while I might get lucky and finish the level, I would never be able to play the game well due to the touch screen.
+
+
+
+
See, R-Type is a classic side-scrolling shoot-em-up. You pilot a spaceship and have to avoid enemy fire, hordes of enemies, and not crash into the roof or ceiling. It is a game based entirely on mastering the controls. You can see a good example of what I mean in this clip of a similar game called Gradius for the NES.
+
+
+
+
The problem I was having was that I kept crashing into the floor as I tried to manouever around the boss. Having played for and hour or two (and still being stuck on level 2!) I came to realize that it wasn’t I that sucked, it was the controls. I had reached the limit of what was possible (precision-wise) with a touch screen.
+
+
Noobs forever
+
+
And this is where the back-stepping begins. Growing up with NES, SNES, and a PC, I remember many older relatives noting the dexterity and precision in the thumbs of kids due to all the gaming. Video games required:
+
+
+
hand-eye-coordination
+
hand dexterity
+
concentration
+
+
+
To beat these games you needed mastery and focus. Not only was mastery required, it was the reward. The games suitable for touch screens can require neither. So tablet games will remain at a level no more advanced than snake or scrabble. (As a side note, what really can work is turn-based strategy games.)
+
+
No such thing as a touch typist
+
+
Just as serious gaming becomes impossible due to the touch interface, serious productivity suffers from the same limitations. It’s funny to see things like Microsoft Office being released for the iPad because it’s impossible to work with. Serious productivity requires the efficient inputting of language, be it English or Python. The touch keyboard is unable to let you do that. There is no such thing as a touch typist. On a tablet, everyone goes back to tapping with two fingers. There is nothing to master here (due to the lack of feedback) and so everyone will remain as noobs forever.
+
+
The dark age begins
+
+
Maybe you’re thinking to yourself:
+
+
+
so what if a touch screen isn’t ideal for everything, no input device is!
+
+
+
If you are, then I agree. Nothing can be great at everything. You use the right tool for the right job. The problem is the tremendous success of the tablet. This is where I think the geeks have a different view of where we are headed.
+
+
Geeks see the benefits of the touch screen. Its strengths, but also its weaknesses. They use it when it’s convenient. For more serious work, they move to their workstation, with keyboard and screen.
+
+
Non-geeks see the tablet as “the future”. They never liked their PC to begin with. It was just something they were forced to acquire to be able to pay their bills. They see the tablet as liberating. Geeks see the tablet as confining.
+
+
The success of the tablet amongst geeks and non-geeks combined means companies are scrambling to push everything into tablet interfaces. Apple is clearly moving towards iOS as OSX is evolving. Microsoft has already gone too far:
+
+
+
+
+
But it’s not just the tablet interface. It’s the whole mobile paradigm that is spreading. With it comes the app stores, where every app is pre-approved by the benevolent corporation that owns your soul apps and music. The corporation reserves the right to remove any app or in-app purchase it deems unworthy of your attention. Amazon did it, Apple does it all the time, and same for Microsoft.
+]]>
+
+
+
+ https://cowboyprogrammer.org/2014/04/advertising-thats-not-intrusive-orly/
+
+ Advertising, that's not intrusive. Orly?
+ 2014-04-07T00:00:00+00:00
+
+ Space Cowboy
+ jonas@cowboyprogrammer.org
+
+
+
+ When you have apps in Google Play (and I imagine, other App stores as well), the amount of spam you receive instantly goes up by a factor of 10. Google’s spam filters are pretty well trained but every now and again something gets through.
+
+
Advertising opportunity
+
+
Today’s piece of bullshyt (I really meant to spell it like that) reads as follows (my emphasis):
+
+
+
Our premium advertisers are currently looking to buy android traffic at a very high price in apps like Nononsense Notes.
+
+
We think you can generate up to $10 CPM with their full screen ads, which are very clean. Indeed, most of our advertisers are willing to pay, on average, between $1 and $3 per installation. You’re free to display these ads whenever you want in your app so that it’s not intrusive.
+
+
+
Ads are by definition intrusive. That’s how they nag you into buying their stupid stuff. And it doesn’t matter how clean your ads are. Displaying them fullscreen is beyond intrusive. It is down right offensive.
+
+
I uninstall anything that displays obnoxious ads, be they fullscreen or notifications, and promptly give the app a one star review. I sincerely hope others afford me the same “courtesy” for my apps.
+]]>
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/cowboyprogrammer_feed.json b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/cowboyprogrammer_feed.json
new file mode 100644
index 000000000..251547eb0
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/cowboyprogrammer_feed.json
@@ -0,0 +1,103 @@
+{
+ "version": "https://jsonfeed.org/version/1",
+ "title": "Cowboy Programmer",
+ "home_page_url": "https://cowboyprogrammer.org/",
+ "author": {
+ "name": "Space Cowboy",
+ "avatar": "https://cowboyprogrammer.org/css/images/avatar.png"
+ },
+ "icon": "https://cowboyprogrammer.org/css/images/logo.png",
+
+ "items": [
+
+ {
+ "id": "https://cowboyprogrammer.org/2018/03/fixed-vs-variable-interest-rates/",
+ "url": "https://cowboyprogrammer.org/2018/03/fixed-vs-variable-interest-rates/",
+ "title": "A comparison between fixed and variable interest rates",
+ "content_html": "\u003cp\u003eThe data I am using is originally from \u003ca href=\"http://hypotek.swedbank.se/rantor/historiska-rantor/\"\u003eSwedBank\u003c/a\u003e and all data and\ncode is available at \u003ca href=\"https://gitlab.com/spacecowboy/swedish-interest-rates\"\u003eGitLab\u003c/a\u003e. \u003ca href=\"https://gitlab.com/spacecowboy/swedish-interest-rates/raw/master/swedish_interest_rates.csv\"\u003eThe data\u003c/a\u003e contains interest\nrates at 5 years fixed term, 2 years fixed term, and 3 months fixed\nterm (also called variable rate in Sweden) for those dates when any\nrate was changed. The first rates are from 1989-11-01 and the last are\nfrom 2018-02-12. Example of the data:\u003c/p\u003e\n\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n \u003cthead\u003e\n \u003ctr style=\"text-align: right;\"\u003e\n \u003cth\u003e\u003c/th\u003e\n \u003cth\u003e5y\u003c/th\u003e\n \u003cth\u003e2y\u003c/th\u003e\n \u003cth\u003e3m\u003c/th\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003eDate\u003c/th\u003e\n \u003cth\u003e\u003c/th\u003e\n \u003cth\u003e\u003c/th\u003e\n \u003cth\u003e\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003cth\u003e1989-11-22\u003c/th\u003e\n \u003ctd\u003e13.50\u003c/td\u003e\n \u003ctd\u003e13.50\u003c/td\u003e\n \u003ctd\u003e12.75\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e1991-01-14\u003c/th\u003e\n \u003ctd\u003e14.00\u003c/td\u003e\n \u003ctd\u003e14.75\u003c/td\u003e\n \u003ctd\u003e15.25\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e1993-01-13\u003c/th\u003e\n \u003ctd\u003e12.75\u003c/td\u003e\n \u003ctd\u003e13.00\u003c/td\u003e\n \u003ctd\u003e13.75\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e1994-11-21\u003c/th\u003e\n \u003ctd\u003e11.75\u003c/td\u003e\n \u003ctd\u003e11.50\u003c/td\u003e\n \u003ctd\u003e9.75\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e1996-03-12\u003c/th\u003e\n \u003ctd\u003e9.85\u003c/td\u003e\n \u003ctd\u003e8.95\u003c/td\u003e\n \u003ctd\u003e9.10\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e2005-09-09\u003c/th\u003e\n \u003ctd\u003e3.55\u003c/td\u003e\n \u003ctd\u003e2.97\u003c/td\u003e\n \u003ctd\u003e3.15\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e2005-10-03\u003c/th\u003e\n \u003ctd\u003e3.69\u003c/td\u003e\n \u003ctd\u003e3.09\u003c/td\u003e\n \u003ctd\u003e3.15\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e2007-12-21\u003c/th\u003e\n \u003ctd\u003e5.36\u003c/td\u003e\n \u003ctd\u003e5.25\u003c/td\u003e\n \u003ctd\u003e5.15\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e2008-01-24\u003c/th\u003e\n \u003ctd\u003e5.13\u003c/td\u003e\n \u003ctd\u003e4.94\u003c/td\u003e\n \u003ctd\u003e5.15\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e2009-03-20\u003c/th\u003e\n \u003ctd\u003e4.26\u003c/td\u003e\n \u003ctd\u003e2.83\u003c/td\u003e\n \u003ctd\u003e2.20\u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003cp\u003eTo make the calculations more convenient I assume that loans are only\nfixed the first day of the month. Example:\u003c/p\u003e\n\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n \u003cthead\u003e\n \u003ctr style=\"text-align: right;\"\u003e\n \u003cth\u003e\u003c/th\u003e\n \u003cth\u003e5y\u003c/th\u003e\n \u003cth\u003e2y\u003c/th\u003e\n \u003cth\u003e3m\u003c/th\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003eDate\u003c/th\u003e\n \u003cth\u003e\u003c/th\u003e\n \u003cth\u003e\u003c/th\u003e\n \u003cth\u003e\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003cth\u003e1990-06-01\u003c/th\u003e\n \u003ctd\u003e14.50\u003c/td\u003e\n \u003ctd\u003e14.50\u003c/td\u003e\n \u003ctd\u003e13.95\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e1992-03-01\u003c/th\u003e\n \u003ctd\u003e12.50\u003c/td\u003e\n \u003ctd\u003e13.00\u003c/td\u003e\n \u003ctd\u003e14.75\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e1993-06-01\u003c/th\u003e\n \u003ctd\u003e10.75\u003c/td\u003e\n \u003ctd\u003e10.50\u003c/td\u003e\n \u003ctd\u003e11.50\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e1998-02-01\u003c/th\u003e\n \u003ctd\u003e6.70\u003c/td\u003e\n \u003ctd\u003e6.40\u003c/td\u003e\n \u003ctd\u003e5.80\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e2001-09-01\u003c/th\u003e\n \u003ctd\u003e6.55\u003c/td\u003e\n \u003ctd\u003e5.95\u003c/td\u003e\n \u003ctd\u003e5.90\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e2004-11-01\u003c/th\u003e\n \u003ctd\u003e4.85\u003c/td\u003e\n \u003ctd\u003e3.90\u003c/td\u003e\n \u003ctd\u003e3.65\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e2009-05-01\u003c/th\u003e\n \u003ctd\u003e4.15\u003c/td\u003e\n \u003ctd\u003e2.73\u003c/td\u003e\n \u003ctd\u003e1.97\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e2010-08-01\u003c/th\u003e\n \u003ctd\u003e3.99\u003c/td\u003e\n \u003ctd\u003e2.90\u003c/td\u003e\n \u003ctd\u003e2.17\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e2011-05-01\u003c/th\u003e\n \u003ctd\u003e5.29\u003c/td\u003e\n \u003ctd\u003e4.39\u003c/td\u003e\n \u003ctd\u003e3.88\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003cth\u003e2011-11-01\u003c/th\u003e\n \u003ctd\u003e4.59\u003c/td\u003e\n \u003ctd\u003e4.14\u003c/td\u003e\n \u003ctd\u003e4.35\u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003cp\u003eIf we graph the interest rates we get:\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2018/03/rates.en.png\" alt=\"Interest rates over time\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eYou can see a clear peak in the variable rate when the riksbank set\nthe repo rate at 500% (mortgages \u0026ldquo;only\u0026rdquo; reached 24%). You can also see\nthat during the early nineties the variable rate was higher than the\nfixed rates during relatively long periods. But to compare the actual\ncost over the fixed term we have to compare average rates.\u003c/p\u003e\n\n\u003cp\u003eFor example, let us compare the actual average rates from the first of\nJuly 1991 during 5 years for variable rate (11.96%) and 5 years fixed\nterm (12.25%). Even though with variable rate you\u0026rsquo;d have had a rate of\n24% during a quarter you\u0026rsquo;d still pay less in total over the 5 years.\u003c/p\u003e\n\n\u003cp\u003eIf the same calculation is made for every month you can see how much\nyou would have earned/lost depending on when you started your fixed\nterm. Since 5 years is not evenly divisible by 2 years, the 2 years\nfixed term refers to what the average rate would have been during the\nfirst 5 of the 6 years.\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2018/03/5y_avg_rates.en.png\" alt=\"Average interest rate over 5 years\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eIt\u0026rsquo;s quite clear that variable rate has nearly always been the most\nprofitable alternative. At three seperate occasions it would have been\nmore profitable to pick a 5 year fixed term: at the of 1989, the\nbeginning of 1997, and in the middle of 2005. I won\u0026rsquo;t comment on the 2\nyears fixed term since it\u0026rsquo;s not a fair comparison to only look at 5 out of\n6 years.\u003c/p\u003e\n\n\u003cp\u003eIf we compare 2 years fixed term with variable rate:\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2018/03/2y_avg_rates.en.png\" alt=\"Average interest rate over 2 years\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eAlso here the most profitable choice is generally the variable rate\nhowever during times of rising interest rates getting a fixed 2 year\nterm has been the better choice on several occasions. An important\ndifference to the 5 years term is that you\u0026rsquo;re not locked in for long\nwhen the rates finally go down again (and you\u0026rsquo;re able to switch to\nvariable rate).\u003c/p\u003e\n\n\u003cp\u003eIf we compare all terms during 10 years:\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2018/03/10y_avg_rates.en.png\" alt=\"Average interest rate over 10 years\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eHere it is clear that the variable rate is the most profitable.\u003c/p\u003e\n\n\u003cp\u003eEven though it has been possible at certain occasions (29 years and\nonly 3 short occasions!) to get a fixed term for 5 years and pay less\noverall than with variable rate, I think it\u0026rsquo;s far too improbable that\none is able to do it at the right time. You\u0026rsquo;re almost guaranteed to be\npaying more in the end.\u003c/p\u003e\n\n\u003cp\u003eGetting a fixed term for 2 years is more probable to be profitable,\nbut even here it is more probable not to be.\u003c/p\u003e\n",
+ "date_published": "2018-03-05T23:00:00+02:00",
+ "image": "https://cowboyprogrammer.org/images/2018/03/5y_avg_rates.en.png"
+ }
+
+ , {
+ "id": "https://cowboyprogrammer.org/2016/10/reduce-colors-in-images/",
+ "url": "https://cowboyprogrammer.org/2016/10/reduce-colors-in-images/",
+ "title": "Reduce the size of images even further by reducing number of colors with Gimp",
+ "content_html": "\n\n\u003cp\u003eIn Gimp you go to \u003cem\u003eImage\u003c/em\u003e in the top menu bar and select \u003cem\u003eMode\u003c/em\u003e\nfollowed by \u003cem\u003eIndexed\u003c/em\u003e. Now you see a popup where you can select the\nnumber of colors for a generated optimum palette.\u003c/p\u003e\n\n\u003cp\u003eYou\u0026rsquo;ll have to experiment a little because it will depend on your\nimage.\u003c/p\u003e\n\n\u003cp\u003eI used this approach to shrink the size of the cover image in\n\u003ca href=\"/2016/08/zopfli_all_the_things/\"\u003ethe_zopfli post\u003c/a\u003e from a 37KB (JPG) to just 15KB\n(PNG, all PNG sizes listed include Zopfli compression btw).\u003c/p\u003e\n\n\u003ch2 id=\"straight-jpg-to-png-conversion-124kb\"\u003eStraight JPG to PNG conversion: 124KB\u003c/h2\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2017/10/zopfli_all_the_things.png\" alt=\"PNG version RGB colors\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eFirst off, I exported the JPG file as a PNG file. This PNG file had a\nwhopping 124KB! Clearly there was some bloat being stored.\u003c/p\u003e\n\n\u003ch2 id=\"256-colors-40kb\"\u003e256 colors: 40KB\u003c/h2\u003e\n\n\u003cp\u003eReducing from RGB to only 256 colors has no visible effect to my eyes.\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2017/10/zopfli_all_the_things_256.png\" alt=\"256 colors\" /\u003e\u003c/p\u003e\n\n\u003ch2 id=\"128-colors-34kb\"\u003e128 colors: 34KB\u003c/h2\u003e\n\n\u003cp\u003eStill no difference.\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2017/10/zopfli_all_the_things_128.png\" alt=\"128 colors\" /\u003e\u003c/p\u003e\n\n\u003ch2 id=\"64-colors-25kb\"\u003e64 colors: 25KB\u003c/h2\u003e\n\n\u003cp\u003eYou can start to see some artifacting in the shadow behind the text.\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2017/10/zopfli_all_the_things_64.png\" alt=\"64 colors\" /\u003e\u003c/p\u003e\n\n\u003ch2 id=\"32-colors-15kb\"\u003e32 colors: 15KB\u003c/h2\u003e\n\n\u003cp\u003eIn my opinion this is the sweet spot. The shadow artifacting is barely\nnoticable but the size is significantly reduced.\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2017/10/zopfli_all_the_things_32.png\" alt=\"32 colors\" /\u003e\u003c/p\u003e\n\n\u003ch2 id=\"16-colors-11kb\"\u003e16 colors: 11KB\u003c/h2\u003e\n\n\u003cp\u003eClear artifacting in the text shadow and the yellow (fire?) in the\nbackground has developed an outline.\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2017/10/zopfli_all_the_things_16.png\" alt=\"16 colors\" /\u003e\u003c/p\u003e\n\n\u003ch2 id=\"8-colors-7-3kb\"\u003e8 colors: 7.3KB\u003c/h2\u003e\n\n\u003cp\u003eThe broom has shifted in color from a clear brown to almost grey. Text\nshadow is just a grey blob at this point. Even clearer outline\ndeveloped on the yellow background.\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2017/10/zopfli_all_the_things_8.png\" alt=\"8 colors\" /\u003e\u003c/p\u003e\n\n\u003ch2 id=\"4-colors-4-3kb\"\u003e4 colors: 4.3KB\u003c/h2\u003e\n\n\u003cp\u003eInterestingly enough, I think 4 colors looks better than 8 colors. The outline in the background has disappeared because there\u0026rsquo;s not enough color spectrum to render it. The broom is now black and filled areas tend to get a white separator to the outlines.\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2017/10/zopfli_all_the_things_4.png\" alt=\"4 colors\" /\u003e\u003c/p\u003e\n\n\u003ch2 id=\"2-colors-2-4kb\"\u003e2 colors: 2.4KB\u003c/h2\u003e\n\n\u003cp\u003eWell, at least the silhouette is well defined at this point I guess.\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2017/10/zopfli_all_the_things_2.png\" alt=\"2 colors\" /\u003e\u003c/p\u003e\n",
+ "date_published": "2016-10-21T00:27:00+02:00",
+ "image": "https://cowboyprogrammer.org/images/2017/10/gimp_image_mode_index.png"
+ }
+
+ , {
+ "id": "https://cowboyprogrammer.org/2016/10/dont-start-service-on-install-of-debian-package/",
+ "url": "https://cowboyprogrammer.org/2016/10/dont-start-service-on-install-of-debian-package/",
+ "title": "Don't start service on installation of Debian package",
+ "content_html": "\u003cp\u003eA clear difference between Debian/Ubuntu and for example Red\nHat/Fedora is that packages which include system services will enable\nand start those services at install time in Debian/Ubuntu whereas they\nwill not start automatically in Red Hat/Fedora.\u003c/p\u003e\n\n\u003cp\u003eSometimes it would be very convenient if the service would \u003cem\u003enot\u003c/em\u003e start\nautomatically, for example if you need to configure the service before\nstarting it for the first time.\u003c/p\u003e\n\n\u003cp\u003eTo prevent the automatic start of system services at install time in\nDebian, just set the \u003ccode\u003eRUNLEVEL\u003c/code\u003e environment variable like so:\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eRUNLEVEL=1 apt install -y PKG_NAME\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cp\u003eThen you are free to configure your system before you start the\nservice for real:\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003esystemctl enable PKG_NAME\nsystemctl start PKG_NAME\n\u003c/code\u003e\u003c/pre\u003e\n",
+ "date_published": "2016-10-19T00:00:00+02:00",
+ "image": "https://cowboyprogrammer.org/images/Ardebian_logo_512_0.png"
+ }
+
+ , {
+ "id": "https://cowboyprogrammer.org/2016/09/reboot_machine_on_wrong_password/",
+ "url": "https://cowboyprogrammer.org/2016/09/reboot_machine_on_wrong_password/",
+ "title": "Rebooting on wrong password",
+ "content_html": "\n\n\u003cp\u003eHaving an encrypted hard drive is all well and good, but chances are\nthat if someone is gonna steal your laptop, it\u0026rsquo;s probably not going to\nbe turned off. Most likely, it will be stolen in a powered-on\nstate. And so your encrypted hard drive doesn\u0026rsquo;t increase your security\nat all since it\u0026rsquo;s currently unlocked.\u003c/p\u003e\n\n\u003cp\u003eIn my mind, it\u0026rsquo;s a slight improvement if the computer somehow can\nshutdown if someone is trying to gain access to it. That way, the hard\ndrive is no longer accessible and the number of possible attack\nvectors go down drastically. And so, if you type the wrong password 3\ntimes on my laptop, it shuts down.\u003c/p\u003e\n\n\u003cp\u003eThis is accomplished by using \u003ccode\u003ePAM\u003c/code\u003e, and its ability to invoke an\narbitrary script as part of the login flow via \u003ccode\u003epam_exec.so\u003c/code\u003e. The\nscript itself looks like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\" style=\"background: #f0f0f0\"\u003e\u003cpre style=\"line-height: 125%\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e#!/bin/bash\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# Do not add -eu, you need to allow empty variables here!\u003c/span\u003e\n\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# To be used with PAM. Look in /etc/pam.d for the script that your\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# screensaver etc uses. Typically it references common-account and common-auth.\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e#\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# In common-auth, add this as the first line\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e#auth optional pam_exec.so debug /path/to/wrongpassword.sh\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e#\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# In common-account, add this as the first line\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e#account required pam_exec.so debug /path/to/wrongpassword.sh\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e#\u003c/span\u003e\n\n\u003cspan style=\"color: #bb60d5\"\u003eCOUNTFILE\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;/var/log/failed_login_count\u0026quot;\u003c/span\u003e\n\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# Make sure file exists\u003c/span\u003e\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003eif\u003c/span\u003e \u003cspan style=\"color: #666666\"\u003e[\u003c/span\u003e ! -f \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e${\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003eCOUNFILE\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e}\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e \u003cspan style=\"color: #666666\"\u003e]\u003c/span\u003e;\u003cspan style=\"color: #007020; font-weight: bold\"\u003ethen\u003c/span\u003e\n touch \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e${\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003eCOUNTFILE\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e}\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\n chmod \u003cspan style=\"color: #40a070\"\u003e777\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e${\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003eCOUNTFILE\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e}\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003efi\u003c/span\u003e\n\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# Read value in it\u003c/span\u003e\n\u003cspan style=\"color: #bb60d5\"\u003eCOUNT\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e\u003cspan style=\"color: #007020; font-weight: bold\"\u003e$(\u003c/span\u003ecat \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e${\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003eCOUNTFILE\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e}\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #007020; font-weight: bold\"\u003e)\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# Increment it\u003c/span\u003e\n\u003cspan style=\"color: #bb60d5\"\u003eCOUNT\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e\u003cspan style=\"color: #007020; font-weight: bold\"\u003e$((\u003c/span\u003eCOUNT+1\u003cspan style=\"color: #007020; font-weight: bold\"\u003e))\u003c/span\u003e\n\u003cspan style=\"color: #007020\"\u003eecho\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e${\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003eCOUNT\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e}\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e \u0026gt; \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e${\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003eCOUNTFILE\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e}\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\n\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# if authentication\u003c/span\u003e\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003eif\u003c/span\u003e \u003cspan style=\"color: #666666\"\u003e[\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e${\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003ePAM_TYPE\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e}\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e \u003cspan style=\"color: #666666\"\u003e==\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;auth\u0026quot;\u003c/span\u003e \u003cspan style=\"color: #666666\"\u003e]\u003c/span\u003e; \u003cspan style=\"color: #007020; font-weight: bold\"\u003ethen\u003c/span\u003e\n \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# The count will be at 4 after 3 wrong tries\u003c/span\u003e\n \u003cspan style=\"color: #007020; font-weight: bold\"\u003eif\u003c/span\u003e \u003cspan style=\"color: #666666\"\u003e[\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e${\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003eCOUNT\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e}\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e -ge \u003cspan style=\"color: #40a070\"\u003e4\u003c/span\u003e \u003cspan style=\"color: #666666\"\u003e]\u003c/span\u003e; \u003cspan style=\"color: #007020; font-weight: bold\"\u003ethen\u003c/span\u003e\n \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# Shutdown in 1 min\u003c/span\u003e\n \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e#/usr/bin/shutdown --no-wall -h +1\u003c/span\u003e\n \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# This is a hack because the line above gives a segfault in logind\u003c/span\u003e\n \u003cspan style=\"color: #007020\"\u003eecho\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;0\u0026quot;\u003c/span\u003e \u0026gt; \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e${\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003eCOUNTFILE\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e}\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\n systemctl poweroff\n \u003cspan style=\"color: #007020; font-weight: bold\"\u003efi\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# If authentication succeeded, and we are now in account phase\u003c/span\u003e\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003eelif\u003c/span\u003e \u003cspan style=\"color: #666666\"\u003e[\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e${\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003ePAM_TYPE\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e}\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e \u003cspan style=\"color: #666666\"\u003e==\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;account\u0026quot;\u003c/span\u003e \u003cspan style=\"color: #666666\"\u003e]\u003c/span\u003e; \u003cspan style=\"color: #007020; font-weight: bold\"\u003ethen\u003c/span\u003e\n \u003cspan style=\"color: #007020\"\u003eecho\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;0\u0026quot;\u003c/span\u003e \u0026gt; \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e${\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003eCOUNTFILE\u003c/span\u003e\u003cspan style=\"color: #70a0d0; font-style: italic\"\u003e}\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\n \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# Cancel shutdown which was just issued\u003c/span\u003e\n shutdown -c\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003efi\u003c/span\u003e\n\n\u003cspan style=\"color: #007020\"\u003eexit\u003c/span\u003e \u003cspan style=\"color: #40a070\"\u003e0\u003c/span\u003e\n\u003c/pre\u003e\u003c/div\u003e\n\n\u003cp\u003eOn my Debian system, PAM ends up looking at \u003ccode\u003e/etc/pam.d/common-auth\u003c/code\u003e\nand \u003ccode\u003e/etc/pam.d/common-account\u003c/code\u003e. These are invoked in different parts\nof the authentication flow. In \u003ccode\u003ecommon-auth\u003c/code\u003e, add this as the first\nline:\u003c/p\u003e\n\u003cdiv class=\"highlight\" style=\"background: #f0f0f0\"\u003e\u003cpre style=\"line-height: 125%\"\u003e\u003cspan\u003e\u003c/span\u003eauth optional pam_exec.so debug /path/to/wrongpassword.sh\n\u003c/pre\u003e\u003c/div\u003e\n\n\u003cp\u003eAnd then in \u003ccode\u003ecommon-account\u003c/code\u003e, add this as the first line:\u003c/p\u003e\n\u003cdiv class=\"highlight\" style=\"background: #f0f0f0\"\u003e\u003cpre style=\"line-height: 125%\"\u003e\u003cspan\u003e\u003c/span\u003eaccount required pam_exec.so debug /path/to/wrongpassword.sh\n\u003c/pre\u003e\u003c/div\u003e\n\n\u003cp\u003eYou can try it immediately if it works. Lock your screen, and type the\nwrong password 4 times. If it works, your computer should shut down.\u003c/p\u003e\n\n\u003ch2 id=\"warning-do-not-enable-on-servers\"\u003eWARNING: DO NOT ENABLE ON SERVERS\u003c/h2\u003e\n\n\u003cp\u003eThis is \u003cstrong\u003eNOT\u003c/strong\u003e something you want to do on any machine. Most notably,\nit\u0026rsquo;s probably a huge mistake to copy this verbatim on a machine which\naccepts remote connections. In that case, you essentially enable\nanyone to DOS you by entering the wrong password via SSH or\nsimilarly. So don\u0026rsquo;t do this if you allow remote connections to your\nmachine (which shouldn\u0026rsquo;t be a thing on a laptop).\u003c/p\u003e\n",
+ "date_published": "2016-09-28T22:57:21+02:00"
+ }
+
+ , {
+ "id": "https://cowboyprogrammer.org/2016/08/zopfli_all_the_things/",
+ "url": "https://cowboyprogrammer.org/2016/08/zopfli_all_the_things/",
+ "title": "Compress all the images!",
+ "content_html": "\n\n\u003cp\u003e\u003cem\u003eUpdate 2016-11-22: Made the Makefile compatible with BSD sed (MacOS)\u003c/em\u003e\u003c/p\u003e\n\n\u003cp\u003eOne advantage that static sites, such as those built by \u003ca href=\"https://gohugo.io\"\u003eHugo\u003c/a\u003e,\nprovide is fast loading times. Because there is no processing to be\ndone, no server side rendering, no database lookups, loading times are\njust as fast as you can serve the files that make up the page. This\nmeans that bandwidth becomes the primary bottleneck, which\nincidentally is\n\u003ca href=\"https://webmasters.googleblog.com/2010/04/using-site-speed-in-web-search-ranking.html\"\u003eone of the factors used by Google to calculate your search ranking\u003c/a\u003e. See\nalso\n\u003ca href=\"https://developers.google.com/speed/pagespeed/insights\"\u003ePagespeed Insights\u003c/a\u003e.\u003c/p\u003e\n\n\u003ch2 id=\"compressing-images\"\u003eCompressing images\u003c/h2\u003e\n\n\u003cp\u003eBecause the largest pieces of a page typically consist of images, it\nstands to reason that if we can make the images smaller, we can make\nthe page load faster. Luckily there exists methods that can compress\nimages \u003cem\u003elosslessly\u003c/em\u003e. That means that the quality stays exactly the\nsame, the page only loads faster. That seemed like a no-brainer to me\nso I compressed all the images on the site using \u003ca href=\"http://advsys.net/ken/utils.htm\"\u003ePNGout\u003c/a\u003e as\n\u003ca href=\"https://blog.codinghorror.com/getting-the-most-out-of-png/\"\u003eadvised by Jeff Atwood\u003c/a\u003e. I mean, who doesn\u0026rsquo;t\nlike free bandwidth?\u003c/p\u003e\n\n\u003cp\u003eA new algorithm called \u003ca href=\"https://github.com/google/zopfli\"\u003eZopfli\u003c/a\u003e (open sourced by Google,\n\u003ca href=\"https://blog.codinghorror.com/zopfli-optimization-literally-free-bandwidth/\"\u003ealso mentioned by Jeff\u003c/a\u003e) claims even better\nresults than PNGout though. Results on this site\u0026rsquo;s images confirm\nthose claims. Running the tool on images \u003cem\u003ealready compressed by\nPNGout\u003c/em\u003e gives output such as this:\u003c/p\u003e\n\u003cdiv class=\"highlight\" style=\"background: #f0f0f0\"\u003e\u003cpre style=\"line-height: 125%\"\u003e\u003cspan\u003e\u003c/span\u003e./zopflipng --prefix=\u0026quot;zopfli_\u0026quot; static/images/2014/Dec/Screenshot-from-2014-12-29-13-28-29.png\nOptimizing static/images/2014/Dec/Screenshot-from-2014-12-29-13-28-29.png\nInput size: 89420 (87K)\nResult size: 90361 (88K). Percentage of original: 101.052%\nPreserving original PNG since it was smaller\n\n./zopflipng --prefix=\u0026quot;zopfli_\u0026quot; static/images/2014/Jun/Jenkins_install_git.png\nOptimizing static/images/2014/Jun/Jenkins_install_git.png\nInput size: 189406 (184K)\nResult size: 166362 (162K). Percentage of original: 87.834%\nResult is smaller\n\n./zopflipng --prefix=\u0026quot;zopfli_\u0026quot; static/images/2014/Jun/jenkins_batch.png\nOptimizing static/images/2014/Jun/jenkins_batch.png\nInput size: 21933 (21K)\nResult size: 16255 (15K). Percentage of original: 74.112%\nResult is smaller\n\n./zopflipng --prefix=\u0026quot;zopfli_\u0026quot; static/images/2014/Jun/jenkins_build_step.png\nOptimizing static/images/2014/Jun/jenkins_build_step.png\nInput size: 8184 (7K)\nResult size: 6809 (6K). Percentage of original: 83.199%\nResult is smaller\n\n./zopflipng --prefix=\u0026quot;zopfli_\u0026quot; static/images/2014/Jun/jenkins_config_git.png\nOptimizing static/images/2014/Jun/jenkins_config_git.png\nInput size: 57897 (56K)\nResult size: 47164 (46K). Percentage of original: 81.462%\nResult is smaller\n\u003c/pre\u003e\u003c/div\u003e\n\n\u003cp\u003eThe first result in the example output shows a case where Zopfli would\nactually have made the file bigger (because it was already compressed\nby PNGout, remember). This is nothing you have to worry about because\nit\u0026rsquo;s actually smart enough that it simply copies the original file in\nthat case.\u003c/p\u003e\n\n\u003cp\u003eComparing to both before any compression, and PNGout, yielded the\nfollowing results:\u003c/p\u003e\n\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e\u003c/th\u003e\n\u003cth\u003eMean relative size\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\n\u003ctr\u003e\n\u003ctd\u003eBefore\u003c/td\u003e\n\u003ctd\u003e1.00\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003ePNGout\u003c/td\u003e\n\u003ctd\u003e0.84\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003eZopfliPNG\u003c/td\u003e\n\u003ctd\u003e0.77\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Box_plot\"\u003eBox plot\u003c/a\u003e of results on all images:\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/zopfli_boxplot.png\" alt=\"Compression results\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eSource files: \u003ca href=\"/csv/before.csv\"\u003ebefore.csv\u003c/a\u003e,\n\u003ca href=\"/csv/pngout.csv\"\u003epngout.csv\u003c/a\u003e, \u003ca href=\"/csv/zopfli.csv\"\u003ezopfli.csv\u003c/a\u003e\u003c/p\u003e\n\n\u003cp\u003eAnd this is with the default arguments. It is possible squeeze yet a\ncouple of more bytes out of this if you\u0026rsquo;re willing to wait longer.\u003c/p\u003e\n\n\u003ch2 id=\"automate-it-with-make\"\u003eAutomate it with Make\u003c/h2\u003e\n\n\u003cp\u003eAnother joy of using a simple static site is that it is possible to\ncompose regular tools to do useful things. Tools like\n\u003ca href=\"https://www.gnu.org/software/make/\"\u003eMake\u003c/a\u003e. And we can use Make to build the site, as well as\ncompressing images which have not already been compressed. You could\ndo it manually for each new image that you add of course but be\nhonest, you \u003cem\u003eknow\u003c/em\u003e that you\u0026rsquo;re gonna forget to do it at some point. So\nlet\u0026rsquo;s automate it instead!\u003c/p\u003e\n\n\u003cp\u003eThis is the Makefile that I use to build this site with, note that\n\u003ccode\u003epublic\u003c/code\u003e depends on \u003ccode\u003e$(PNG_SENTINELS)\u003c/code\u003e, so I literally can\u0026rsquo;t forget to\ncompress any new images added:\u003c/p\u003e\n\u003cdiv class=\"highlight\" style=\"background: #f0f0f0\"\u003e\u003cpre style=\"line-height: 125%\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan style=\"color: #06287e\"\u003e.PHONY\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e:\u003c/span\u003e help build server server-with-drafts clean zopfli\n\n\u003cspan style=\"color: #bb60d5\"\u003ePNG_SENTINELS\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e:=\u003c/span\u003e \u003cspan style=\"color: #007020; font-weight: bold\"\u003e$(\u003c/span\u003eshell find . -path ./public -prune -o -name \u003cspan style=\"color: #4070a0\"\u003e\u0026#39;*.png\u0026#39;\u003c/span\u003e -print | sed \u003cspan style=\"color: #4070a0\"\u003e\u0026#39;s|\\(.\\+/\\)\\(.\\+.png\\)|\\1.\\2.zopfli|g\u0026#39;\u003c/span\u003e\u003cspan style=\"color: #007020; font-weight: bold\"\u003e)\u003c/span\u003e\n\n\u003cspan style=\"color: #06287e\"\u003ehelp\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e:\u003c/span\u003e \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e## Print this help text\u003c/span\u003e\n\t@grep -E \u003cspan style=\"color: #4070a0\"\u003e\u0026#39;^[a-zA-Z_-]+:.*?## .*$$\u0026#39;\u003c/span\u003e \u003cspan style=\"color: #007020; font-weight: bold\"\u003e$(\u003c/span\u003eMAKEFILE_LIST\u003cspan style=\"color: #007020; font-weight: bold\"\u003e)\u003c/span\u003e | awk \u003cspan style=\"color: #4070a0\"\u003e\u0026#39;BEGIN {FS = \u0026quot;:.*?## \u0026quot;}; {printf \u0026quot;\\033[36m%-30s\\033[0m %s\\n\u0026quot;, $$1, $$2}\u0026#39;\u003c/span\u003e\n\n\u003cspan style=\"color: #06287e\"\u003eserver\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e:\u003c/span\u003e \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e## Run hugo server\u003c/span\u003e\n\thugo server\n\n\u003cspan style=\"color: #06287e\"\u003eserver-with-drafts\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e:\u003c/span\u003e \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e## Run hugo server and include drafts\u003c/span\u003e\n\thugo server -D\n\n\u003cspan style=\"color: #06287e\"\u003ebuild\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e:\u003c/span\u003e public \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e## Build site (will also compress images using zopfli)\u003c/span\u003e\n\n\u003cspan style=\"color: #06287e\"\u003ezopfli\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e:\u003c/span\u003e \u003cspan style=\"color: #007020; font-weight: bold\"\u003e$(\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003ePNG_SENTINELS\u003c/span\u003e\u003cspan style=\"color: #007020; font-weight: bold\"\u003e)\u003c/span\u003e \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e## Compress new images using zopfli\u003c/span\u003e\n\n\u003cspan style=\"color: #06287e\"\u003eclean\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e:\u003c/span\u003e \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e## Remove the built directory\u003c/span\u003e\n\t@rm -rf public\n\n\u003cspan style=\"color: #06287e\"\u003epublic\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e:\u003c/span\u003e \u003cspan style=\"color: #007020; font-weight: bold\"\u003e$(\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003ePNG_SENTINELS\u003c/span\u003e\u003cspan style=\"color: #007020; font-weight: bold\"\u003e)\u003c/span\u003e\n\t@rm -rf public\n\thugo\n\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# Zopfli sentinel rule, assumes zopflipng binary is in the same folder\u003c/span\u003e\n\u003cspan style=\"color: #06287e\"\u003e.%.png.zopfli\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e:\u003c/span\u003e %.png\n\t./zopflipng --prefix\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;zopfli_\u0026quot;\u003c/span\u003e $\u0026lt;\n\t@mv \u003cspan style=\"color: #007020; font-weight: bold\"\u003e$(\u003c/span\u003edir $\u0026lt;\u003cspan style=\"color: #007020; font-weight: bold\"\u003e)\u003c/span\u003ezopfli_\u003cspan style=\"color: #007020; font-weight: bold\"\u003e$(\u003c/span\u003enotdir $\u0026lt;\u003cspan style=\"color: #007020; font-weight: bold\"\u003e)\u003c/span\u003e $\u0026lt;\n\t@touch \u003cspan style=\"color: #bb60d5\"\u003e$@\u003c/span\u003e\n\u003c/pre\u003e\u003c/div\u003e\n\n\u003cp\u003eFor best performance, run make with parallel jobs (change 4 to your\nnumber CPUs): \u003ccode\u003emake -j4 zopfli\u003c/code\u003e.\u003c/p\u003e\n\n\u003cp\u003eTo know which files have already been compressed without actually\nrunning Zopfli on it again (which takes a while), sentinel files are\ncreated with this pattern: \u003ccode\u003e.\u0026lt;imgfilename\u0026gt;.zopfli\u003c/code\u003e. Thus, the next\ntime around, zopfli is only invoked for files which have \u003cem\u003enot\u003c/em\u003e already\nbeen compressed, making it a one-time operation. And when everything\nhas already been compressed, you\u0026rsquo;ll just get this:\u003c/p\u003e\n\u003cdiv class=\"highlight\" style=\"background: #f0f0f0\"\u003e\u003cpre style=\"line-height: 125%\"\u003e\u003cspan\u003e\u003c/span\u003emake: Nothing to be done for \u0026#39;zopfli\u0026#39;.\n\u003c/pre\u003e\u003c/div\u003e\n",
+ "date_published": "2016-08-26T13:17:40+02:00",
+ "image": "https://cowboyprogrammer.org/images/2017/10/zopfli_all_the_things_32.png"
+ }
+
+ , {
+ "id": "https://cowboyprogrammer.org/2016/07/migrating_from_ghost_to_hugo/",
+ "url": "https://cowboyprogrammer.org/2016/07/migrating_from_ghost_to_hugo/",
+ "title": "Migrating from Ghost to Hugo",
+ "content_html": "\n\n\u003cp\u003eSo I recently migrated this site from \u003ca href=\"https://ghost.org\"\u003eGhost\u003c/a\u003e to \u003ca href=\"https://gohugo.io\"\u003eHugo\u003c/a\u003e\nafter reading a nice article about the Hugo in\n\u003ca href=\"https://www.linuxvoice.com/download-linux-voice-issue-20/\"\u003eLinux Voice #20\u003c/a\u003e (funnily enough, the same issue also\nfeatures an article about Ghost). I originally made the switch to\nGhost from \u003ca href=\"https://jekyllrb.com/\"\u003eJekyll\u003c/a\u003e back in 2014 or so mainly because I could\nnot find a good theme to use. Ghost also seemed to have a lot of cool\nfeatures and it\u0026rsquo;s fun to try new things.\u003c/p\u003e\n\n\u003cp\u003eI think it\u0026rsquo;s safe to say that I am hardly a prolific blogger. I mainly\nwrite about stuff which I personally cannot find on the web which I\nthink should exist, because I will likely need it myself sometime in\nthe future. So it\u0026rsquo;s hardly a surprise that I am not in the target\naudience for Ghost.\u003c/p\u003e\n\n\u003ch2 id=\"things-about-ghost-which-annoy-me\"\u003eThings about Ghost which annoy me\u003c/h2\u003e\n\n\u003cul\u003e\n\u003cli\u003eIt\u0026rsquo;s written in NodeJS \u0026mdash; people who think JS is a good server\nlanguage also tend to think that it\u0026rsquo;s a good idea to depend on just\nabout any package, and download it in every single build. Which\nbecomes really \u003ca href=\"http://www.theregister.co.uk/2016/03/23/npm_left_pad_chaos/\"\u003efunny sometimes\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003ePoor selection of \u003ca href=\"http://marketplace.ghost.org/\"\u003ethemes\u003c/a\u003e \u0026mdash; this is subjective of\ncourse, but it seems to me that the free options don\u0026rsquo;t have much in\nterms of diversity. Heck, they even call it a \u003cem\u003emarketplace\u003c/em\u003e which\nrubs me the wrong way.\u003c/li\u003e\n\u003cli\u003eThemes end up being quite reliant on JS if you want necessary\nfeatures like syntax highlighting on code snippets \u0026mdash; I often\nbrowse with JS disabled and should be able to view my own site.\u003c/li\u003e\n\u003cli\u003eMarkdown parser treats newlines as significant \u0026mdash; meaning you can\u0026rsquo;t\nhave properly aligned paragraphs in your editor.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003eThat last point irritates me deeply but it\u0026rsquo;s not as bad as the next point.\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eYou can effectively lock an account by entering the wrong password 3\ntimes.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003eThis requires some explanation. So Ghost, targeting teams of bloggers\nreally, naturally have an account system much like Wordpress. Now, as\nI was surveying the security status of other services I am running, I\nwas wondering how Ghost handled someone trying to brute force your\naccount and decided to simply try it out. Type the wrong password once\ntoo many, and this happens:\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/ghost_wrong_password.png\" alt=\"Ghost: typing the wrong password too many times locks your account\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eIt doesn\u0026rsquo;t lock it for a single IP address (I tried from several), it\nlocks the entire account. Effectively, someone can just set up a\nscript to try an account indefinitely simply with the intention to\nblock someone from logging in.\u003c/p\u003e\n\n\u003cp\u003eThe log doesn\u0026rsquo;t even show login attempts, so there is no way to\nimplement sensible blocking strategies using something like \u003ca href=\"http://www.fail2ban.org\"\u003efail2ban\u003c/a\u003e.\u003c/p\u003e\n\n\u003cp\u003eThe whole thing left a bad taste my mouth so it was a very suitable timing to read an article on \u003ca href=\"https://gohugo.io\"\u003eHugo\u003c/a\u003e.\u003c/p\u003e\n\n\u003ch2 id=\"things-about-hugo-which-excite-me\"\u003eThings about Hugo which excite me\u003c/h2\u003e\n\n\u003cul\u003e\n\u003cli\u003eMarkdown parser treats newlines correctly\u003c/li\u003e\n\u003cli\u003eIt\u0026rsquo;s a static site generator and not a service \u0026mdash; this meant 100MB\n(10%) of RAM became available on my server and there is no account\nto hack (or block).\u003c/li\u003e\n\u003cli\u003eSupports everything of Ghost (that I am aware of).\u003c/li\u003e\n\u003cli\u003eThe simplicity of Hugo makes it \u003ca href=\"https://npf.io/2014/08/making-it-a-series/\"\u003equite painless\u003c/a\u003e to\ndo useful things compared to\n\u003ca href=\"https://github.com/TryGhost/Ghost/issues/4818\"\u003eignored feature requests\u003c/a\u003e for the same in Ghost.\u003c/li\u003e\n\u003cli\u003eCan do server side syntax highlighting using Pygments.\u003c/li\u003e\n\u003cli\u003eSome really nice \u003ca href=\"http://themes.gohugo.io/\"\u003ethemes\u003c/a\u003e are available, and they are\nall free.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2 id=\"migrating-all-data-from-ghost\"\u003eMigrating all data from Ghost\u003c/h2\u003e\n\n\u003cp\u003eMigrating from Ghost also turned about to be really painless. There\nwere several scripts around for exactly this but they all turned out\nto be written in \u003ca href=\"https://gist.github.com/vjeantet/d1f6cf824a2344dd6b4e\"\u003eodd languages\u003c/a\u003e, and did not actually\nmigrate all the metadata in Ghost. So I wrote my own in Python with\nthese \u003cem\u003ekiller features\u003c/em\u003e:\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eMigrates tags.\u003c/li\u003e\n\u003cli\u003eMigrates dates.\u003c/li\u003e\n\u003cli\u003eMigrates drafts as drafts.\u003c/li\u003e\n\u003cli\u003eCreates aliases in your posts which makes sure that old permalinks\nwill still work!\u003c/li\u003e\n\u003cli\u003eMigrates cover pictures as banner images, just select a theme which\nsupport them.\u003c/li\u003e\n\u003cli\u003eRewrites all relative links so they all still work (this includes\nimages).\u003c/li\u003e\n\u003cli\u003eCode blocks with language definitions like \u003ccode\u003e```language-java\u003c/code\u003e\nare changed to \u003ccode\u003e```java\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\" style=\"background: #f0f0f0\"\u003e\u003cpre style=\"line-height: 125%\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e#!/usr/bin/env python3\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# -*- coding: utf-8 -*-\u003c/span\u003e\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003e\u0026#39;\u0026#39;\u0026#39;\u003c/span\u003e\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003eA simple program which migrates an exported Ghost blog to Hugo.\u003c/span\u003e\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003eIt assumes your blog is using the hugo-icarus theme, but should\u003c/span\u003e\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003ework for any theme. The script will migrate your posts, including\u003c/span\u003e\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003etags and banner images. Furthermore, it will make sure that\u003c/span\u003e\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003eall your old post urls will keep working by adding aliases to them.\u003c/span\u003e\n\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003eThe only thing you need to do yourself is copying the `images/`\u003c/span\u003e\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003edirectory in your ghost directory to `static/images/` in your hugo\u003c/span\u003e\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003edirectory. That way, all images will work. The script will rewrite\u003c/span\u003e\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003eall urls linking to `/content/images` to just `/images`.\u003c/span\u003e\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003e\u0026#39;\u0026#39;\u0026#39;\u003c/span\u003e\n\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003eimport\u003c/span\u003e \u003cspan style=\"color: #0e84b5; font-weight: bold\"\u003eargparse\u003c/span\u003e\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003eimport\u003c/span\u003e \u003cspan style=\"color: #0e84b5; font-weight: bold\"\u003ejson\u003c/span\u003e\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003efrom\u003c/span\u003e \u003cspan style=\"color: #0e84b5; font-weight: bold\"\u003edatetime\u003c/span\u003e \u003cspan style=\"color: #007020; font-weight: bold\"\u003eimport\u003c/span\u003e date\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003efrom\u003c/span\u003e \u003cspan style=\"color: #0e84b5; font-weight: bold\"\u003eos\u003c/span\u003e \u003cspan style=\"color: #007020; font-weight: bold\"\u003eimport\u003c/span\u003e path\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003efrom\u003c/span\u003e \u003cspan style=\"color: #0e84b5; font-weight: bold\"\u003ecollections\u003c/span\u003e \u003cspan style=\"color: #007020; font-weight: bold\"\u003eimport\u003c/span\u003e defaultdict\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003eimport\u003c/span\u003e \u003cspan style=\"color: #0e84b5; font-weight: bold\"\u003ere\u003c/span\u003e\n\n_post \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026#39;\u0026#39;\u0026#39;\u003c/span\u003e\n\u003cspan style=\"color: #4070a0\"\u003e+++\u003c/span\u003e\n\u003cspan style=\"color: #4070a0\"\u003edate = \u0026quot;{date}\u0026quot;\u003c/span\u003e\n\u003cspan style=\"color: #4070a0\"\u003edraft = {draft}\u003c/span\u003e\n\u003cspan style=\"color: #4070a0\"\u003etitle = \u0026quot;\u0026quot;\u0026quot;{title}\u0026quot;\u0026quot;\u0026quot;\u003c/span\u003e\n\u003cspan style=\"color: #4070a0\"\u003eslug = \u0026quot;{slug}\u0026quot;\u003c/span\u003e\n\u003cspan style=\"color: #4070a0\"\u003etags = {tags}\u003c/span\u003e\n\u003cspan style=\"color: #4070a0\"\u003ebanner = \u0026quot;{banner}\u0026quot;\u003c/span\u003e\n\u003cspan style=\"color: #4070a0\"\u003ealiases = {aliases}\u003c/span\u003e\n\u003cspan style=\"color: #4070a0\"\u003e+++\u003c/span\u003e\n\n\u003cspan style=\"color: #4070a0\"\u003e{markdown}\u003c/span\u003e\n\u003cspan style=\"color: #4070a0\"\u003e\u0026#39;\u0026#39;\u0026#39;\u003c/span\u003e\n\n\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color: #06287e\"\u003emigrate\u003c/span\u003e(filepath, hugodir):\n \u003cspan style=\"color: #4070a0; font-style: italic\"\u003e\u0026#39;\u0026#39;\u0026#39;\u003c/span\u003e\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003e Parse the Ghost json file and write post files\u003c/span\u003e\n\u003cspan style=\"color: #4070a0; font-style: italic\"\u003e \u0026#39;\u0026#39;\u0026#39;\u003c/span\u003e\n \u003cspan style=\"color: #007020; font-weight: bold\"\u003ewith\u003c/span\u003e \u003cspan style=\"color: #007020\"\u003eopen\u003c/span\u003e(filepath, \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;r\u0026quot;\u003c/span\u003e) \u003cspan style=\"color: #007020; font-weight: bold\"\u003eas\u003c/span\u003e fp:\n ghost \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e json\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003eload(fp)\n\n data \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e ghost[\u003cspan style=\"color: #4070a0\"\u003e\u0026#39;db\u0026#39;\u003c/span\u003e][\u003cspan style=\"color: #40a070\"\u003e0\u003c/span\u003e][\u003cspan style=\"color: #4070a0\"\u003e\u0026#39;data\u0026#39;\u003c/span\u003e]\n\n tags \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e {}\n \u003cspan style=\"color: #007020; font-weight: bold\"\u003efor\u003c/span\u003e tag \u003cspan style=\"color: #007020; font-weight: bold\"\u003ein\u003c/span\u003e data[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;tags\u0026quot;\u003c/span\u003e]:\n tags[tag[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;id\u0026quot;\u003c/span\u003e]] \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e tag[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;name\u0026quot;\u003c/span\u003e]\n\n posttags \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e defaultdict(\u003cspan style=\"color: #007020\"\u003elist\u003c/span\u003e)\n\n \u003cspan style=\"color: #007020; font-weight: bold\"\u003efor\u003c/span\u003e posttag \u003cspan style=\"color: #007020; font-weight: bold\"\u003ein\u003c/span\u003e data[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;posts_tags\u0026quot;\u003c/span\u003e]:\n posttags[posttag[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;post_id\u0026quot;\u003c/span\u003e]]\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003eappend(tags[posttag[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;tag_id\u0026quot;\u003c/span\u003e]])\n\n \u003cspan style=\"color: #007020; font-weight: bold\"\u003efor\u003c/span\u003e post \u003cspan style=\"color: #007020; font-weight: bold\"\u003ein\u003c/span\u003e data[\u003cspan style=\"color: #4070a0\"\u003e\u0026#39;posts\u0026#39;\u003c/span\u003e]:\n draft \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;true\u0026quot;\u003c/span\u003e \u003cspan style=\"color: #007020; font-weight: bold\"\u003eif\u003c/span\u003e post[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;status\u0026quot;\u003c/span\u003e] \u003cspan style=\"color: #666666\"\u003e==\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;draft\u0026quot;\u003c/span\u003e \u003cspan style=\"color: #007020; font-weight: bold\"\u003eelse\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;false\u0026quot;\u003c/span\u003e\n ts \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e \u003cspan style=\"color: #007020\"\u003eint\u003c/span\u003e(post[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;created_at\u0026quot;\u003c/span\u003e]) \u003cspan style=\"color: #666666\"\u003e/\u003c/span\u003e \u003cspan style=\"color: #40a070\"\u003e1000\u003c/span\u003e\n\n banner \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u0026quot;\u003c/span\u003e \u003cspan style=\"color: #007020; font-weight: bold\"\u003eif\u003c/span\u003e post[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;image\u0026quot;\u003c/span\u003e] \u003cspan style=\"color: #007020; font-weight: bold\"\u003eis\u003c/span\u003e \u003cspan style=\"color: #007020\"\u003eNone\u003c/span\u003e \u003cspan style=\"color: #007020; font-weight: bold\"\u003eelse\u003c/span\u003e post[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;image\u0026quot;\u003c/span\u003e]\n \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# /content/ should not be part of uri anymore\u003c/span\u003e\n banner \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e re\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;^.*/content[s]?/\u0026quot;\u003c/span\u003e, \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;/\u0026quot;\u003c/span\u003e, banner)\n\n target \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e path\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003ejoin(hugodir, \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;content/post\u0026quot;\u003c/span\u003e,\n \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;{}.md\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003eformat(post[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;slug\u0026quot;\u003c/span\u003e]))\n\n aliases \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e [\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;/{}/\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003eformat(post[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;slug\u0026quot;\u003c/span\u003e])]\n\n \u003cspan style=\"color: #007020; font-weight: bold\"\u003eprint\u003c/span\u003e(\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;Migrating \u0026#39;{}\u0026#39; to {}\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003eformat(post[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;title\u0026quot;\u003c/span\u003e],\n target))\n\n hugopost \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e _post\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003eformat(markdown\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003epost[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;markdown\u0026quot;\u003c/span\u003e],\n title\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003epost[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;title\u0026quot;\u003c/span\u003e],\n draft\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003edraft,\n slug\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003epost[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;slug\u0026quot;\u003c/span\u003e],\n date\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003edate\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003efromtimestamp(ts)\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003eisoformat(),\n tags\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003eposttags[post[\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;id\u0026quot;\u003c/span\u003e]],\n banner\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003ebanner,\n aliases\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003ealiases)\n\n \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# this is no longer relevant\u003c/span\u003e\n hugopost \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e hugopost\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003ereplace(\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;```language-\u0026quot;\u003c/span\u003e, \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;```\u0026quot;\u003c/span\u003e)\n \u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# /content/ should not be part of uri anymore\u003c/span\u003e\n hugopost \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e hugopost\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003ereplace(\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;/content/\u0026quot;\u003c/span\u003e, \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;/\u0026quot;\u003c/span\u003e)\n hugopost \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e re\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;^.*/content[s]?/\u0026quot;\u003c/span\u003e, \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;/\u0026quot;\u003c/span\u003e, hugopost)\n\n \u003cspan style=\"color: #007020; font-weight: bold\"\u003ewith\u003c/span\u003e \u003cspan style=\"color: #007020\"\u003eopen\u003c/span\u003e(target, \u003cspan style=\"color: #4070a0\"\u003e\u0026#39;w\u0026#39;\u003c/span\u003e) \u003cspan style=\"color: #007020; font-weight: bold\"\u003eas\u003c/span\u003e fp:\n \u003cspan style=\"color: #007020; font-weight: bold\"\u003eprint\u003c/span\u003e(hugopost, \u003cspan style=\"color: #007020\"\u003efile\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003efp)\n\n\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color: #06287e\"\u003emain\u003c/span\u003e():\n parser \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e argparse\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003eArgumentParser(\n description\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;Migrate an exported Ghost blog to Hugo\u0026quot;\u003c/span\u003e)\n req \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e parser\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003eadd_argument_group(title\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;required arguments\u0026quot;\u003c/span\u003e)\n req\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003eadd_argument(\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;-f\u0026quot;\u003c/span\u003e, \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;--file\u0026quot;\u003c/span\u003e, help\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;JSON file exported from Ghost\u0026quot;\u003c/span\u003e,\n required\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e\u003cspan style=\"color: #007020\"\u003eTrue\u003c/span\u003e)\n req\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003eadd_argument(\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;-d\u0026quot;\u003c/span\u003e, \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;--dir\u0026quot;\u003c/span\u003e, help\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;Directory (root) of Hugo site\u0026quot;\u003c/span\u003e,\n required\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e\u003cspan style=\"color: #007020\"\u003eTrue\u003c/span\u003e)\n\n args \u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e parser\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003eparse_args()\n\n migrate(args\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003efile, args\u003cspan style=\"color: #666666\"\u003e.\u003c/span\u003edir)\n\n\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003eif\u003c/span\u003e \u003cspan style=\"color: #bb60d5\"\u003e__name__\u003c/span\u003e \u003cspan style=\"color: #666666\"\u003e==\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;__main__\u0026quot;\u003c/span\u003e:\n main()\n\u003c/pre\u003e\u003c/div\u003e\n\n\u003cp\u003eNext post, I might write about what changes I made to the theme, and\nsome nifty Nginx tricks you can use to stay compatible with old links.\u003c/p\u003e\n",
+ "date_published": "2016-07-25T23:55:38+02:00",
+ "image": "https://cowboyprogrammer.org/images/hugo-logo.png"
+ }
+
+ , {
+ "id": "https://cowboyprogrammer.org/2016/05/set-refresh-rate-of-screen-from-script/",
+ "url": "https://cowboyprogrammer.org/2016/05/set-refresh-rate-of-screen-from-script/",
+ "title": "Set refresh rate of screen from script",
+ "content_html": "\u003cp\u003eGetting a great new 100 Hz Ultra Wide monitor does not come without its share of tweaking. So it turns out that the refresh you set on your monitor in Nvidia settings (as explained in a \u003ca href=\"https://cowboyprogrammer.org/nvidia-gsync-on-linux/\"\u003eprevious post\u003c/a\u003e does not apply to all the display ports. They apparently count as different screens with different settings or something.\u003c/p\u003e\n\n\u003cp\u003eSo, here\u0026rsquo;s a handy script which you can add to your window manager\u0026rsquo;s autostart applications to set the refresh rate and resolution of your screen, regardless of which actual port you use:\u003c/p\u003e\n\u003cdiv class=\"highlight\" style=\"background: #f0f0f0\"\u003e\u003cpre style=\"line-height: 125%\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e#!/bin/bash -eu\u003c/span\u003e\n\u003cspan style=\"color: #bb60d5\"\u003eRES\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;3440x1440\u0026quot;\u003c/span\u003e\n\u003cspan style=\"color: #bb60d5\"\u003eRR\u003c/span\u003e\u003cspan style=\"color: #666666\"\u003e=\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;100\u0026quot;\u003c/span\u003e\n\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# Do for every output, so that it doesn\u0026#39;t matter where you plug in\u003c/span\u003e\n\u003cspan style=\"color: #60a0b0; font-style: italic\"\u003e# your monitor.\u003c/span\u003e\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003efor\u003c/span\u003e output in \u003cspan style=\"color: #007020; font-weight: bold\"\u003e$(\u003c/span\u003exrandr | grep \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;DP-\u0026quot;\u003c/span\u003e | sed -e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;s/\\(DP-.\\).*/\\1/\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #007020; font-weight: bold\"\u003e)\u003c/span\u003e; \u003cspan style=\"color: #007020; font-weight: bold\"\u003edo\u003c/span\u003e\n \u003cspan style=\"color: #007020\"\u003eecho\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;Trying to set mode on \u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003e$output\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\n \u003cspan style=\"color: #007020; font-weight: bold\"\u003eif\u003c/span\u003e xrandr --output \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003e$output\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e --mode \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003e$RES\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e -r \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003e$RR\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e; \u003cspan style=\"color: #007020; font-weight: bold\"\u003ethen\u003c/span\u003e\n \u003cspan style=\"color: #007020\"\u003eecho\u003c/span\u003e \u003cspan style=\"color: #4070a0\"\u003e\u0026quot;Success: \u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003e$RES\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e \u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003e$RR\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e Hz set on \u003c/span\u003e\u003cspan style=\"color: #bb60d5\"\u003e$output\u003c/span\u003e\u003cspan style=\"color: #4070a0\"\u003e\u0026quot;\u003c/span\u003e\n \u003cspan style=\"color: #007020; font-weight: bold\"\u003efi\u003c/span\u003e\n\u003cspan style=\"color: #007020; font-weight: bold\"\u003edone\u003c/span\u003e\n\u003c/pre\u003e\u003c/div\u003e\n\n\u003cp\u003eIt iterates over all the display ports on your graphics card, so it doesn\u0026rsquo;t matter where you plug your monitor in.\u003c/p\u003e\n\n\u003cp\u003eIn XFCE, you\u0026rsquo;d add this script to \u003cem\u003eApplication Autostart\u003c/em\u003e:\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2016/05/Session-and-Startup_033.png\" alt=\"XFCE Application Autostart\" /\u003e\u003c/p\u003e\n",
+ "date_published": "2016-05-18T00:00:00+00:00",
+ "image": "https://cowboyprogrammer.org/images/2016/05/Selection_034.png"
+ }
+
+ , {
+ "id": "https://cowboyprogrammer.org/2016/04/fixing-the-up-button-in-python-shell-history/",
+ "url": "https://cowboyprogrammer.org/2016/04/fixing-the-up-button-in-python-shell-history/",
+ "title": "Fixing the up button in Python shell history",
+ "content_html": "\u003cp\u003eIn case your python/ipython shell doesn\u0026rsquo;t have a working history, e.g. pressing \u0026#8593; only prints some nonsensical \u003ccode\u003e^[[A\u003c/code\u003e, then you are missing either the \u003ccode\u003ereadline\u003c/code\u003e or \u003ccode\u003encurses\u003c/code\u003e library.\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2016/04/Selection_021.png\" alt=\"Python shell where up doesn't work\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eIpython is more descriptive that something is wrong, but if you\u0026rsquo;re in the habit of mostly using python as a quick calculator, you might never notice:\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2016/04/Selection_022.png\" alt=\"iPython shell where up doesn't work\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eIf you\u0026rsquo;re using \u003ca href=\"http://conda.pydata.org/miniconda.html\"\u003eMiniconda\u003c/a\u003e then just do:\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003econda install ncurses readline\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cp\u003eAnd \u0026#8593; should work:\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2016/04/Selection_023.png\" alt=\"iPython with working up\" /\u003e\u003c/p\u003e\n",
+ "date_published": "2016-04-02T00:00:00+00:00",
+ "image": "https://cowboyprogrammer.org/images/2016/04/Selection_021-1.png"
+ }
+
+ , {
+ "id": "https://cowboyprogrammer.org/2016/03/nvidia-gsync-on-linux/",
+ "url": "https://cowboyprogrammer.org/2016/03/nvidia-gsync-on-linux/",
+ "title": "Nvidia G-Sync and Linux",
+ "content_html": "\n\n\u003cp\u003eAfter getting a fancy new monitor with G-Sync support, I was eager to try it out in my Linux gaming setup. While Nvidia fully supports G-Sync in their Linux drivers, it turns out that other components of the system can get in the way. As explained by a \u003ca href=\"https://devtalk.nvidia.com/default/topic/854184/gsync-is-not-working/?offset=1\"\u003epost on the Nvidia forums\u003c/a\u003e:\u003c/p\u003e\n\n\u003cblockquote\u003e\n\u003cp\u003eFor G-SYNC to work, the application has to be able to flip and the symptoms you\u0026rsquo;re describing here sound like it\u0026rsquo;s not able to flip in your configuration. There are a variety of reasons why flipping might not be working, but the most likely culprits here are either the compositor getting in the way, or the game not being completely full-screen. The full-screen requirement includes the game being completely unoccluded, so if your window manager is drawing something on top of the game, even just by one pixel, it will prevent flipping. Full-screen also means that it has to cover the entire X screen, which includes both monitors if you have them both enabled.\u003c/p\u003e\n\n\u003cp\u003eCan you please try a different window manager / desktop environment to see if the behavior changes?\u003c/p\u003e\n\u003c/blockquote\u003e\n\n\u003cp\u003eSince only a minority of PC-gamers are actually on Linux, and only a minority of those actually have G-Sync capable monitors, Googling for assistance was\u0026hellip; challenging. So, for any other Linux gamers out there, here is a short guide on how to enable G-Sync and verify that it works. Some of the steps are XFCE specific, as this is my window manager of choice on my gaming PC. If you are using a different window manager, you\u0026rsquo;ll have to look through your options to find the equivalent settings.\u003c/p\u003e\n\n\u003ch2 id=\"nvidia-settings\"\u003eNvidia settings\u003c/h2\u003e\n\n\u003cul\u003e\n\u003cli\u003eSync to VBlank: Optional\u003c/li\u003e\n\u003cli\u003eAllow Flipping: Required\u003c/li\u003e\n\u003cli\u003eAllow G-SYNC: Required\u003c/li\u003e\n\u003cli\u003eEnable G-SYNC Visual Indicator: Optional\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003eThe only two required settings are \u003cem\u003eflipping\u003c/em\u003e and \u003cem\u003eG-Sync\u003c/em\u003e, the others are optional. Enabling \u003cem\u003eSync to VBlank\u003c/em\u003e (VSync) in combination with G-Sync only prevents the GPU from generating an FPS beyond your monitor\u0026rsquo;s max refresh rate (which you can\u0026rsquo;t see anyway). It is turned off below the max refresh rate when G-Sync is enabled.\u003c/p\u003e\n\n\u003cp\u003eThe visual indicator is useful here to see that G-Sync is working. If all goes well, you should see a green \u0026ldquo;G-SYNC\u0026rdquo; text in the corner when running a game.\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2016/03/NVIDIA-X-Server-Settings_007.png\" alt=\"Nvidia settings\" /\u003e\u003c/p\u003e\n\n\u003ch2 id=\"disable-compositor\"\u003eDisable compositor\u003c/h2\u003e\n\n\u003cp\u003eAs mentioned in the forum post, a compositor will prevent G-Sync from activating because essentially something is rendering above the game. The same reason prevents G-Sync from working in Window mode (unlike Windows, where G-Sync does not require fullscreen).\u003c/p\u003e\n\n\u003cp\u003eFor XFCE, go to \u003cem\u003eWindow Manager Tweaks\u003c/em\u003e under \u003cem\u003eSettings\u003c/em\u003e\n\u003cimg src=\"/images/2016/03/Selection_004.png\" alt=\"XFCE Settings\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eThen under the \u003cem\u003eCompositor\u003c/em\u003e tab, make sure the compositor is disabled\n\u003cimg src=\"/images/2016/03/Selection_005.png\" alt=\"Window Manager Tweaks\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eIn addition, depending on your setup, make sure you don\u0026rsquo;t have things like \u003ca href=\"https://wiki.archlinux.org/index.php/Compton\"\u003eCompton\u003c/a\u003e or \u003ca href=\"https://wiki.archlinux.org/index.php/Compiz\"\u003eCompiz\u003c/a\u003e enabled.\u003c/p\u003e\n\n\u003ch2 id=\"start-a-game-in-fullscreen\"\u003eStart a game in fullscreen\u003c/h2\u003e\n\n\u003cp\u003eAs mentioned, you must run the game in fullscreen mode. G-Sync does not work with window mode in Linux.\u003c/p\u003e\n\n\u003cp\u003eI did notice that there are games which do not enable G-Sync. One example is \u0026ldquo;Cities: Skylines\u0026rdquo;. So make sure to try several games if you don\u0026rsquo;t see the G-Sync logo.\u003c/p\u003e\n\n\u003cp\u003eA good candidate here is Dota 2 since it is free to play. Dota 2 running in \u0026ldquo;Desktop-Friendly Fullscreen\u0026rdquo; does enable G-Sync. As does Portal 2 and XCOM 2.\u003c/p\u003e\n",
+ "date_published": "2016-03-05T00:00:00+00:00",
+ "image": "https://cowboyprogrammer.org/images/2016/03/NVIDIA-X-Server-Settings_007-1.png"
+ }
+
+ , {
+ "id": "https://cowboyprogrammer.org/2014/12/encrypt-a-btrfs-raid5-array-in-place/",
+ "url": "https://cowboyprogrammer.org/2014/12/encrypt-a-btrfs-raid5-array-in-place/",
+ "title": "Encrypt a BTRFS RAID5-array in-place",
+ "content_html": "\n\n\u003cp\u003eWhen I decided I needed more disk space for media and virtual machine (VM) images, I decided to throw some more money at the problem and get three 3TB hard drives and run \u003ca href=\"https://btrfs.wiki.kernel.org/index.php/Main_Page\"\u003eBTRFS\u003c/a\u003e in \u003ca href=\"http://en.wikipedia.org/wiki/RAID#Standard_levels\"\u003eRAID5\u003c/a\u003e. It\u0026rsquo;s still somewhat experimental, but has proven very solid for me.\u003c/p\u003e\n\n\u003cp\u003eRAID5 means that one drive can completely fail, but all the data is still intact. All one has to do is insert a new drive and the drive will be reconstructed. While RAID5 protects against a complete drive failure, it does nothing to prevent a single bit to be flipped to due cosmic rays or electricity spikes.\u003c/p\u003e\n\n\u003cp\u003eBTRFS is a new filesystem for Linux which does what ZFS does for BSD. The two important features which it offers over previous systems is: copy-on-write (COW), and bitrot protection. See, when running RAID with BTRFS, if a single bit is flipped, BTRFS will detect it when you try to read the file and correct it (if running in RAID so there\u0026rsquo;s redundancy). COW means you can take snapshots of the entire drive instantly without using extra space. Space will only be required when stuff change and diverge from your snapshots.\u003c/p\u003e\n\n\u003cp\u003eSee \u003ca href=\"http://arstechnica.com/information-technology/2014/01/bitrot-and-atomic-cows-inside-next-gen-filesystems/\"\u003eArstechnica\u003c/a\u003e for why \u003cem\u003eBTRFS\u003c/em\u003e is da shit for your next drive or system.\u003c/p\u003e\n\n\u003cp\u003eWhat I did not do at the time was encrypt the drives. \u003ca href=\"http://www.linuxvoice.com/\"\u003eLinux Voice #11\u003c/a\u003e had a very nice article on encryption so I thought I\u0026rsquo;d set it up. And because I\u0026rsquo;m using RAID5, it is actually possible for me to encrypt my drives using \u003ca href=\"https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption\"\u003edm-crypt/LUKS\u003c/a\u003e in-place, while the whole shebang is mounted, readable and usable :)\u003c/p\u003e\n\n\u003cp\u003eSome initial mistakes meant I had to actually reboot the system, so I thought I\u0026rsquo;d write down how to do it correctly. So to summarize, the goal is to convert three disks to three encrypted disks. BTRFS will be moved from using the drives directly, to using the LUKS-mapped.\u003c/p\u003e\n\n\u003ch3 id=\"unmount-the-raid-system-time-1-second\"\u003eUnmount the raid system (time 1 second)\u003c/h3\u003e\n\n\u003cp\u003eSadly, we need to unmount the volume to be able to \u0026ldquo;remove\u0026rdquo; the drive. This needs to be done so the system can understand that the drive has \u0026ldquo;vanished\u0026rdquo;. It will only stay unmounted for about a minute though.\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003esudo umount /path/to/vol\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cp\u003eThis is assuming you have configured your \u003cstrong\u003efstab\u003c/strong\u003e with all the details. For example, with something like this (ALWAYS USE UUID!!)\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e# BTRFS Systems\nUUID=\u0026quot;ac21dd50-e6ee-4a9e-abcd-459cba0e6913\u0026quot; /mnt/btrfs btrfs defaults 0 0\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cp\u003eNote that no modification of the \u003cstrong\u003efstab\u003c/strong\u003e will be necessary if you have used UUID.\u003c/p\u003e\n\n\u003ch3 id=\"encrypt-one-of-the-drives-time-10-seconds\"\u003eEncrypt one of the drives (time 10 seconds)\u003c/h3\u003e\n\n\u003cp\u003ePick one of the drives to encrypt. Here it\u0026rsquo;s \u003ccode\u003e/dev/sdc\u003c/code\u003e:\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003esudo cryptsetup luksFormat -v /dev/sdc\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003ch3 id=\"open-the-encrypted-drive-time-30-seconds\"\u003eOpen the encrypted drive (time 30 seconds)\u003c/h3\u003e\n\n\u003cp\u003eTo use it, we have to open the drive. You can pick any name you want:\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003esudo cryptsetup luksOpen /dev/sdc DRIVENAME\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cp\u003eTo make this happen on boot, find the new \u003cem\u003eUUID\u003c/em\u003e of \u003ccode\u003e/dev/sdc\u003c/code\u003e with \u003ccode\u003eblkid\u003c/code\u003e:\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003esudo blkid\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2014/Dec/Screenshot-from-2014-12-29-13-28-29.png\" alt=\"Output of blkid\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eSo for me, the drive has a the following \u003cem\u003eUUID:\u003c/em\u003e \u003ccode\u003ef5d3974c-529e-4574-bbfa-7f3e6db05c65\u003c/code\u003e. Add the following line to \u003ccode\u003e/etc/crypttab\u003c/code\u003e with your desired drive name and your \u003cem\u003eUUID\u003c/em\u003e (without any quotes):\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eDRIVENAME UUID=your-uuid-without-quotes none luks\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cp\u003eNow the system will ask for your password on boot.\u003c/p\u003e\n\n\u003ch3 id=\"add-the-encrypted-drive-to-the-raid-time-20-seconds\"\u003eAdd the encrypted drive to the raid (time 20 seconds)\u003c/h3\u003e\n\n\u003cp\u003eFirst we have to remount the raid system. This will fail because there is a missing drive, unless we add the option \u003cem\u003edegraded\u003c/em\u003e.\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003esudo mount -o degraded /path/to/vol\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cp\u003eThere will be some complaints about missing drives and such, which is exactly what we expect. Now, just add the new drive:\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003esudo btrfs device add /dev/mapper/DRIVENAME /path/to/vol\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003ch3 id=\"remove-the-missing-drive-time-14-hours\"\u003eRemove the missing drive (time 14 hours)\u003c/h3\u003e\n\n\u003cp\u003eThe final step is to remove the old drive. We can use the special name \u003cem\u003emissing\u003c/em\u003e to remove it:\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003esudo btrfs device delete missing /path/to/vol\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cp\u003eThis can take a really long time, and by long I mean ~15 hours if you have a terrabyte of data. But, you can still use the drive during this process so just be patient.\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/2014/Dec/Screenshot-from-2014-12-29-12-48-45.png\" alt=\"Balance took 14 hours\" /\u003e\u003c/p\u003e\n\n\u003cp\u003eFor me it took 14 hours 34 minutes. The reason for the delay is because the \u003cem\u003edelete\u003c/em\u003e command will force the system to rebuild the missing drive on your new encrypted volume.\u003c/p\u003e\n\n\u003ch3 id=\"next-drive-rinse-and-repeat\"\u003eNext drive, rinse and repeat\u003c/h3\u003e\n\n\u003cp\u003eJust unmount the raid, encrypt the drive, add it back and delete the missing. Repeat for all drives in your array. Once the last drive is done, unmount the array and remount it without the \u003ccode\u003e-o degraded\u003c/code\u003e option. Now you have an encrypted RAID array.\u003c/p\u003e\n",
+ "date_published": "2014-12-28T00:00:00+00:00"
+ }
+
+ ]
+
+}
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/empty_slash_comment.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/empty_slash_comment.xml
new file mode 100644
index 000000000..cace5bb90
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/empty_slash_comment.xml
@@ -0,0 +1,32 @@
+
+
+
+
+ Golem.de
+ IT-News fuer Profis
+ https://www.golem.de/
+
+ Sat, 09 Dec 2017 15:49:02 +0100
+ FeedCreator 1.6
+
+ https://www.golem.de/staticrl/images/golem-rss.png
+ Golem.de
+ https://www.golem.de/
+ Golem.de News Feed
+
+ de
+
+
+ Anheuser Busch: US-Brauerei bestellt 40 Tesla-Trucks vor
+ https://www.golem.de/news/anheuser-busch-us-brauerei-bestellt-40-tesla-trucks-vor-1712-131577-rss.html
+ Das US-Brau-Unternehmen Anheuser Busch hat 40 der neuen Lkws von Tesla vorbestellt. Dem Hersteller zufolge ist das die grte Vorbestellung bisher. Auch Walmart und DHL haben den Elektro-Truck bereits geordert. (<a href="https://www.golem.de/specials/tesla/">Tesla</a>, <a href="https://www.golem.de/specials/elektroauto/">Elektroauto</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131577&page=1&ts=1512830640" alt="" width="1" height="1" />
+ Sat, 09 Dec 2017 15:44:00 +0100
+ https://www.golem.de/1712/131577-rss.html
+ Das US-Brau-Unternehmen Anheuser Busch hat 40 der neuen Lkws von Tesla vorbestellt. Dem Hersteller zufolge ist das die grte Vorbestellung bisher. Auch Walmart und DHL haben den Elektro-Truck bereits geordert. (Tesla, Elektroauto) ]]>
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/fz.html b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/fz.html
new file mode 100644
index 000000000..25820de36
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/fz.html
@@ -0,0 +1,2561 @@
+
+
+
+
+
+
+
+
+
+
+ #1 - FZ.se
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/golem-de.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/golem-de.xml
new file mode 100644
index 000000000..34b9becc4
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/golem-de.xml
@@ -0,0 +1,422 @@
+
+
+
+
+ Golem.de
+ IT-News fuer Profis
+ https://www.golem.de/
+
+ Sat, 09 Dec 2017 15:49:02 +0100
+ FeedCreator 1.6
+
+ https://www.golem.de/staticrl/images/golem-rss.png
+ Golem.de
+ https://www.golem.de/
+ Golem.de News Feed
+
+ de
+
+
+ Anheuser Busch: US-Brauerei bestellt 40 Tesla-Trucks vor
+ https://www.golem.de/news/anheuser-busch-us-brauerei-bestellt-40-tesla-trucks-vor-1712-131577-rss.html
+ Das US-Brau-Unternehmen Anheuser Busch hat 40 der neuen Lkws von Tesla vorbestellt. Dem Hersteller zufolge ist das die grte Vorbestellung bisher. Auch Walmart und DHL haben den Elektro-Truck bereits geordert. (<a href="https://www.golem.de/specials/tesla/">Tesla</a>, <a href="https://www.golem.de/specials/elektroauto/">Elektroauto</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131577&page=1&ts=1512830640" alt="" width="1" height="1" />
+ Sat, 09 Dec 2017 15:44:00 +0100
+ https://www.golem.de/1712/131577-rss.html
+ Das US-Brau-Unternehmen Anheuser Busch hat 40 der neuen Lkws von Tesla vorbestellt. Dem Hersteller zufolge ist das die grte Vorbestellung bisher. Auch Walmart und DHL haben den Elektro-Truck bereits geordert. (Tesla, Elektroauto) ]]>
+ 0
+
+
+ Apple: Jony Ive bernimmt wieder Apples Produktdesign
+ https://www.golem.de/news/apple-jony-ive-uebernimmt-wieder-apples-produktdesign-1712-131576-rss.html
+ Der Apple Park ist fertig, also hat Jony Ive wieder Zeit fr Produktdesign: Ab sofort ist der britische Designer wieder fr das Aussehen von Apples Gerten und Software verantwortlich. Die vergangenen zwei Jahre war Ive in die Designentscheidungen von Produkten nicht involviert. (<a href="https://www.golem.de/specials/jonathan-ive/">Jonathan Ive</a>, <a href="https://www.golem.de/specials/apple/">Apple</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131576&page=1&ts=1512824700" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/handy/apple-jony-ive-uebernimmt-wieder-apples-produktdesign/114242,list.html
+ Sat, 09 Dec 2017 14:05:00 +0100
+ https://www.golem.de/1712/131576-rss.html
+ Der Apple Park ist fertig, also hat Jony Ive wieder Zeit fr Produktdesign: Ab sofort ist der britische Designer wieder fr das Aussehen von Apples Gerten und Software verantwortlich. Die vergangenen zwei Jahre war Ive in die Designentscheidungen von Produkten nicht involviert. (Jonathan Ive, Apple) ]]>
+ 0
+
+
+ Elon Musk: Tesla will eigene KI-Chips bauen
+ https://www.golem.de/news/elon-musk-tesla-will-eigene-ki-chips-bauen-1712-131575-rss.html
+ Auf einer Konferenz hat Tesla-Grnder Elon Musk verraten, dass das Unternehmen eigene KI-Chips fr autonome Fahrzeuge entwickelt. An der Forschung beteiligt ist Jim Keller, der zuvor unter anderem bei AMD Chips entwickelt hat. (<a href="https://www.golem.de/specials/tesla/">Tesla</a>, <a href="https://www.golem.de/specials/ki/">KI</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131575&page=1&ts=1512821340" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/automobil/elon-musk-tesla-will-eigene-ki-chips-bauen/114241,list.html
+ Sat, 09 Dec 2017 13:09:00 +0100
+ https://www.golem.de/1712/131575-rss.html
+ Auf einer Konferenz hat Tesla-Grnder Elon Musk verraten, dass das Unternehmen eigene KI-Chips fr autonome Fahrzeuge entwickelt. An der Forschung beteiligt ist Jim Keller, der zuvor unter anderem bei AMD Chips entwickelt hat. (Tesla, KI) ]]>
+ 0
+
+
+ Die Woche im Video: Lauscher auf!
+ https://www.golem.de/news/die-woche-im-video-lauscher-auf-1712-131540-rss.html
+ Security ist kaputt und ein Tesla-Mietwagen vllig demoliert. Auerdem drehen wir gleich zwlf smarte Lautsprecher - oder besser Lauschsprecher - auf. Sieben Tage und viele Meldungen im berblick. (<a href="https://www.golem.de/specials/golemwochenrueckblick/">Golem-Wochenrckblick</a>, <a href="https://www.golem.de/specials/apple-tv/">Apple TV</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131540&page=1&ts=1512806580" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/politik-recht/die-woche-im-video-lauscher-auf/114240,list.html
+ Sat, 09 Dec 2017 09:03:00 +0100
+ https://www.golem.de/1712/131540-rss.html
+ Security ist kaputt und ein Tesla-Mietwagen vllig demoliert. Auerdem drehen wir gleich zwlf smarte Lautsprecher - oder besser Lauschsprecher - auf. Sieben Tage und viele Meldungen im berblick. (Golem-Wochenrckblick, Apple TV) ]]>
+ 0
+
+
+ Entlassungen: Kaufland beendet Online-Lieferservice fr Lebensmittel
+ https://www.golem.de/news/entlassungen-kaufland-beendet-online-lieferservice-fuer-lebensmittel-1712-131573-rss.html
+ Viele Kunden hatten Interesse an dem Online-Lieferservice fr Lebensmittel von Kaufland. Dennoch hrt das Unternehmen jetzt damit auf. Amazon drfte sich freuen. (<a href="https://www.golem.de/specials/amazon/">Amazon</a>, <a href="https://www.golem.de/specials/lieferdienst/">Lieferdienst</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131573&page=1&ts=1512757080" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wirtschaft/entlassungen-kaufland-beendet-online-lieferservice-fuer-lebensmittel/114239,list.html
+ Fri, 08 Dec 2017 19:18:00 +0100
+ https://www.golem.de/1712/131573-rss.html
+ Viele Kunden hatten Interesse an dem Online-Lieferservice fr Lebensmittel von Kaufland. Dennoch hrt das Unternehmen jetzt damit auf. Amazon drfte sich freuen. (Amazon, Lieferdienst) ]]>
+ 61
+
+
+ DigiNetz-Gesetz: Unitymedia berbaut keine Glasfaser in Frdergebieten
+ https://www.golem.de/news/diginetz-gesetz-unitymedia-ueberbaut-keine-glasfaser-in-foerdergebieten-1712-131572-rss.html
+ Im Streit um ein Open-Access-Modell blieb Unitymedia hart. Wir haben uns vom Leiter Regulatory des Unternehmens die Hintergrnde zur Entscheidung um die Mitverlegung von Glasfaserkabeln in einem Neubaugebiet erklren lassen. (<a href="https://www.golem.de/specials/bundesnetzagentur/">Bundesnetzagentur</a>, <a href="https://www.golem.de/specials/openaccess/">Open Access</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131572&page=1&ts=1512754860" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/politik-recht/diginetz-gesetz-unitymedia-ueberbaut-keine-glasfaser-in-foerdergebieten/114238,list.html
+ Fri, 08 Dec 2017 18:41:00 +0100
+ https://www.golem.de/1712/131572-rss.html
+ Im Streit um ein Open-Access-Modell blieb Unitymedia hart. Wir haben uns vom Leiter Regulatory des Unternehmens die Hintergrnde zur Entscheidung um die Mitverlegung von Glasfaserkabeln in einem Neubaugebiet erklren lassen. (Bundesnetzagentur, Open Access) ]]>
+ 4
+
+
+ Telekom: Mobilfunk an neuer ICE-Strecke Mnchen-Berlin ausgebaut
+ https://www.golem.de/news/telekom-mobilfunk-an-neuer-ice-strecke-muenchen-berlin-ausgebaut-1712-131571-rss.html
+ Die neue ICE-Strecke zwischen Mnchen und Berlin erforderte auch Anstrengungen von den Mobilfunkbetreibern Deutsche Telekom, Vodafone und Telefnica. Die drei Konkurrenten haben hier zusammengearbeitet. (<a href="https://www.golem.de/specials/deutsche-bahn/">Deutsche Bahn</a>, <a href="https://www.golem.de/specials/wlan/">WLAN</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131571&page=1&ts=1512753900" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wirtschaft/telekom-mobilfunk-an-neuer-ice-strecke-muenchen-berlin-ausgebaut/114237,list.html
+ Fri, 08 Dec 2017 18:25:00 +0100
+ https://www.golem.de/1712/131571-rss.html
+ Die neue ICE-Strecke zwischen Mnchen und Berlin erforderte auch Anstrengungen von den Mobilfunkbetreibern Deutsche Telekom, Vodafone und Telefnica. Die drei Konkurrenten haben hier zusammengearbeitet. (Deutsche Bahn, WLAN) ]]>
+ 14
+
+
+ Modems: Huawei und Telekom warnen vor Angriffen auf Wartungsports
+ https://www.golem.de/news/modems-huawei-und-telekom-warnen-vor-angriffen-auf-wartungsports-1712-131570-rss.html
+ Ein IoT-Botnetz greift derzeit weltweit Modems von Huawei ber einen Wartungsport an, die Deutsche Telekom spricht von bis zu 100.000 infizierten Gerten. Huawei gibt Sicherheitstipps und will einen Patch bereitstellen. (<a href="https://www.golem.de/specials/huawei/">Huawei</a>, <a href="https://www.golem.de/specials/telekom/">Telekom</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131570&page=1&ts=1512752940" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/modems-huawei-und-telekom-warnen-vor-angriffen-auf-wartungsports/114236,list.html
+ Fri, 08 Dec 2017 18:09:00 +0100
+ https://www.golem.de/1712/131570-rss.html
+ Ein IoT-Botnetz greift derzeit weltweit Modems von Huawei ber einen Wartungsport an, die Deutsche Telekom spricht von bis zu 100.000 infizierten Gerten. Huawei gibt Sicherheitstipps und will einen Patch bereitstellen. (Huawei, Telekom) ]]>
+ 5
+
+
+ Antivirus: Microsoft bringt Extra-Patch fr kritische Lcke in Defender
+ https://www.golem.de/news/antivirus-microsoft-bringt-extra-patch-fuer-kritische-luecke-in-defender-1712-131569-rss.html
+ Erneut trifft es Windows Defender: Ein Speicherfehler kann Angreifer in die Lage versetzen, den Virenscanner zum Ausfhren von Code zu nutzen. Microsoft hlt aktive Exploits allerdings fr unwahrscheinlich, Patches werden verteilt. (<a href="https://www.golem.de/specials/security/">Security</a>, <a href="https://www.golem.de/specials/virenscanner/">Virenscanner</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131569&page=1&ts=1512747300" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/antivirus-microsoft-bringt-extra-patch-fuer-kritische-luecke-in-defender/114235,list.html
+ Fri, 08 Dec 2017 16:35:00 +0100
+ https://www.golem.de/1712/131569-rss.html
+ Erneut trifft es Windows Defender: Ein Speicherfehler kann Angreifer in die Lage versetzen, den Virenscanner zum Ausfhren von Code zu nutzen. Microsoft hlt aktive Exploits allerdings fr unwahrscheinlich, Patches werden verteilt. (Security, Virenscanner) ]]>
+ 6
+
+
+ Bandai Namco: Neue Taktiken fr Prgelspieler in Soul Calibur 6
+ https://www.golem.de/news/bandai-namco-neue-taktiken-fuer-pruegelspieler-in-soul-calibur-6-1712-131568-rss.html
+ Altbekannte Helden, aber auch ein paar Neuzugnge und berarbeitete Taktiken: Bandai Namco hat das Prgelspiel Soul Calibur 6 fr Windows-PC und Konsolen angekndigt. (<a href="https://www.golem.de/specials/soul-calibur/">Soul Calibur</a>, <a href="https://www.golem.de/specials/steam/">Steam</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131568&page=1&ts=1512744660" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/games/bandai-namco-neue-taktiken-fuer-pruegelspieler-in-soul-calibur-6/114234,list.html
+ Fri, 08 Dec 2017 15:51:00 +0100
+ https://www.golem.de/1712/131568-rss.html
+ Altbekannte Helden, aber auch ein paar Neuzugnge und berarbeitete Taktiken: Bandai Namco hat das Prgelspiel Soul Calibur 6 fr Windows-PC und Konsolen angekndigt. (Soul Calibur, Steam) ]]>
+ 9
+
+
+ C++ Framework: Qt 5.10 streamt UIs und bringt moderne Crypto
+ https://www.golem.de/news/c-framework-qt-5-10-streamt-uis-und-bringt-moderne-crypto-1712-131567-rss.html
+ Mit der aktuellen Version 5.10 von Qt lassen sich UIs per WebGL streamen, Multi-Touch-Eingaben besser bearbeiten und QtQuick-Steuerelemente ber Bilder umsetzen. Darber hinaus kann Qt nun OpenSSL 1.1 nutzen und liefert bessere Zufallszahlen. (<a href="https://www.golem.de/specials/qt/">Qt</a>, <a href="https://www.golem.de/specials/api/">API</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131567&page=1&ts=1512743340" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/software-entwicklung/c-framework-qt-5.10-streamt-uis-und-bringt-moderne-crypto/114233,list.html
+ Fri, 08 Dec 2017 15:29:00 +0100
+ https://www.golem.de/1712/131567-rss.html
+ Mit der aktuellen Version 5.10 von Qt lassen sich UIs per WebGL streamen, Multi-Touch-Eingaben besser bearbeiten und QtQuick-Steuerelemente ber Bilder umsetzen. Darber hinaus kann Qt nun OpenSSL 1.1 nutzen und liefert bessere Zufallszahlen. (Qt, API) ]]>
+ 5
+
+
+ Bluehole: Pubg-Wstenkarte Miramar auf Testservern spielbar
+ https://www.golem.de/news/bluehole-pubg-wuestenkarte-miramar-auf-testservern-spielbar-1712-131566-rss.html
+ Kurz vor Weihnachten 2017 erscheint die erste finale Version von Playerunknown's Battlegrounds. Bereits jetzt knnen Spieler die Wstenkarte Miramar auf den Testservern ausprobieren. (<a href="https://www.golem.de/specials/playerunknowns-battlegrounds/">Playerunknown's Battlegrounds</a>, <a href="https://www.golem.de/specials/steam/">Steam</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131566&page=1&ts=1512742200" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/games/bluehole-pubg-wuestenkarte-miramar-auf-testservern-spielbar/114231,list.html
+ Fri, 08 Dec 2017 15:10:00 +0100
+ https://www.golem.de/1712/131566-rss.html
+ Kurz vor Weihnachten 2017 erscheint die erste finale Version von Playerunknown's Battlegrounds. Bereits jetzt knnen Spieler die Wstenkarte Miramar auf den Testservern ausprobieren. (Playerunknown's Battlegrounds, Steam) ]]>
+ 4
+
+
+ Bridge: Protonmail startet lokalen IMAP-Server fr Verschlsselung
+ https://www.golem.de/news/bridge-protonmail-startet-lokalen-imap-server-fuer-verschluesselung-1712-131565-rss.html
+ Mit einer neuen Software sollen verschlsselte E-Mails praxistauglicher werden: Proton stellt die Bridge vor. Diese bernimmt die Verschlsselung und kommuniziert via IMAP und SMTP mit dem Mailclient. (<a href="https://www.golem.de/specials/protonmail/">Protonmail</a>, <a href="https://www.golem.de/specials/macosx/">Mac OS X</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131565&page=1&ts=1512740760" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/bridge-protonmail-startet-lokalen-imap-server-fuer-verschluesselung/114230,list.html
+ Fri, 08 Dec 2017 14:46:00 +0100
+ https://www.golem.de/1712/131565-rss.html
+ Mit einer neuen Software sollen verschlsselte E-Mails praxistauglicher werden: Proton stellt die Bridge vor. Diese bernimmt die Verschlsselung und kommuniziert via IMAP und SMTP mit dem Mailclient. (Protonmail, Mac OS X) ]]>
+ 1
+
+
+ Nvidia Titan V: Die neue schnellste Grafikkarte kostet 3.100 Euro
+ https://www.golem.de/news/nvidia-titan-v-die-neue-schnellste-grafikkarte-kostet-3-100-euro-1712-131562-rss.html
+ Nvidia hat mit der Titan V die mit Abstand flotteste Grafikkarte vorgestellt. Fr 3.100 Euro erhalten Kufer den Volta-basierten Pixelbeschleuniger kostenlos geliefert. Ungeachtet des hohen Preises hat Nvidia die Karte aber um ein Viertel beschnitten. (<a href="https://www.golem.de/specials/nvidia-volta/">Nvidia Volta</a>, <a href="https://www.golem.de/specials/grafikhardware/">Grafikhardware</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131562&page=1&ts=1512733020" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/sonstiges/nvidia-titan-v-die-neue-schnellste-grafikkarte-kostet-3.100-euro/114228,list.html
+ Fri, 08 Dec 2017 12:37:00 +0100
+ https://www.golem.de/1712/131562-rss.html
+ Nvidia hat mit der Titan V die mit Abstand flotteste Grafikkarte vorgestellt. Fr 3.100 Euro erhalten Kufer den Volta-basierten Pixelbeschleuniger kostenlos geliefert. Ungeachtet des hohen Preises hat Nvidia die Karte aber um ein Viertel beschnitten. (Nvidia Volta, Grafikhardware) ]]>
+ 70
+
+
+ Kilopower: Ein Kernreaktor fr Raumsonden
+ https://www.golem.de/news/kilopower-ein-kernreaktor-fuer-raumsonden-1712-131418-rss.html
+ Als Ersatz fr Radioisotopenbatterien entwickelt die Nasa kleine Kernreaktoren, die flexibler, leistungsstrker und beim Start weniger radioaktiv sind. Von Frank Wunderlich-Pfeiffer (<a href="https://www.golem.de/specials/raumfahrt/">Raumfahrt</a>, <a href="https://www.golem.de/specials/nasa/">Nasa</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131418&page=1&ts=1512730920" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/internet/kilopower-ein-kernreaktor-fuer-raumsonden/114227,list.html
+ Fri, 08 Dec 2017 12:02:00 +0100
+ https://www.golem.de/1712/131418-rss.html
+ Als Ersatz fr Radioisotopenbatterien entwickelt die Nasa kleine Kernreaktoren, die flexibler, leistungsstrker und beim Start weniger radioaktiv sind. Von Frank Wunderlich-Pfeiffer (Raumfahrt, Nasa) ]]>
+ 58
+
+
+ Trotz Reform: BND lsst neues Kontrollgremium angeblich auflaufen
+ https://www.golem.de/news/trotz-reform-bnd-laesst-neues-kontrollgremium-angeblich-auflaufen-1712-131561-rss.html
+ Die BND-Reform nach den Enthllungen des NSA-Ausschusses sollte eine bessere Kontrolle des Geheimdienstes ermglichen. Das scheint jedoch noch nicht zu funktionieren. (<a href="https://www.golem.de/specials/bnd/">BND</a>, <a href="https://www.golem.de/specials/datenschutz/">Datenschutz</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131561&page=1&ts=1512730620" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/internet/trotz-reform-bnd-laesst-neues-kontrollgremium-angeblich-auflaufen/114226,list.html
+ Fri, 08 Dec 2017 11:57:00 +0100
+ https://www.golem.de/1712/131561-rss.html
+ Die BND-Reform nach den Enthllungen des NSA-Ausschusses sollte eine bessere Kontrolle des Geheimdienstes ermglichen. Das scheint jedoch noch nicht zu funktionieren. (BND, Datenschutz) ]]>
+ 8
+
+
+ In the Valley of Gods: Firewatch-Macher betreten das Tal der Gtter
+ https://www.golem.de/news/in-the-valley-of-gods-firewatch-macher-betreten-das-tal-der-goetter-1712-131560-rss.html
+ Nach Abenteuern in einem US-Nationalpark (Firewatch) wagen die Entwickler vom Studio Campo Santo ein etwas exotischeres Szenario: Ihr nchstes Werk In the Valley of Gods schickt Spieler auf Schatzsuche in ein gyptisches Tal. (<a href="https://www.golem.de/specials/adventure/">Adventure</a>, <a href="https://www.golem.de/specials/playstation4/">Playstation 4</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131560&page=1&ts=1512728880" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/games/in-the-valley-of-gods-firewatch-macher-betreten-das-tal-der-goetter/114222,list.html
+ Fri, 08 Dec 2017 11:28:00 +0100
+ https://www.golem.de/1712/131560-rss.html
+ Nach Abenteuern in einem US-Nationalpark (Firewatch) wagen die Entwickler vom Studio Campo Santo ein etwas exotischeres Szenario: Ihr nchstes Werk In the Valley of Gods schickt Spieler auf Schatzsuche in ein gyptisches Tal. (Adventure, Playstation 4) ]]>
+ 8
+
+
+ Dynamics 365: Microsoft verteilt privaten Schlssel an alle Kunden
+ https://www.golem.de/news/microsoft-dynamics-365-microsoft-leakt-wildcard-zertifikat-for-clouddienst-1712-131542-rss.html
+ Microsoft hat aus Versehen einen privaten Schlssel fr seinen Clouddienst Dynamics 365 verffentlicht - und schaffte es ber Monate nicht, auf Hinweise zu reagieren. Zwischenzeitlich empfahl der Support sogar, eine Krisenreaktionsfirma aus der lindustrie anzurufen, um das Problem zu beseitigen. Von Hanno Bck (<a href="https://www.golem.de/specials/microsoft/">Microsoft</a>, <a href="https://www.golem.de/specials/serverapps/">Server-Applikationen</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131542&page=1&ts=1512727860" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/dynamics-365-microsoft-verteilt-privaten-schluessel-an-alle-kunden/114220,list.html
+ Fri, 08 Dec 2017 11:11:00 +0100
+ https://www.golem.de/1712/131542-rss.html
+ Microsoft hat aus Versehen einen privaten Schlssel fr seinen Clouddienst Dynamics 365 verffentlicht - und schaffte es ber Monate nicht, auf Hinweise zu reagieren. Zwischenzeitlich empfahl der Support sogar, eine Krisenreaktionsfirma aus der lindustrie anzurufen, um das Problem zu beseitigen. Von Hanno Bck (Microsoft, Server-Applikationen) ]]>
+ 20
+
+
+ Apple: Fehler in Homekit ermglichte offenbar unbefugten Zugang
+ https://www.golem.de/news/apple-fehler-in-homekit-erlaubte-offenbar-unbefugten-zugang-1712-131559-rss.html
+ Ein Fehler im Homekit-Framework soll dazu gefhrt haben, dass Smart-Devices von auerhalb gesteuert werden konnten. Apple hat einen Fehler eingestanden und bereits eine bergangslsung verteilt, wodurch jedoch bestimmte Funktionen von Homekit zunchst eingeschrnkt sind. (<a href="https://www.golem.de/specials/homekit/">Homekit</a>, <a href="https://www.golem.de/specials/apple/">Apple</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131559&page=1&ts=1512726600" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/applikationen/apple-fehler-in-homekit-ermoeglichte-offenbar-unbefugten-zugang/114216,list.html
+ Fri, 08 Dec 2017 10:50:00 +0100
+ https://www.golem.de/1712/131559-rss.html
+ Ein Fehler im Homekit-Framework soll dazu gefhrt haben, dass Smart-Devices von auerhalb gesteuert werden konnten. Apple hat einen Fehler eingestanden und bereits eine bergangslsung verteilt, wodurch jedoch bestimmte Funktionen von Homekit zunchst eingeschrnkt sind. (Homekit, Apple) ]]>
+ 7
+
+
+ Bundesregierung: Mit verdrehten Zahlen gegen die ePrivacy-Verordnung
+ https://www.golem.de/news/bundesregierung-mit-verdrehten-zahlen-gegen-die-eprivacy-verordnung-1712-131553-rss.html
+ Die Werbewirtschaft luft weiter Sturm gegen die geplante EU-Verordnung zum Schutz vor Nutzertracking. Doch die Bundesregierung geht in einer Studie offenbar bewusst von nicht belegten Zahlen aus und verkehrt die Nutzererwartungen in ihr Gegenteil. Eine Analyse von Friedhelm Greis (<a href="https://www.golem.de/specials/europaeische-union/">EU</a>, <a href="https://www.golem.de/specials/datenschutz/">Datenschutz</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131553&page=1&ts=1512724620" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/bundesregierung-mit-verdrehten-zahlen-gegen-die-eprivacy-verordnung/114215,list.html
+ Fri, 08 Dec 2017 10:17:00 +0100
+ https://www.golem.de/1712/131553-rss.html
+ Die Werbewirtschaft luft weiter Sturm gegen die geplante EU-Verordnung zum Schutz vor Nutzertracking. Doch die Bundesregierung geht in einer Studie offenbar bewusst von nicht belegten Zahlen aus und verkehrt die Nutzererwartungen in ihr Gegenteil. Eine Analyse von Friedhelm Greis (EU, Datenschutz) ]]>
+ 63
+
+
+ Telekom-Klage: Gericht untersagt O2 Falschbehauptungen bei Kundenwerbung
+ https://www.golem.de/news/telekom-klage-gericht-untersagt-o2-falschbehauptungen-bei-kundenwerbung-1712-131558-rss.html
+ Ein Gericht hat befunden, dass der Netzanbieter O2 bei der Anwerbung von Kunden gelogen habe. Einige Mitarbeiter hatten unter anderem behauptet, die Telekom werde Anschlsse nicht mehr bedienen, und so versucht, Kunden neue Vertrge aufzuschwatzen. (<a href="https://www.golem.de/specials/telekom/">Telekom</a>, <a href="https://www.golem.de/specials/telefonica/">Telefnica</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131558&page=1&ts=1512722880" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/politik-recht/telekom-klage-gericht-untersagt-o2-falschbehauptungen-bei-kundenwerbung/114214,list.html
+ Fri, 08 Dec 2017 09:48:00 +0100
+ https://www.golem.de/1712/131558-rss.html
+ Ein Gericht hat befunden, dass der Netzanbieter O2 bei der Anwerbung von Kunden gelogen habe. Einige Mitarbeiter hatten unter anderem behauptet, die Telekom werde Anschlsse nicht mehr bedienen, und so versucht, Kunden neue Vertrge aufzuschwatzen. (Telekom, Telefnica) ]]>
+ 25
+
+
+ Apps und Games fr VR-Headsets: Der virtuelle Blade Runner und Sport mit Sparc
+ https://www.golem.de/news/apps-und-games-fuer-vr-headsets-der-virtuelle-blade-runner-und-sport-mit-sparc-1712-131481-rss.html
+ Eintauchen in die Welt von Blade Runner 2049, aber auch schweitreibende Action von CCP Games (Eve Online) mit Sparc und Horror in fast vlliger Dunkelheit bei Stifled: Golem.de hat sich spannende Neuheiten fr Virtual-Reality-Headsets angeschaut. Von Achim Fehrenbach (<a href="https://www.golem.de/specials/virtuelle-realitaet/">VR</a>, <a href="https://www.golem.de/specials/steam/">Steam</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131481&page=1&ts=1512719820" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/sonstiges/apps-und-games-fuer-vr-headsets-der-virtuelle-blade-runner-und-sport-mit-sparc/114213,list.html
+ Fri, 08 Dec 2017 08:57:00 +0100
+ https://www.golem.de/1712/131481-rss.html
+ Eintauchen in die Welt von Blade Runner 2049, aber auch schweitreibende Action von CCP Games (Eve Online) mit Sparc und Horror in fast vlliger Dunkelheit bei Stifled: Golem.de hat sich spannende Neuheiten fr Virtual-Reality-Headsets angeschaut. Von Achim Fehrenbach (VR, Steam) ]]>
+ 14
+
+
+ LEVC: London bekommt Elektrotaxis mit Range Extender
+ https://www.golem.de/news/levc-london-bekommt-elektrotaxis-mit-range-extender-1712-131557-rss.html
+ Kurz bevor die Londoner Innenstadt zur Umweltzone wird, sind Elektrotaxis im Stil der alten Taxis der britischen Hauptstadt zugelassen worden. Ganz ohne Verbrennungsmotor kommen die E-Taxis aber nicht aus. (<a href="https://www.golem.de/specials/elektroauto/">Elektroauto</a>, <a href="https://www.golem.de/specials/technologie/">Technologie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131557&page=1&ts=1512715260" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/automobil/levc-london-bekommt-elektrotaxis-mit-range-extender/114212,list.html
+ Fri, 08 Dec 2017 07:41:00 +0100
+ https://www.golem.de/1712/131557-rss.html
+ Kurz bevor die Londoner Innenstadt zur Umweltzone wird, sind Elektrotaxis im Stil der alten Taxis der britischen Hauptstadt zugelassen worden. Ganz ohne Verbrennungsmotor kommen die E-Taxis aber nicht aus. (Elektroauto, Technologie) ]]>
+ 38
+
+
+ Vehicle-to-Grid: Honda macht Elektroautos zu Stromnetz-Puffern
+ https://www.golem.de/news/vehicle-to-grid-honda-macht-elektroautos-zu-stromnetz-puffern-1712-131556-rss.html
+ Honda will Elektroautos zu temporren Energiespeichern machen und hat eine bidirektionale Ladetechnologie an seinem europischen Forschungs- und Entwicklungszentrum in Offenbach installiert. Damit kann Energie vom Auto wieder ins Stromnetz eingespeist werden. (<a href="https://www.golem.de/specials/elektroauto/">Elektroauto</a>, <a href="https://www.golem.de/specials/technologie/">Technologie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131556&page=1&ts=1512714660" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/automobil/vehicle-to-grid-honda-macht-elektroautos-zu-stromnetz-puffern/114211,list.html
+ Fri, 08 Dec 2017 07:31:00 +0100
+ https://www.golem.de/1712/131556-rss.html
+ Honda will Elektroautos zu temporren Energiespeichern machen und hat eine bidirektionale Ladetechnologie an seinem europischen Forschungs- und Entwicklungszentrum in Offenbach installiert. Damit kann Energie vom Auto wieder ins Stromnetz eingespeist werden. (Elektroauto, Technologie) ]]>
+ 2
+
+
+ Notebook: AMDs Ryzen Mobile berzeugt im ersten Test
+ https://www.golem.de/news/notebook-amds-ryzen-mobile-ueberzeugt-im-ersten-test-1712-131555-rss.html
+ Das Laptop Mag hat zwei HP Envy x360 getestet, einen mit AMDs Ryzen Mobile und einen mit Intels 8th Gen genannten Prozessoren. Beide Notebooks weisen fast die gleiche Akkulaufzeit auf, bei der CPU- und der GPU-Geschwindigkeit hat AMD aber Vorteile. (<a href="https://www.golem.de/specials/zen/">AMD Zen</a>, <a href="https://www.golem.de/specials/notebook/">Notebook</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131555&page=1&ts=1512681960" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/mobile-computing/notebook-amds-ryzen-mobile-ueberzeugt-im-ersten-test/114209,list.html
+ Thu, 07 Dec 2017 22:26:00 +0100
+ https://www.golem.de/1712/131555-rss.html
+ Das Laptop Mag hat zwei HP Envy x360 getestet, einen mit AMDs Ryzen Mobile und einen mit Intels 8th Gen genannten Prozessoren. Beide Notebooks weisen fast die gleiche Akkulaufzeit auf, bei der CPU- und der GPU-Geschwindigkeit hat AMD aber Vorteile. (AMD Zen, Notebook) ]]>
+ 49
+
+
+ Lbben: Tele-Columbus-Tochter schliet 3.000 Haushalte an
+ https://www.golem.de/news/luebben-tele-columbus-tochter-schliesst-3-000-haushalte-an-1712-131554-rss.html
+ Ein weiteres groes Ausbauprojekt im Spreewald bringt den Menschen dort eine hhere Datenbertagungsrate. Die Tele-Columbus-Tochter Pepcom baut Fiber To The Building. (<a href="https://www.golem.de/specials/tele-columbus/">Tele Columbus</a>, <a href="https://www.golem.de/specials/studie/">Studie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131554&page=1&ts=1512667440" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wirtschaft/luebben-tele-columbus-tochter-schliesst-3.000-haushalte-an/114208,list.html
+ Thu, 07 Dec 2017 18:24:00 +0100
+ https://www.golem.de/1712/131554-rss.html
+ Ein weiteres groes Ausbauprojekt im Spreewald bringt den Menschen dort eine hhere Datenbertagungsrate. Die Tele-Columbus-Tochter Pepcom baut Fiber To The Building. (Tele Columbus, Studie) ]]>
+ 8
+
+
+ Betrug: Bundesnetzagentur sperrt Erotik-Rufnummern
+ https://www.golem.de/news/betrug-bundesnetzagentur-sperrt-erotik-rufnummern-1712-131552-rss.html
+ Statt sexwilliger schner Frauen am Handy sind unter einer 0900-Vorwahl nur Warteschleifen geboten worden. Das Geschftsmodell wurde jetzt von der Bundesnetzagentur verboten. (<a href="https://www.golem.de/specials/bundesnetzagentur/">Bundesnetzagentur</a>, <a href="https://www.golem.de/specials/telekommunikation/">Telekommunikation</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131552&page=1&ts=1512664980" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/sonstiges/betrug-bundesnetzagentur-sperrt-erotik-rufnummern/114207,list.html
+ Thu, 07 Dec 2017 17:43:00 +0100
+ https://www.golem.de/1712/131552-rss.html
+ Statt sexwilliger schner Frauen am Handy sind unter einer 0900-Vorwahl nur Warteschleifen geboten worden. Das Geschftsmodell wurde jetzt von der Bundesnetzagentur verboten. (Bundesnetzagentur, Telekommunikation) ]]>
+ 25
+
+
+ AI Type: 31 Millionen Kundendaten von Tastaturanbieter verffentlicht
+ https://www.golem.de/news/ai-type-31-millionen-kundendaten-von-tastaturanbieter-veroeffentlicht-1712-131550-rss.html
+ Ein peinlicher Fehler, der dazu noch die ungeheure Datensammelwut des Herstellers zeigt: AI Type hat eine Datenbank mit mehr als 500 Gbyte Kundendaten ins Netz gestellt. (<a href="https://www.golem.de/specials/security/">Security</a>, <a href="https://www.golem.de/specials/smartphone/">Smartphone</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131550&page=1&ts=1512657960" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/ai-type-31-millionen-kundendaten-von-tastaturanbieter-veroeffentlicht/114205,list.html
+ Thu, 07 Dec 2017 15:46:00 +0100
+ https://www.golem.de/1712/131550-rss.html
+ Ein peinlicher Fehler, der dazu noch die ungeheure Datensammelwut des Herstellers zeigt: AI Type hat eine Datenbank mit mehr als 500 Gbyte Kundendaten ins Netz gestellt. (Security, Smartphone) ]]>
+ 50
+
+
+ Spieleportal: Bitcoin ist Steam zu unbestndig und zu teuer
+ https://www.golem.de/news/spieleportal-bitcoin-ist-steam-zu-unbestaendig-und-zu-teuer-1712-131551-rss.html
+ Selbst Bitcoin-Milliardre knnen mit der Cyberwhrung keine Spiele mehr bei Steam kaufen. Das Portal besteht ab sofort auf der Bezahlung mit Euro, Dollar oder anderen klassischen Whrungen. (<a href="https://www.golem.de/specials/steam/">Steam</a>, <a href="https://www.golem.de/specials/valve/">Valve</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131551&page=1&ts=1512656580" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wirtschaft/spieleportal-bitcoin-ist-steam-zu-unbestaendig-und-zu-teuer/114204,list.html
+ Thu, 07 Dec 2017 15:23:00 +0100
+ https://www.golem.de/1712/131551-rss.html
+ Selbst Bitcoin-Milliardre knnen mit der Cyberwhrung keine Spiele mehr bei Steam kaufen. Das Portal besteht ab sofort auf der Bezahlung mit Euro, Dollar oder anderen klassischen Whrungen. (Steam, Valve) ]]>
+ 79
+
+
+ Containerd: Container-Laufzeit von Docker allgemein verfgbar
+ https://www.golem.de/news/containerd-container-laufzeit-von-docker-allgemein-verfuegbar-1712-131549-rss.html
+ Die Container-Spezialisten von Docker spalten ihren anfangs monolithischen Dienst auf Druck der Community und der Industrie immer weiter auf. Die Laufzeitumgebung Containerd ist nun stabil, in Version 1.0 verfgbar und kann in Kubernetes genutzt werden. (<a href="https://www.golem.de/specials/docker/">Docker</a>, <a href="https://www.golem.de/specials/linux/">Linux</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131549&page=1&ts=1512655440" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/opensource/containerd-container-laufzeit-von-docker-allgemein-verfuegbar/114203,list.html
+ Thu, 07 Dec 2017 15:04:00 +0100
+ https://www.golem.de/1712/131549-rss.html
+ Die Container-Spezialisten von Docker spalten ihren anfangs monolithischen Dienst auf Druck der Community und der Industrie immer weiter auf. Die Laufzeitumgebung Containerd ist nun stabil, in Version 1.0 verfgbar und kann in Kubernetes genutzt werden. (Docker, Linux) ]]>
+ 7
+
+
+ Mobilfunknetze: LTE Roaming hat hnliche Probleme wie SS7
+ https://www.golem.de/news/mobilfunknetze-lte-roaming-hat-aehnliche-probleme-wie-ss7-1712-131548-rss.html
+ Forscher demonstrieren auf der Konferenz Black Hat Europe hnliche Sicherheitsprobleme fr das LTE Roaming, wie diese auch fr das vollkommen veraltete SS7 existieren. Schlimmstenfalls lassen sich damit Sprachnachrichten analysieren. (<a href="https://www.golem.de/specials/security/">Security</a>, <a href="https://www.golem.de/specials/lte/">Long Term Evolution</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131548&page=1&ts=1512654000" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/mobilfunknetze-lte-roaming-hat-aehnliche-probleme-wie-ss7/114202,list.html
+ Thu, 07 Dec 2017 14:40:00 +0100
+ https://www.golem.de/1712/131548-rss.html
+ Forscher demonstrieren auf der Konferenz Black Hat Europe hnliche Sicherheitsprobleme fr das LTE Roaming, wie diese auch fr das vollkommen veraltete SS7 existieren. Schlimmstenfalls lassen sich damit Sprachnachrichten analysieren. (Security, Long Term Evolution) ]]>
+ 5
+
+
+ Stillfront Group: Hamburger Goodgame Studios fr 270 Millionen Euro bernommen
+ https://www.golem.de/news/stillfront-group-hamburger-goodgame-studios-fuer-270-millionen-euro-uebernommen-1712-131547-rss.html
+ Nur wenige Monate nach Querelen mit der Belegschaft und Entlassungen wird der Hamburger Entwickler Goodgame Studios fr rund 270 Millionen Euro von einem schwedischen Unternehmen akquiriert. (<a href="https://www.golem.de/specials/goodgame-studios/">Goodgame Studios</a>, <a href="https://www.golem.de/specials/games/">Games</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131547&page=1&ts=1512650460" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wirtschaft/stillfront-group-hamburger-goodgame-studios-fuer-270-millionen-euro-uebernommen/114201,list.html
+ Thu, 07 Dec 2017 13:41:00 +0100
+ https://www.golem.de/1712/131547-rss.html
+ Nur wenige Monate nach Querelen mit der Belegschaft und Entlassungen wird der Hamburger Entwickler Goodgame Studios fr rund 270 Millionen Euro von einem schwedischen Unternehmen akquiriert. (Goodgame Studios, Games) ]]>
+ 16
+
+
+ Amazon: Verkaufsbann fr Apple TV bleibt bestehen
+ https://www.golem.de/news/amazon-verkaufsbann-fuer-apple-tv-bleibt-bestehen-1712-131546-rss.html
+ Amazons Verkaufsbann fr das Streaminggert Apple TV bleibt bestehen. Obwohl es fr das Apple TV nun Amazons Video-App gibt, wird Apples Streaminggert weiterhin nicht bei Amazon gelistet. Ob dieser Bann jemals aufgehoben wird, ist ungewiss. (<a href="https://www.golem.de/specials/apple-tv/">Apple TV</a>, <a href="https://www.golem.de/specials/amazon/">Amazon</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131546&page=1&ts=1512648360" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/sonstiges/amazon-verkaufsbann-fuer-apple-tv-bleibt-bestehen/114200,list.html
+ Thu, 07 Dec 2017 13:06:00 +0100
+ https://www.golem.de/1712/131546-rss.html
+ Amazons Verkaufsbann fr das Streaminggert Apple TV bleibt bestehen. Obwohl es fr das Apple TV nun Amazons Video-App gibt, wird Apples Streaminggert weiterhin nicht bei Amazon gelistet. Ob dieser Bann jemals aufgehoben wird, ist ungewiss. (Apple TV, Amazon) ]]>
+ 57
+
+
+ Global Technology Services: IBM Deutschland verkauft GTS-Teile mit 1.000 Beschftigten
+ https://www.golem.de/news/global-technology-services-ibm-deutschland-verkauft-gts-teile-mit-1-000-beschaeftigten-1712-131545-rss.html
+ IBM Deutschland baut erneut indirekt Arbeitspltze ab, auch in Grobritannien werden IT-Jobs von IBM abgebaut. IBM Global Technology Services hat eine neue Fhrung. (<a href="https://www.golem.de/specials/ibm/">IBM</a>, <a href="https://www.golem.de/specials/verdi/">Verdi</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131545&page=1&ts=1512647460" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wirtschaft/global-technology-services-ibm-deutschland-verkauft-gts-teile-mit-1.000-beschaeftigten/114199,list.html
+ Thu, 07 Dec 2017 12:51:00 +0100
+ https://www.golem.de/1712/131545-rss.html
+ IBM Deutschland baut erneut indirekt Arbeitspltze ab, auch in Grobritannien werden IT-Jobs von IBM abgebaut. IBM Global Technology Services hat eine neue Fhrung. (IBM, Verdi) ]]>
+ 0
+
+
+ Alexa-Gerte und ihre Konkurrenz im Test: Der perfekte smarte Lautsprecher ist nicht dabei
+ https://www.golem.de/news/alexa-geraete-und-ihre-konkurrenz-der-perfekte-smarte-lautsprecher-ist-nicht-dabei-1712-131519-rss.html
+ Wir haben zwlf smarte Lautsprecher mit Alexa oder dem Google Assistant getestet und waren berrascht, wie schwer es fr einige Firmen aus der Hi-Fi-Branche ist, den Echo-Gerten Paroli zu bieten. Zwei Modelle, die nicht einmal so teuer sind, haben es dann aber doch geschafft. Ein Test von Ingo Pakalski (<a href="https://www.golem.de/specials/smarter-lautsprecher/">Smarter Lautsprecher</a>, <a href="https://www.golem.de/specials/google/">Google</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131519&page=1&ts=1512644520" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/audio-video/alexa-geraete-und-ihre-konkurrenz-im-test-der-perfekte-smarte-lautsprecher-ist-nicht-dabei/114198,list.html
+ Thu, 07 Dec 2017 12:02:00 +0100
+ https://www.golem.de/1712/131519-rss.html
+ Wir haben zwlf smarte Lautsprecher mit Alexa oder dem Google Assistant getestet und waren berrascht, wie schwer es fr einige Firmen aus der Hi-Fi-Branche ist, den Echo-Gerten Paroli zu bieten. Zwei Modelle, die nicht einmal so teuer sind, haben es dann aber doch geschafft. Ein Test von Ingo Pakalski (Smarter Lautsprecher, Google) ]]>
+ 81
+
+
+ Firmware-Bug: Codeausfhrung in deaktivierter Intel-ME mglich
+ https://www.golem.de/news/firmware-bug-codeausfuehrung-in-deaktivierter-intel-me-moeglich-1712-131543-rss.html
+ Sicherheitsforscher demonstrieren einen Angriff auf Intels ME zum Ausfhren von beliebigem Code, gegen den weder das sogenannte Kill-Bit noch die von Google geplanten Sicherheitsmanahmen fr seine Server helfen. Theoretisch lassen sich Gerte so auch aus der Ferne angreifen. Von Kristian Kiling und Sebastian Grner (<a href="https://www.golem.de/specials/intel/">Intel</a>, <a href="https://www.golem.de/specials/server/">Server</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131543&page=1&ts=1512644100" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/firmware-bug-codeausfuehrung-in-deaktivierter-intel-me-moeglich/114197,list.html
+ Thu, 07 Dec 2017 11:55:00 +0100
+ https://www.golem.de/1712/131543-rss.html
+ Sicherheitsforscher demonstrieren einen Angriff auf Intels ME zum Ausfhren von beliebigem Code, gegen den weder das sogenannte Kill-Bit noch die von Google geplanten Sicherheitsmanahmen fr seine Server helfen. Theoretisch lassen sich Gerte so auch aus der Ferne angreifen. Von Kristian Kiling und Sebastian Grner (Intel, Server) ]]>
+ 16
+
+
+ Deutscher Entwicklerpreis: The Surge ist das beste und schnste deutsche Spiel
+ https://www.golem.de/news/deutscher-entwicklerpreis-the-surge-ist-das-beste-und-schoenste-deutsche-spiel-1712-131541-rss.html
+ Das Actionspiel The Surge von Deck 13 aus Frankfurt ist der groe Gewinner bei der Verleihung des Deutschen Entwicklerpreises. Es konnte sich in drei Kategorien durchsetzen - darunter in der des Besten deutschen Spiels. (<a href="https://www.golem.de/specials/deutscher-entwicklerpreis/">Deutscher Entwicklerpreis</a>, <a href="https://www.golem.de/specials/games/">Games</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131541&page=1&ts=1512642600" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/games/deutscher-entwicklerpreis-the-surge-ist-das-beste-und-schoenste-deutsche-spiel/114196,list.html
+ Thu, 07 Dec 2017 11:30:00 +0100
+ https://www.golem.de/1712/131541-rss.html
+ Das Actionspiel The Surge von Deck 13 aus Frankfurt ist der groe Gewinner bei der Verleihung des Deutschen Entwicklerpreises. Es konnte sich in drei Kategorien durchsetzen - darunter in der des Besten deutschen Spiels. (Deutscher Entwicklerpreis, Games) ]]>
+ 51
+
+
+ Kryptowhrung: 4.700 Bitcoin von Handelsplattform Nicehash gestohlen
+ https://www.golem.de/news/bitcoin-4-700-bitcoin-von-handelsplattform-nicehash-gestohlen-1712-131538-rss.html
+ Es soll ein "hochprofessioneller Angriff mit fortgeschrittenem Social Engineering" gewesen sein: Der Handelsplattform Nicehash wurden Bitcoin im Wert von knapp 64 Millionen US-Dollar gestohlen. Nutzer sollen ihre Passwrter ndern. (<a href="https://www.golem.de/specials/bitcoin/">Bitcoin</a>, <a href="https://www.golem.de/specials/internet/">Internet</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131538&page=1&ts=1512641760" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/kryptowaehrung-4.700-bitcoin-von-handelsplattform-nicehash-gestohlen/114194,list.html
+ Thu, 07 Dec 2017 11:16:00 +0100
+ https://www.golem.de/1712/131538-rss.html
+ Es soll ein "hochprofessioneller Angriff mit fortgeschrittenem Social Engineering" gewesen sein: Der Handelsplattform Nicehash wurden Bitcoin im Wert von knapp 64 Millionen US-Dollar gestohlen. Nutzer sollen ihre Passwrter ndern. (Bitcoin, Internet) ]]>
+ 53
+
+
+ Elektromobilitt: Porsche plant einen 911er mit Hybridantrieb
+ https://www.golem.de/news/elektromobilitaet-porsche-plant-einen-911er-mit-hybridantrieb-1712-131539-rss.html
+ Ein Elektroauto entwickelt Porsche schon. Als Nchstes soll auch der Porsche 911 einen neuen Antrieb erhalten: Die kommende Generation wird es auch als Hybridfahrzeug geben. (<a href="https://www.golem.de/specials/porsche/">Porsche</a>, <a href="https://www.golem.de/specials/technologie/">Technologie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131539&page=1&ts=1512640740" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/automobil/elektromobilitaet-porsche-plant-einen-911er-mit-hybridantrieb/114193,list.html
+ Thu, 07 Dec 2017 10:59:00 +0100
+ https://www.golem.de/1712/131539-rss.html
+ Ein Elektroauto entwickelt Porsche schon. Als Nchstes soll auch der Porsche 911 einen neuen Antrieb erhalten: Die kommende Generation wird es auch als Hybridfahrzeug geben. (Porsche, Technologie) ]]>
+ 25
+
+
+ MacOS 10.13.2: Updates fr High Sierra, Sierra und El Capitan
+ https://www.golem.de/news/macos-10-13-2-updates-fuer-high-sierra-sierra-und-el-capitan-1712-131536-rss.html
+ Apple hat High Sierra alias MacOS 10.13 auf eine neue Version aktualisiert, einige Fehler behoben und Verbesserungen hinzugefgt. Zudem beseitigt Apple in der Vorversion von MacOS sowie dem letzten OS X zahlreiche sicherheitsrelevante Fehler. (<a href="https://www.golem.de/specials/macoshighsierra/">MacOS 10.13 High Sierra</a>, <a href="https://www.golem.de/specials/apple/">Apple</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=131536&page=1&ts=1512638760" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/applikationen/macos-10.13.2-updates-fuer-high-sierra-sierra-und-el-capitan/114192,list.html
+ Thu, 07 Dec 2017 10:26:00 +0100
+ https://www.golem.de/1712/131536-rss.html
+ Apple hat High Sierra alias MacOS 10.13 auf eine neue Version aktualisiert, einige Fehler behoben und Verbesserungen hinzugefgt. Zudem beseitigt Apple in der Vorversion von MacOS sowie dem letzten OS X zahlreiche sicherheitsrelevante Fehler. (MacOS 10.13 High Sierra, Apple) ]]>
+ 6
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/nixos.html b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/nixos.html
new file mode 100644
index 000000000..19cbc0c25
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/nixos.html
@@ -0,0 +1,376 @@
+
+
+
+
+
+ NixOS Linux
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
NixOS is a Linux distribution with a unique approach
+ to package and configuration management. Built on top of the Nix package manager, it is completely
+ declarative, makes upgrading systems reliable, and has many other advantages.
NixOS has a completely declarative approach to
+ configuration management: you write a specification of the desired
+ configuration of your system in NixOS’s modular language, and
+ NixOS takes care of making it happen.
+
+
+
Reliable
+
NixOS has atomic upgrades and rollbacks. It’s
+ always safe to try an upgrade or configuration change: if things
+ go wrong, you can always roll back to the previous
+ configuration.
+
+
+
DevOps-friendly
+
Declarative specs and safe upgrades make NixOS a great system
+ for DevOps use. NixOps, the NixOS cloud
+ deployment tool, allows you to provision and manage networks of
+ NixOS machines in environments like Amazon EC2 and VirtualBox.
+
+
+
+ NixOS 18.09 “Jellyfish” has been released, the tenth stable release branch.
+ See the release notes
+ for details. You can get NixOS 18.09 ISOs and VirtualBox appliances
+ from the download page.
+ For information on how to upgrade from older release branches
+ to 18.09, check out the
+ manual section on upgrading.
+
+ Fastly supports NixOS
+
Oct 04 2018
+ We are happy to announce that we have moved our binary cache to Fastly. Fastly
+ is a big supporter of open source projects and now NixOS is one of them! Fastly provides us with CDN capability,
+ which previously was running on AWS CloudFront. Big thanks go to Fastly, in particular Tom Denniston and Elaine
+ Greenberg, our friends at Infor and Packet.net
+ and Graham Christensen for making this possible.
+
+ Nix 2.1 released
+
Sep 02 2018
+ Nix 2.1
+ has been released. See the release
+ notes for a list of changes and new features.
+
+ NixOS Discourse forum
+
Aug 14 2018
+ The nix-devel mailing list is now replaced by our discourse forum instance which is also usable by email:
+ discourse.nixos.org.
+
+ NixCon 2018
+
May 21 2018
+ We're happy to announce that NixCon 2018, the
+ third Nix Conference, will take place October 25-27 2018 in London
+ For more information, see the
+ NixCon 2018 website.
+ And please consider
+ submitting a talk!
+
+ NixOS 18.03 released
+
Apr 04 2018
+
+
+
+ NixOS 18.03 “Impala” has been released, the ninth stable release branch.
+ See the release notes
+ for details. You can get NixOS 18.03 ISOs and VirtualBox appliances
+ from the download page.
+ For information on how to upgrade from older release branches
+ to 18.03, check out the
+ manual section on upgrading.
+
+ Nix 2.0 released
+
Feb 22 2018
+ Nix 2.0
+ has been released. See the release
+ notes for a list of changes and new features.
+
+ NixOS 17.09 released
+
Oct 02 2017
+ NixOS 17.09 “Hummingbird” has been released, the eigth stable release
+ branch. See the release notes
+ for details. You can get NixOS 17.09 ISOs and VirtualBox
+ appliances from the download
+ page. For information on how to upgrade from older release
+ branches to 17.09, check out the manual section on
+ upgrading.
+
+ Nix-dev mailing list moved
+
Jul 12 2017
+ The nix-dev mailing list has moved to
+ nix-devel
+ on Google Groups.
+
+ NixCon 2017
+
Jun 18 2017
+ We're happy to announce that NixCon 2017, the
+ second Nix Conference, will take place October 28–31 2017 in Munich
+ For more information, see the
+ NixCon 2017 website.
+ And please consider
+ submitting a talk!
+
+ NixOS 17.03 released
+
Mar 31 2017
+ NixOS 17.03 “Gorilla” has been released, the seventh stable release
+ branch. See the release notes
+ for details. You can get NixOS 17.03 ISOs and VirtualBox
+ appliances from the download
+ page. For information on how to upgrade from older release
+ branches to 17.03, check out the manual section on
+ upgrading.
+
+ NixOS 16.09 released
+
Oct 03 2016
+ NixOS 16.09 “Flounder” has been released, the sixth stable release
+ branch. See the release notes
+ for details. You can get NixOS 16.09 ISOs and VirtualBox
+ appliances from the download
+ page. For information on how to upgrade from older release
+ branches to 16.09, check out the manual section on
+ upgrading.
+
+
+
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/openstreetmap.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/openstreetmap.xml
new file mode 100644
index 000000000..6bd59486c
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/openstreetmap.xml
@@ -0,0 +1,341 @@
+
+
+
+ OpenStreetMap diary entries
+ Recent diary entries from users of OpenStreetMap
+ https://www.openstreetmap.org/diary
+
+ https://www.openstreetmap.org/assets/mag_map-rss2.0-2973595662b8a92522b315b6c69bf5ee9bec75e07d702c5932f114c44a6251ea.png
+ OpenStreetMap diary entries
+ 100
+ 100
+ https://www.openstreetmap.org/diary
+
+
+ Begining of a mountain of a task
+ https://www.openstreetmap.org/user/0235/diary/396687
+ https://www.openstreetmap.org/user/0235/diary/396687
+ <p>So, Dear Diary, 2021-05-11</p>
+
+ <p>I have decided to take on the task of tracing every building in the town where I live, population about 60,000. Currently the coverage of traced buildings are large retail, large industrial, or the hospital. Almost no houses are mapped, and most of the roads are bare minimum information with no cycleway or footway information.</p>
+
+ <p>This comes after my previous task, as I have just finished basic tracing and labelling of the local amusement park, which was almost barren (and due to the “roller coaster track” tag not rendering, it still look barren!).</p>
+
+ <p>I do plan on trying to get out a bit and visit some of the places, however the area is very sketchy. Since living here there have been a few drive by shootings, and many places are know as “The Stablands” with how much knife crime goes on…. I feel I will get chased out of some areas for wearing a surveying Hi-Vis, and arrested by the police if I don’t wear one!</p>
+
+ <p>I am massively impressed so far with the depth of the Wiki, the ease of use of the ID editor, the wide toolset JOSM has to offer, and the incredibly smooth function of StreetComplete (Quite how it hasn’t had 1mil+ downloads is beyond me!)</p>
+
+ <p>For now, the Armchair awaits, though mapping some of the clearly inaccurate foot “trails” around the area could be a nice break, and lower the risk of a shankin’</p>
+
+ 0235
+ Tue, 11 May 2021 22:03:30 +0000
+ https://www.openstreetmap.org/user/0235/diary/396687#comments
+ 52.3993553385688
+ -0.728080272674561
+ 52.3993553385688 -0.728080272674561
+
+
+ Data Working Group supports vandalism and deletion of data in the project.
+ https://www.openstreetmap.org/user/Sowa1980/diary/396680
+ https://www.openstreetmap.org/user/Sowa1980/diary/396680
+ <h2 id="data-working-group---------mavl---------------anakinnn---------------------3---------10-----------">Data Working Group поддерживает вандализм и удаление актуальных данных в проекте, mavl один из участников рабочей группы поддерживает активно вандализм в проекте, а в частности участника AnakinNN массовые вандальные действия данного участника и его “достойный вклад” (ссылки ниже) из-за которого мне был выставлен бан сначала на 3 дня, а после без объяснений причин продлен на 10 лет, за то что я не позволял данному участнику удалять данные.</h2>
+ <p>Браво Data Working Group даже не дала пояснений о моей блокировки.
+ Ну как я и писал mavl = царь, не должен давать объяснений. Холопы этого не заслуживают.
+ Блокировка участников с миллионными вкладами в проект выглядит с его точке зрения нормально, но не один вандал и не один участник не получил блокировку даже за использование и внесение чужих данных в проект, яркий пример тому участник <a href="https://www.openstreetmap.org/user/Nimfea" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/user/Nimfea</a>, вносивший данные из 2GIS и массово удалял существующие данные.</p>
+
+ <p>Напоминаю как усердно данный участник пытался тут показать его достойный вклад читайте комментарии. <a href="https://www.openstreetmap.org/user/Sowa1980/diary/396347" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/user/Sowa1980/diary/396347</a></p>
+
+ <p><a href="https://www.openstreetmap.org/changeset/102932042" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/changeset/102932042</a> - массовое удаление дорожного инфраструктуры, в частности отношений и бордюров.</p>
+
+ <p><a href="https://www.openstreetmap.org/changeset/102869641" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/changeset/102869641</a> - удаления памятника танка Мультти полигона плюс флагштоков. достойный подарок от данного участника нашим ветеранам ВОВ.</p>
+
+ <p><a href="https://www.openstreetmap.org/changeset/102942351" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/changeset/102942351</a> - удаление кодов междугородней связи.</p>
+
+ <p><a href="https://www.openstreetmap.org/changeset/102941820" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/changeset/102941820</a> - удаление контактной информации</p>
+
+ <p><a href="https://www.openstreetmap.org/changeset/102941178" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/changeset/102941178</a> - удаление информации о подстанции.</p>
+
+ <p><a href="https://www.openstreetmap.org/changeset/102941049" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/changeset/102941049</a> - удаление контактной информации</p>
+
+ <p><a href="https://www.openstreetmap.org/changeset/102939485" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/changeset/102939485</a> - удаление емел адреса и названия.</p>
+
+ <p><a href="https://www.openstreetmap.org/changeset/102941979" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/changeset/102941979</a> - удаление тегов. входов.</p>
+
+ <p><a href="https://www.openstreetmap.org/changeset/102752077" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/changeset/102752077</a> - удаление контактной информации и прочее
+ <a href="https://www.openstreetmap.org/changeset/102752647" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/changeset/102752647</a> - удаление контактной информации</p>
+
+ <p><a href="https://www.openstreetmap.org/changeset/102939976" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/changeset/102939976</a> - удаление мультиполигонов и т.д.</p>
+
+
+ Sowa1980
+ Tue, 11 May 2021 09:07:14 +0000
+ https://www.openstreetmap.org/user/Sowa1980/diary/396680#comments
+
+
+ ปักหมุด
+ https://www.openstreetmap.org/user/Pimnapa/diary/396677
+ https://www.openstreetmap.org/user/Pimnapa/diary/396677
+ <p>ปักๆๆๆๆ</p>
+
+ Pimnapa
+ Mon, 10 May 2021 21:30:43 +0000
+ https://www.openstreetmap.org/user/Pimnapa/diary/396677#comments
+ 13.663276
+ 102.547489
+ 13.663276 102.547489
+
+
+ Klášterec nad Ohří má špatně zakreslené plochy
+ https://www.openstreetmap.org/user/AF%20HAF%20KARTOGRAF/diary/396674
+ https://www.openstreetmap.org/user/AF%20HAF%20KARTOGRAF/diary/396674
+ <p>Teď jsem aktuálně v úpravách v Klášterci nad Ohří a jsou tam špatně popsané plochy mimo budov, že je to už práce nad moje síly. Žádám všechny kdo by je chtěl opravit ať do dá do pořádku. Plochy zahrada by měly být slučovány s budovy a všechny další oblasti venkovních ploch které nemají zahrnovat budovy a jiné prvky.</p>
+
+ AF HAF KARTOGRAF
+ Mon, 10 May 2021 18:01:05 +0000
+ https://www.openstreetmap.org/user/AF%20HAF%20KARTOGRAF/diary/396674#comments
+ 50.3887664603262
+ 13.1954920291901
+ 50.3887664603262 13.1954920291901
+
+
+ What a mess!!
+ https://www.openstreetmap.org/user/CartoCrazy/diary/396668
+ https://www.openstreetmap.org/user/CartoCrazy/diary/396668
+ <p>Re.: (<a href="https://www.openstreetmap.org/edit#map=16/34.9460/-111.6368" rel="nofollow noopener noreferrer">https://www.openstreetmap.org/edit#map=16/34.9460/-111.6368</a>)</p>
+
+ <p>I feel that the area in and around Munds Park, AZ has been very terribly rendered, most especially on the roads (for example, instead of showing smooth curves where they exist on the ground, they appear as jagged angles, or they do not follow the actually road path), and this is most obvious when zooming in</p>
+
+ <p>It is things like this that very greatly annoy me about OpenStreetMap, as it seems like someone did not wish to take the time to do the job right the first time, and now another user will have to make the adjustments and corrections to clean up the mess left behind.</p>
+
+ <p>I don’t know if anyone else feels the way that I do, but I just wanted to express my opinion on what could have otherwise been done properly I apologize if I am stepping on feet on this one… just trying to make OpenStreetMap a beautiful project for all to use.</p>
+
+ CartoCrazy
+ Mon, 10 May 2021 02:30:13 +0000
+ https://www.openstreetmap.org/user/CartoCrazy/diary/396668#comments
+
+
+ quán nét khanh ok
+ https://www.openstreetmap.org/user/Tr%E1%BA%A7n%20Ho%C3%A0ng%20Th%C3%A1i/diary/396667
+ https://www.openstreetmap.org/user/Tr%E1%BA%A7n%20Ho%C3%A0ng%20Th%C3%A1i/diary/396667
+ <p>khang nguyen</p>
+
+ Trần Hoàng Thái
+ Sun, 09 May 2021 20:15:45 +0000
+ https://www.openstreetmap.org/user/Tr%E1%BA%A7n%20Ho%C3%A0ng%20Th%C3%A1i/diary/396667#comments
+ 12.6510581337035
+ 108.00904199481
+ 12.6510581337035 108.00904199481
+
+
+ Super Market
+ https://www.openstreetmap.org/user/pymgsm/diary/396665
+ https://www.openstreetmap.org/user/pymgsm/diary/396665
+ <p>افق کوروش سجادیه تبریز</p>
+
+ pymgsm
+ Sun, 09 May 2021 18:45:21 +0000
+ https://www.openstreetmap.org/user/pymgsm/diary/396665#comments
+ 38.0508749241235
+ 46.3140785694122
+ 38.0508749241235 46.3140785694122
+
+
+ 不懂就问
+ https://www.openstreetmap.org/user/Brian@Stone/diary/396662
+ https://www.openstreetmap.org/user/Brian@Stone/diary/396662
+ <p>日记到底是干嘛使的?谁能告诉我</p>
+
+ Brian@Stone
+ Sun, 09 May 2021 14:22:51 +0000
+ https://www.openstreetmap.org/user/Brian@Stone/diary/396662#comments
+ 39.9301261961833
+ 116.310356855392
+ 39.9301261961833 116.310356855392
+
+
+ Granting permission regarding Kira Maps
+ https://www.openstreetmap.org/user/testooools/diary/396661
+ https://www.openstreetmap.org/user/testooools/diary/396661
+ <h2 id="kira">Kira:</h2>
+ <p>Dear testooools (Mapper),
+ Regarding the Open-Street-Map Request, Congratulations! we have approved the usage on your behalf using our APIs only for open source usage, Can’t be used for commercial use or any kind of using else open-source projects Specifically Open-Street-Map.</p>
+
+ <p>Kira Team have the right to revoke your key at any time, But what have been used still valid and approved by us forever and ever, Thank you for contacting us! have a great day</p>
+
+ <p>Best Regards.
+ Kira Team.</p>
+
+ <h2 id="me">Me:</h2>
+ <p>Hello, I have contacted open street map members and they said the license can’t be used because the osm data is used by everyone even for commercial use!
+ So if I integrated Kira data on top of open street maps some commercial companies will use this as it is open source to everyone.
+ Please can you explain if that’s a case considered in my permission or not and how?</p>
+
+ <h2 id="kira-1">Kira:</h2>
+ <p>Hello, again testooools!
+ Your concerns are in their place
+ Actually, we are more than happy to confirm that:
+ You can use your key for open street maps directly any effect follow this action will be (valid and approved by us forever and ever) as I mentioned earlier
+ Open street maps are open source you can use our data on it and no worries about any outsider use.
+ I’m sorry for not clarifying this earlier.</p>
+
+ <p>Thank you for contacting us! have a great day</p>
+
+ <p>Best Regards.
+ Kira Team.</p>
+
+ <p><img src="https://i.ibb.co/4RQR6py/Screen-Shot-2021-05-10-at-9-36-22-PM.png" alt="Permission"></p>
+
+ testooools
+ Sun, 09 May 2021 09:39:26 +0000
+ https://www.openstreetmap.org/user/testooools/diary/396661#comments
+
+
+ هیات والیبال استان اردبیل
+ https://www.openstreetmap.org/user/hamedjahandideh18509/diary/396659
+ https://www.openstreetmap.org/user/hamedjahandideh18509/diary/396659
+ <p>هیات والیبال استان اردبیل</p>
+
+ hamedjahandideh18509
+ Sun, 09 May 2021 07:16:23 +0000
+ https://www.openstreetmap.org/user/hamedjahandideh18509/diary/396659#comments
+ 38.2374295989212
+ 48.2860915520587
+ 38.2374295989212 48.2860915520587
+
+
+ Viel hat sich getan!
+ https://www.openstreetmap.org/user/RanJenner/diary/396658
+ https://www.openstreetmap.org/user/RanJenner/diary/396658
+ <p>Dank des Feedbacks der sehr aufmerksamen und lieben Community hier, habe ich nun einige Veränderungen an meiner umap zum Thema Bürgerentscheide in Bayern vorgenommen. Zuletzt hatte ich noch eine Gliederung nach erfolgreichem BE. Diese habe ich jedoch fürs Erste verworfen und mich auf die thematische Gliederung konzentriert. Diese gefällt mir deutlich besser!
+ Ich bin auch schon recht fleißig dabei, BEs einzutragen. Habe jetzt die Jahre 2021 (bisher), 2020 und 2019 eingetragen. Hier ist die Karte zu finden: (<a href="https://umap.openstreetmap.de/de/map/burgerentscheide-in-bayern_11914#7/49.137/11.536" rel="nofollow noopener noreferrer">https://umap.openstreetmap.de/de/map/burgerentscheide-in-bayern_11914#7/49.137/11.536</a>)
+ Darüber hinaus habe ich die Karte nun in die Website meines Vereins mit integriert und sie mit einem “Bürgerentscheids-Ticker” für anstehende BEs in Bayern eingebunden: (<a href="https://bayern.mehr-demokratie.de/buergerbegehren/buergerentscheids-ticker/" rel="nofollow noopener noreferrer">https://bayern.mehr-demokratie.de/buergerbegehren/buergerentscheids-ticker/</a>)</p>
+
+ <p>Wie bereits gesagt, mir gefällt die neue thematische Gliederung der BEs in meiner Karte schon sehr gut. Nur würde ich mir wünschen, dass ein Pin (also ein BE) mehreren Ebenen zugerechnet werden könnte. Also als Beispiel würde ich gerne den BE “Für einen hauptamtlichen Bürgermeister” nicht nur der Ebene “Satzungsplan” sondern auch einer extra-Ebene “2019” hinzufügen. Geht so etwas?</p>
+
+ <p>LG
+ Jan</p>
+
+
+ RanJenner
+ Sat, 08 May 2021 14:32:00 +0000
+ https://www.openstreetmap.org/user/RanJenner/diary/396658#comments
+
+
+ Akhila
+ https://www.openstreetmap.org/user/MD%20OALIUR%20RAHMAN/diary/396656
+ https://www.openstreetmap.org/user/MD%20OALIUR%20RAHMAN/diary/396656
+ <p>Akhila, Nachole, Chapainawabganj</p>
+
+ MD OALIUR RAHMAN
+ Sat, 08 May 2021 09:18:34 +0000
+ https://www.openstreetmap.org/user/MD%20OALIUR%20RAHMAN/diary/396656#comments
+ 24.7665
+ 88.3925
+ 24.7665 88.3925
+
+
+ الشخصيه
+ https://www.openstreetmap.org/user/tamimKSA/diary/396655
+ https://www.openstreetmap.org/user/tamimKSA/diary/396655
+ <p>الضوء يتفوق في سرعة وصوله وإنتشاره.. وكذلك الأهداف النبيلة النقية التي لم تدنسها المصلحة الشخصية</p>
+
+ tamimKSA
+ Sat, 08 May 2021 05:14:49 +0000
+ https://www.openstreetmap.org/user/tamimKSA/diary/396655#comments
+ 18.2954297312046
+ 42.7615432720631
+ 18.2954297312046 42.7615432720631
+
+
+ رمضان كريم
+ https://www.openstreetmap.org/user/tamimKSA/diary/396654
+ https://www.openstreetmap.org/user/tamimKSA/diary/396654
+ <p>كل عام وانتم بخير بمناسبه رمضان المبارك اعاده الله علينا وعليكم بالخير واليمن والبركات</p>
+
+ tamimKSA
+ Sat, 08 May 2021 04:51:30 +0000
+ https://www.openstreetmap.org/user/tamimKSA/diary/396654#comments
+
+
+ Addition of forest Roads in Abau District,Central Province,PNG
+ https://www.openstreetmap.org/user/Nicxon%20Piaso/diary/396653
+ https://www.openstreetmap.org/user/Nicxon%20Piaso/diary/396653
+ <p>For quite sometime,I have edited some road networks around the Rigo District and Abau especially in Kupiano and Moreguina Rubber plantation as well as Babauguina Rubber Plantation. I can recall of a Survey field party that we did in 2015 regarding the setup of GPS for control station coordination using TOPCON HiPER system for aero-triangulation.</p>
+
+ <p>Those road were full of dirt and often times we complained of the wild experience along the Magi Highway en-route to Abau District. We were preparing the way for LiDAR(Light Detection and Ranging) work to be undertaken by FUGRO Geospatial for Australia.
+ Visiting these thick vegetated areas some times inhospitable made Surveyor work really tough. Hu ah!! we did it..When I map these features in OSM, it brings back vivid memories of my travel in the “Land of the Unexpected”,Papua New Guinea</p>
+
+ Nicxon Piaso
+ Sat, 08 May 2021 02:34:26 +0000
+ https://www.openstreetmap.org/user/Nicxon%20Piaso/diary/396653#comments
+ -10.017241
+ 148.474753
+ -10.017241 148.474753
+
+
+ Updates of features at Rigo and Abau District,Central Province
+ https://www.openstreetmap.org/user/Nicxon%20Piaso/diary/396652
+ https://www.openstreetmap.org/user/Nicxon%20Piaso/diary/396652
+ <p>Seeing a lot of features especially structures and roads)(esp logging roads) are not mapped an I have appended them form the Maxar imagery.
+ Once these roads networks are mapped ,we can track where illegal logging sites are in Papua New Guinea.
+ Those Mappers who are in PNG using OSM, please do assist as there are a lot of roads built into thick vegetation of the lowlands and they are not identifiable in Goggle Maps but through OSM we can map these linear infrastructures out.</p>
+
+ Nicxon Piaso
+ Sat, 08 May 2021 01:48:16 +0000
+ https://www.openstreetmap.org/user/Nicxon%20Piaso/diary/396652#comments
+
+
+ Is lockdown driving mass POI additions from GMaps by fly-by-night users?
+ https://www.openstreetmap.org/user/TagaSanPedroAko/diary/396651
+ https://www.openstreetmap.org/user/TagaSanPedroAko/diary/396651
+ <p>Last January, I’ve just came upon several newbie users in the Philippines who have accumulated over a thousand edits within a few days, adding a thousand POIs, which I discovered by comparing coverage, are more or less copyright violations from Google Maps (with some POIs being at completely odd spots, someting usual with GMaps in some places). I’ve been able to clean up a bunch of their edits, particularly those from a user named <a href="https://www.openstreetmap.org/user/JPBaje" rel="nofollow noopener noreferrer">JP Baje</a> and another working for a new ride-hail service in the Philippines, and asked the user about their source, but they never replied, and with their activity continuing unabated despite concerns from other fellow mappers back home, I have asked the DWG to have one of them blocked until they have read a message from the DWG addressing concerns. The other one hasn’t been blocked, and has stopped editing, but I’m trying to clean up their edits within my favourite locations while I’m trying to focus with mapping in Canada.</p>
+
+ <p>I have no idea why these fly-by-night editors would spring out here with the sole purpose of filling areas of several cities with POIs without providing their source, adding them one by one that make it hard to revert them in one huge sweep and disappearing later when the damage is done, but I think long and strict lockdowns (such as those in the Philippines) are driving this kind of mapping because in such situation, you can’t just go out of home – even within your neighbourhood – without having to present some form of travel authorization from the local government, or you’re a member of a demographic that is likely to get infected with COVID-19 (which in the Philippines, includes those under 14, above 60, or having a serious health condition as of the May 2021 quarantine restrictions) and I assume these users involved are unlikely to have been in those locations, before or during the mass quarantines. Any thoughts?</p>
+
+ TagaSanPedroAko
+ Sat, 08 May 2021 01:28:06 +0000
+ https://www.openstreetmap.org/user/TagaSanPedroAko/diary/396651#comments
+
+
+ New Calming Traffic Island
+ https://www.openstreetmap.org/user/Bill%20Ricker/diary/396649
+ https://www.openstreetmap.org/user/Bill%20Ricker/diary/396649
+ <p>I saw a new traffic calming traffic island announced on <a href="https://twitter.com/CaughtDot/status/1390380709693566979" rel="nofollow noopener noreferrer">Twitter</a> so i took a small detour and <a href="https://www.openstreetmap.org/changeset/104345669#map=16/42.2941/-71.0757" rel="nofollow noopener noreferrer">added</a> it. I think i’ll add a Note to review it when new imagery is available.</p>
+
+ <p>The neighborhood has a number of other traffic calming measures, speed humps and new lower “Neighborhood” 20mph speed limit. Nice. I didn’t survey or change all the reduced streets, just the ones i drove.</p>
+
+ Bill Ricker
+ Sat, 08 May 2021 00:48:41 +0000
+ https://www.openstreetmap.org/user/Bill%20Ricker/diary/396649#comments
+ 42.290468
+ -71.0739711
+ 42.290468 -71.0739711
+
+
+ Potres i torrenti
+ https://www.openstreetmap.org/user/Matija%20Nalis/diary/396648
+ https://www.openstreetmap.org/user/Matija%20Nalis/diary/396648
+ <p>Nakon velikog početnog entuzijazma oko mapiranja <a href="https://osm-hr.org/2021/01/31/ostecenja-od-potresa-oton/" rel="nofollow noopener noreferrer">područja oštećenih potresom</a>, uglavnom smo posustali…</p>
+
+ <p>Tako da za pauzu pokušavam dobiti da OSM prihvati <a href="https://github.com/openstreetmap/chef/issues/373" rel="nofollow noopener noreferrer">RSS za .torrent</a> za skidanje Planet OSM datoteka, kako bi se smanjilo opterećenje na download web servere, koji su trenutno ograničeni na 4096 KB/s zbog preopterećenja. Tako da slobodno lajkajte taj github issue :-)</p>
+
+ Matija Nalis
+ Fri, 07 May 2021 15:03:43 +0000
+ https://www.openstreetmap.org/user/Matija%20Nalis/diary/396648#comments
+
+
+ Call for Surveyors and Cartographers in Papua New Guinea(PNG)
+ https://www.openstreetmap.org/user/Nicxon%20Piaso/diary/396645
+ https://www.openstreetmap.org/user/Nicxon%20Piaso/diary/396645
+ <p>Hi friends, Surveyors and Cartographers,</p>
+
+ <p>If you are in Papua New guinea, we still need most parts of Papua New Guinea almost in all 21 provinces where most parts are unmapped.</p>
+
+ <p>Please wherever you are, do contribute to OSM(OpenStreetMap) and have your place mapped out. It is free of charge and all you have to do is register an account and contribute your map editing there. You can hone your basic cartographic skills there.</p>
+
+ Nicxon Piaso
+ Fri, 07 May 2021 06:06:57 +0000
+ https://www.openstreetmap.org/user/Nicxon%20Piaso/diary/396645#comments
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/Flym_auto_backup.opml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/Flym_auto_backup.opml
new file mode 100644
index 000000000..1dc93445c
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/Flym_auto_backup.opml
@@ -0,0 +1,28 @@
+
+
+
+Flym export
+1498468298144
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/Programming.opml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/Programming.opml
new file mode 100644
index 000000000..e9b8c5f54
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/Programming.opml
@@ -0,0 +1,62 @@
+
+
+
+ Export from Plenary
+ https://play.google.com/store/apps/details?id=com.spians.plenary
+ Spians Labs
+ info@spianslabs.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Basecamp. Since 1999." xmlUrl="https://m.signalvnoise.com/feed/" type="rss" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/antennapod-feeds.opml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/antennapod-feeds.opml
new file mode 100644
index 000000000..5bc27053a
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/antennapod-feeds.opml
@@ -0,0 +1,17 @@
+
+
+
+ AntennaPod Subscriptions
+ 04 Jul 17 00:58:04 +0200
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/rssguard_1.opml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/rssguard_1.opml
new file mode 100644
index 000000000..4a1544939
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/rssguard_1.opml
@@ -0,0 +1,49 @@
+
+
+
+ RSS Guard
+ Thu, 27 Jul 2017 18:51:54 GMT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/rssguard_2.opml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/rssguard_2.opml
new file mode 100644
index 000000000..4ba5d7dc5
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/opml/rssguard_2.opml
@@ -0,0 +1,49 @@
+
+
+
+ RSS Guard
+ Thu, 27 Jul 2017 18:51:54 GMT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rdf_slashdot.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rdf_slashdot.xml
new file mode 100644
index 000000000..fd0063983
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rdf_slashdot.xml
@@ -0,0 +1,382 @@
+
+
+
+
+
+ Slashdot
+ https://slashdot.org/
+ News for nerds, stuff that matters
+ en-us
+ Copyright 1997-2016, SlashdotMedia. All Rights Reserved.
+ 2024-03-02T15:38:20+00:00
+ Dice
+ help@slashdot.org
+ Technology
+ 1970-01-01T00:00+00:00
+ 1
+ hourly
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Slashdot
+ https://a.fsdn.com/sd/topics/topicslashdot.gif
+ https://slashdot.org/
+
+
+ Ransomware Attack Hampers Prescription Drug Sales at 90% of US Pharmacies
+ https://yro.slashdot.org/story/24/03/02/071229/ransomware-attack-hampers-prescription-drug-sales-at-90-of-us-pharmacies?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ "A ransomware gang once thought to have been crippled by law enforcement has snarled prescription processing for millions of Americans over the past week..." reports the Washington Post.
+
+ "The hackers stole data about patients, encrypted company files and demanded money to unlock them, prompting the company to shut down most of its network as it worked to recover."
+
+ Insurance giant UnitedHealthcare Group said the hackers struck its Change Health business unit, which routes prescription claims from pharmacies to companies that determine whether patients are covered by insurance and what they should pay... Change Health and a rival, CoverMyMeds, are the two biggest players in the so-called switch business, charging pharmacies a small fee for funneling claims to insurers. "When one of them goes down, obviously it's a major problem," said Patrick Berryman, a senior vice president at the National Community Pharmacists Association...
+
+ UnitedHealth estimated that more than 90 percent of the nation's 70,000-plus pharmacies have had to alter how they process electronic claims as a result of the Change Health outage. But it said only a small number of patients have been unable to get their prescriptions at some price. At CVS, which operates one of the largest pharmacy networks in the nation, a spokesperson said there are "a small number of cases in which our pharmacies are not able to process insurance claims" as a result of the outage. It said workarounds were allowing it to fill prescriptions, however...
+
+ For pharmacies that were not able to quickly route claims to a different company, the Change Health outage left pharmacists to try to manually calculate a patient's co-pay or offer them the cash price. Compounding the impact, thousands of organizations cut off Change Health from their systems to ensure the hackers did not infect their networks as well... The attack on Change Health has left many pharmacies in a cash-flow bind, as they face bills from the companies that deliver the medication without knowing when they will be reimbursed by insurers. Some pharmacies are requiring customers to pay full price for their prescriptions when they cannot tell if they are covered by insurance. In some cases, that means people are paying more than $1,000 out of pocket, according to social media posts.
+
+ The situation has been "extremely disruptive," said Erin Fox, associate chief pharmacy officer at University of Utah Health. "At our system, our retail pharmacies were providing three-day gratis emergency supplies for patients who could not afford to pay the cash price," Fox said by email. "In some cases, like for inhalers, we had to send product out at risk, not knowing if we will ever get paid, but we need to take care of the patients." Axis Pharmacy Northwest near Seattle is "going out on a limb and dispensing product with absolutely no inkling if we'll get paid or not," said Richard Molitor, the pharmacist in charge.<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=Ransomware+Attack+Hampers+Prescription+Drug+Sales+at+90%25+of+US+Pharmacies%3A+https%3A%2F%2Fyro.slashdot.org%2Fstory%2F24%2F03%2F02%2F071229%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fyro.slashdot.org%2Fstory%2F24%2F03%2F02%2F071229%2Fransomware-attack-hampers-prescription-drug-sales-at-90-of-us-pharmacies%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://yro.slashdot.org/story/24/03/02/071229/ransomware-attack-hampers-prescription-drug-sales-at-90-of-us-pharmacies?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244560&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ EditorDavid
+ 2024-03-02T15:34:00+00:00
+ crime
+ bitter-pills
+ yro
+ 0,0,0,0,0,0,0
+
+
+ Spotify, Epic Games, and Others Argue Apple's App Store Changes Do Not Comply With DMA
+ https://apple.slashdot.org/story/24/03/02/0118225/spotify-epic-games-and-others-argue-apples-app-store-changes-do-not-comply-with-dma?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ An anonymous reader quotes a report from MacRumors: Spotify, Epic Games, Deezer, Paddle, and several other developers and EU associations today sent a joint letter to the European Commission to complain about Apple's "proposed scheme for compliance" with the Digital Markets Act (DMA). The 34 companies and associations do not believe Apple's plans "meet the law's requirements." Apple's changes "disregard both the spirit and letter of the law" and if left unchanged, will "make a mockery of the DMA," according to the letter. Several specific components of Apple's plan are highlighted, including the Core Technology Fee, the Notarization process, and the terms that developers must accept:
+ - Apple's requirement to stay with the current App Store terms or opt in to new terms provides developers with "an unworkable choice" that adds complexity and confusion. The letter suggests that neither option is DMA compliant and would "consolidate Apple's stronghold over digital markets."
+ - The Core Technology Fee and transaction fees will hamper competition and will prevent developers from agreeing to the "unjust terms."
+ - Apple is using "unfounded privacy and security concerns" to limit user choice. The "scare screens" that Apple plans to show users will "mislead and degrade the user experience."
+ - Apple is not allowing sideloading, and it is making the installation and use of new app stores "difficult, risky and financially unattractive for developers."
+ The companies and associations are urging the European Union to take "swift, timely and decisive action against Apple." The way the European Commission responds to Apple's proposal "will serve as a litmus test of the DMA and whether it can deliver for Europe's citizens and economy." Further reading: Apple Backtracks on Removing EU Home Screen Web Apps in iOS 17.4<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=Spotify%2C+Epic+Games%2C+and+Others+Argue+Apple's+App+Store+Changes+Do+Not+Comply+With+DMA%3A+https%3A%2F%2Fapple.slashdot.org%2Fstory%2F24%2F03%2F02%2F0118225%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fapple.slashdot.org%2Fstory%2F24%2F03%2F02%2F0118225%2Fspotify-epic-games-and-others-argue-apples-app-store-changes-do-not-comply-with-dma%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://apple.slashdot.org/story/24/03/02/0118225/spotify-epic-games-and-others-argue-apples-app-store-changes-do-not-comply-with-dma?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244364&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ BeauHD
+ 2024-03-02T13:00:00+00:00
+ eu
+ making-a-mockery
+ apple
+ 13
+ 13,13,12,10,1,0,0
+
+
+ Copilot For OneDrive Will Fetch Your Files and Summarize Them
+ https://tech.slashdot.org/story/24/03/02/016213/copilot-for-onedrive-will-fetch-your-files-and-summarize-them?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ An upcoming April release of Copilot for OneDrive will be able to find, summarize, and extract information from a wide range of files, including text documents, presentations, spreadsheets, HTML pages and PDF files. "Users can ask Copilot to tailor summaries to their liking, such as only including key points or highlights from a specific section," reports The Verge. From the report: The chatbot will also be able to respond to natural language prompts and answer highly specific questions about the contents of a user's files. Some examples given by Microsoft included asking Copilot to tabulate a week's worth of beverage sales and throw the data in a table view by day. Or, asking it to list the pros and cons of a project, or display the most recent or relevant files. Users can even ask Copilot for advice on how to make their documents better. Copilot on OneDrive will also be able to create outlines, tables, and lists for users, based on existing files. A few examples given were:
+
+ - Using the /sales-enablement.docx as reference, create an outline of a sales pitch to a new customer.
+
+ - For these selected resumes, create a table with names, current title, years of experience, educational qualifications, and current location.
+
+ - Create a list of frequently asked questions about project Moonshot.<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=Copilot+For+OneDrive+Will+Fetch+Your+Files+and+Summarize+Them%3A+https%3A%2F%2Ftech.slashdot.org%2Fstory%2F24%2F03%2F02%2F016213%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Ftech.slashdot.org%2Fstory%2F24%2F03%2F02%2F016213%2Fcopilot-for-onedrive-will-fetch-your-files-and-summarize-them%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://tech.slashdot.org/story/24/03/02/016213/copilot-for-onedrive-will-fetch-your-files-and-summarize-them?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244342&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ BeauHD
+ 2024-03-02T10:00:00+00:00
+ ai
+ AI-overhaul
+ technology
+ 21
+ 21,21,16,15,0,0,0
+
+
+ The Desert Planet In 'Dune' Is Plausible, According To Science
+ https://science.slashdot.org/story/24/03/01/2328228/the-desert-planet-in-dune-is-plausible-according-to-science?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ The desert planet Arrakis in Frank Herbert's science fiction novel Dune is plausible, says Alexander Farnsworth, a climate modeler at the University of Bristol in England. According to Science News, the world would be a harsh place for humans to live, and they probably wouldn't have to worry about getting eaten by extraterrestrial helminths. From the report: For their Arrakis climate simulation, which you can explore at the website Climate Archive, Farnsworth and colleagues started with the well-known physics that drive weather and climate on Earth. Using our planet as a starting point makes sense, Farnsworth says, partly because Herbert drew inspiration for Arrakis from "some sort of semi-science of looking at dune systems on the Earth itself." The team then added nuggets of information about the planet from details in Herbert's novels and in the Dune Encyclopedia. According to that intel, the fictional planet's atmosphere is similar to Earth's with a couple of notable differences. Arrakis has less carbon dioxide in the atmosphere than Earth -- about 350 parts per million on the desert planet compared with 417 parts per million on Earth. But Dune has far more ozone in its lower atmosphere: 0.5 percent of the gases in the atmosphere compared to Earth's 0.000001 percent.
+
+ All that extra ozone is crucial for understanding the planet. Ozone is a powerful greenhouse gas, about 65 times as potent at warming the atmosphere as carbon dioxide is, when measured over a 20-year period. "Arrakis would certainly have a much warmer atmosphere, even though it has less CO2 than Earth today," Farnsworth says. In addition to warming the planet, so much ozone in the lower atmosphere could be bad news. "For humans, that would be incredibly toxic, I think, almost fatal if you were to live under such conditions," Farnsworth says. People on Arrakis would probably have to rely on technology to scrub ozone from the air. Of course, ozone in the upper atmosphere could help shield Arrakis from harmful radiation from its star, Canopus. (Canopus is a real star also known as Alpha Carinae. It's visible in the Southern Hemisphere and is the second brightest star in the sky. Unfortunately for Dune fans, it isn't known to have planets.) If Arrakis were real, it would be located about as far from Canopus as Pluto is from the sun, Farnsworth says. But Canopus is a large white star calculated to be about 7,200 degrees Celsius. "That's significantly hotter than the sun," which runs about 2,000 degrees cooler, Farnsworth says. But "there's a lot of supposition and assumptions they made in here, and whether those are accurate numbers or not, I can't say."
+
+ The climate simulation revealed that Arrakis probably wouldn't be exactly as Herbert described it. For instance, in one throwaway line, the author described polar ice caps receding in the summer heat. But Farnsworth and colleagues say it would be far too hot at the poles, about 70Â C during the summer, for ice caps to exist at all. Plus, there would be too little precipitation to replenish the ice in the winter. High clouds and other processes would warm the atmosphere at the poles and keep it warmer than lower latitudes, especially in the summertime. Although Herbert's novels have people living in the midlatitudes and close to the poles, the extreme summer heat and bone-chilling -40C to -75C temperatures in the winters would make those regions nearly unlivable without technology, Farnsworth says. Temperatures in Arrakis' tropical latitudes would be relatively more pleasant at 45C in the warmest months and about 15C in colder months. On Earth, high humidity in the tropics makes it far warmer than at the poles. But on Arrakis, "most of the atmospheric moisture was essentially removed from the tropics," making even the scorching summers more tolerable. The poles are where clouds and the paltry amount of moisture gather and heat the atmosphere. But the tropics on Arrakis pose their own challenges. Hurricane force winds would regularly sandblast inhabitants and build dunes up to 250 meters tall, the researchers calculate. It doesn't mean people couldn't live on Arrakis, just that they'd need technology and lots of off-world support to bring in food and water, Farnsworth says. "I'd say it's a very livable world, just a very inhospitable world."<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=The+Desert+Planet+In+'Dune'+Is+Plausible%2C+According+To+Science%3A+https%3A%2F%2Fscience.slashdot.org%2Fstory%2F24%2F03%2F01%2F2328228%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fscience.slashdot.org%2Fstory%2F24%2F03%2F01%2F2328228%2Fthe-desert-planet-in-dune-is-plausible-according-to-science%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://science.slashdot.org/story/24/03/01/2328228/the-desert-planet-in-dune-is-plausible-according-to-science?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244256&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ BeauHD
+ 2024-03-02T07:00:00+00:00
+ space
+ minus-the-giant-sandworms
+ science
+ 24
+ 24,24,24,20,2,2,0
+
+
+ Helium Discovery In Northern Minnesota May Be Biggest Ever In North America
+ https://news.slashdot.org/story/24/03/01/2320203/helium-discovery-in-northern-minnesota-may-be-biggest-ever-in-north-america?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ An anonymous reader quotes a report from CBS News: Scientists and researchers are celebrating what they call a "dream" discovery after an exploratory drill confirmed a high concentration of helium buried deep in Minnesota's Iron Range. Thomas Abraham-James, CEO of Pulsar Helium, said the confirmed presence of helium could be one of the most significant such finds in the world. CBS News Minnesota toured the drill site soon after the drill rig first broke ground at the beginning of February. The discovery happened more than three weeks later at about 2 a.m. Thursday, as a drill reached its depth of 2,200 feet below the surface. According to Abraham-James, the helium concentration was measured at 12.4%, which is higher than forecasted and roughly 30 times the industry standard for commercial helium. "12.4% is just a dream. It's perfect," he said.
+
+ Now that helium is confirmed to be underground in Babbitt, Abraham-James said the next phase of the project is a feasibility study by an independent third party to study the size of the well and whether it could support a full-service helium plant. "It's not just about drilling one hole, but now proving up the geological models, being able to get some really good data that wasn't captured in the original discovery," he explained. "It has the potential to really contribute to local society." The company said the feasibility study could take until the end of the year to complete.<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=Helium+Discovery+In+Northern+Minnesota+May+Be+Biggest+Ever+In+North+America%3A+https%3A%2F%2Fnews.slashdot.org%2Fstory%2F24%2F03%2F01%2F2320203%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fnews.slashdot.org%2Fstory%2F24%2F03%2F01%2F2320203%2Fhelium-discovery-in-northern-minnesota-may-be-biggest-ever-in-north-america%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://news.slashdot.org/story/24/03/01/2320203/helium-discovery-in-northern-minnesota-may-be-biggest-ever-in-north-america?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244254&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ BeauHD
+ 2024-03-02T03:30:00+00:00
+ usa
+ dream-discoveries
+ news
+ 25
+ 25,23,22,19,2,0,0
+
+
+ Yelp Says Remote-First Policy Boosted Job Apps By 43%, Led To a More Satisfied Workforce
+ https://it.slashdot.org/story/24/03/01/2312238/yelp-says-remote-first-policy-boosted-job-apps-by-43-led-to-a-more-satisfied-workforce?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ Since implementing a remote-first policy in 2021, Yelp says it's experienced a surge in job applications and a more satisfied workforce. Fortune reports: Last year, the total number of job applicants was 43% higher compared to 2021, according to Yelp's 2024 Remote Work Report released earlier this month. The number of applicants for sales roles skyrocketed by 103%, and prospects for its general and administrative (G&A) positions shot up 52% over the same time period. Those increases fall in line with data that shows a tidal wave of applicants clamoring for remote jobs. "It's rewarding to see both the level of interest and the quality of our applicants," Carmen Amara, chief people officer at Yelp, told Fortune. "Remote work has allowed us to attract a number of candidates who previously would not have applied to Yelp due to their location."
+
+ Despite arguments that remote work weakens workers' connections and growth opportunities, Yelp says it has found the opposite to be true. About 90% of the company's more than 4,700 employees say they have found effective ways to collaborate remotely, and 91% say they are confident in upward career mobility while working out of the office. Flexible schedules have also facilitated a healthy work-life balance -- about 89% of the company's workers say they can manage personal and professional demands, and the same amount say that the remote model has allowed them to make positive changes for their wellbeing.
+
+ Notably, Yelp's global tenure has increased to 3.5 years in 2023, compared to 2.8 years the year prior. The company says it's using the money it saved from shutting down its underutilized offices in New York City, Chicago, and Washington D.C., to funnel back into employee benefits, professional development, and wellness reimbursements.<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=Yelp+Says+Remote-First+Policy+Boosted+Job+Apps+By+43%25%2C+Led+To+a+More+Satisfied+Workforce%3A+https%3A%2F%2Fit.slashdot.org%2Fstory%2F24%2F03%2F01%2F2312238%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fit.slashdot.org%2Fstory%2F24%2F03%2F01%2F2312238%2Fyelp-says-remote-first-policy-boosted-job-apps-by-43-led-to-a-more-satisfied-workforce%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://it.slashdot.org/story/24/03/01/2312238/yelp-says-remote-first-policy-boosted-job-apps-by-43-led-to-a-more-satisfied-workforce?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244234&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ BeauHD
+ 2024-03-02T02:02:00+00:00
+ business
+ work-life-balance
+ it
+ 11
+ 11,10,9,9,3,0,0
+
+
+ Meta Says It's Deleting All Oculus Accounts At the End of the Month
+ https://tech.slashdot.org/story/24/03/01/2258257/meta-says-its-deleting-all-oculus-accounts-at-the-end-of-the-month?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ Emma Roth reports via The Verge: If you still haven't migrated your Oculus account to a Meta one, you might want to do that soon. In an email sent to users, the company says it will delete Oculus accounts on March 29th, 2024, preventing you from reactivating or retrieving your apps, in-app purchases, store credits, and more. You'll lose your achievements, friends list, and any content created with your Oculus account if you don't migrate to a Meta account before then.
+
+ Oculus accounts have been on the way out since 2020, when the company then known as Facebook started requiring new users to sign up with Facebook accounts instead. However, it added the ability to create a Meta account in 2022, offering an alternative to users who didn't want to link their Facebook account to their Quest headset. Meta stopped letting users log in to their Oculus accounts in January 2023. If you've got a Quest gathering dust in a drawer somewhere, now's your last chance to migrate your Oculus account to a Meta one.
+
+ You can migrate your account by heading to this page and signing up for a Meta account with the same email you've used for Oculus. From there, you'll be able to access all of the same games, data, and other purchases saved to your Oculus account.<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=Meta+Says+It's+Deleting+All+Oculus+Accounts+At+the+End+of+the+Month%3A+https%3A%2F%2Ftech.slashdot.org%2Fstory%2F24%2F03%2F01%2F2258257%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Ftech.slashdot.org%2Fstory%2F24%2F03%2F01%2F2258257%2Fmeta-says-its-deleting-all-oculus-accounts-at-the-end-of-the-month%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://tech.slashdot.org/story/24/03/01/2258257/meta-says-its-deleting-all-oculus-accounts-at-the-end-of-the-month?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244228&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ BeauHD
+ 2024-03-02T01:25:00+00:00
+ facebook
+ time-to-migrate
+ technology
+ 20
+ 20,19,16,14,3,1,0
+
+
+ California Approves Waymo Robotaxi Services In LA, SF Neighboring Cities
+ https://tech.slashdot.org/story/24/03/01/2255216/california-approves-waymo-robotaxi-services-in-la-sf-neighboring-cities?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ The California Public Utilities Commission (CPUC) approved Alphabet's Waymo robotaxi service to operate in Los Angeles and some cities near San Francisco. Reuters reports: Waymo, which already operates in San Francisco and Phoenix, applied on Jan 19 to expand its driverless services, saying it would work with policymakers, first responders and community organizations. Last month, the CPUC suspended the application "for further staff review." "Waymo may begin fared driverless passenger service operations in the specified areas of Los Angeles and the San Francisco Peninsula, effective today," the regulator said on a notice posted to its website Friday.<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=California+Approves+Waymo+Robotaxi+Services+In+LA%2C+SF+Neighboring+Cities%3A+https%3A%2F%2Ftech.slashdot.org%2Fstory%2F24%2F03%2F01%2F2255216%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Ftech.slashdot.org%2Fstory%2F24%2F03%2F01%2F2255216%2Fcalifornia-approves-waymo-robotaxi-services-in-la-sf-neighboring-cities%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://tech.slashdot.org/story/24/03/01/2255216/california-approves-waymo-robotaxi-services-in-la-sf-neighboring-cities?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244224&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ BeauHD
+ 2024-03-02T00:45:00+00:00
+ transportation
+ red-light-green-light
+ technology
+ 10
+ 10,10,10,10,2,1,0
+
+
+ Rogue Editors Started a Competing Wikipedia That's Only About Roads
+ https://news.slashdot.org/story/24/03/01/2246227/rogue-editors-started-a-competing-wikipedia-thats-only-about-roads?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ An anonymous reader quotes a report from Gizmodo: For 20 years, a loosely organized group of Wikipedia editors toiled away curating a collection of 15,000 articles on a single subject: the roads and highways of the United States. Despite minor disagreements, the US Roads Project mostly worked in harmony, but recently, a long-simmering debate over the website's rules drove this community to the brink. Efforts at compromise fell apart. There was a schism, and in the fall of 2023, the editors packed up their articles and moved over to a website dedicated to roads and roads alone. It's called AARoads, a promised land where the editors hope, at last, that they can find peace. "Roads are a background piece. People drive on them every day, but they don't give them much attention," said editor Michael Gronseth, who goes by Imzadi1979 on Wikipedia, where he dedicated his work to Michigan highways, specifically. But a road has so much to offer if you look beyond the asphalt. It's the nexus of history, geography, travel, and government, a seemingly perfect subject for the hyper-fixations of Wikipedia. "But there was a shift about a year ago," Gronseth said. "More editors started telling us that what we're doing isn't important enough, and we should go work on more significant topics." [...]
+
+ The Roads Project had a number of adversaries, but the chief rival is a group known as the New Page Patrol, or the NPP for short. The NPP has a singular mission. When a new page goes up on Wikipedia, it gets reviewed by the NPP. The Patrol has special editing privileges and if a new article doesn't meet the website's standards, the NPP takes it down. "There's a faction of people who feel that basically anything is valid to be published on Wikipedia. They say, 'Hey, just throw it out there! Anything goes.' That's not where I come down." said Bil Zeleny, a former member of the NPP who goes by onel5969 on Wikipedia, a reference to the unusual spelling of his first name. At his peak, Zeleny said he was reviewing upwards of 100,000 articles a year, and he rejected a lot of articles about roads during his time. After years of frustration, Zeleny felt he was seeing too many new road articles that weren't following the rules -- entire articles that cited nothing other than Google Maps, he said. Enough was enough. Zeleny decided it was time to bring the subject to the council.
+
+ Zeleny brought up the problem on the NPP discussion forum, sparking months of heated debate. Eventually, the issue became so serious that some editors proposed an official policy change on the use of maps as a source. Rule changes require a process called "Request for Comment," where everyone is invited to share their thoughts on the issue. Over the course of a month, Wikipedia users had written more than 56,000 words on the subject. For reference, that's about twice as long as Ernest Hemingway's novel The Old Man and the Sea. In the end, the roads project was successful. The vote was decisive, and Wikipedia updated its "No Original Research" policy to clarify that it's ok to cite maps and other visual sources. But this, ultimately, was a victory with no winners. "Some of us felt attacked," Gronseth said. On the US Roads Project's Discord channel, a different debate was brewing. The website didn't feel safe anymore. What would happen at the next request for comment? The community decided it was time to fork. "We don't want our articles deleted. It didn't feel like we had a choice," he said.
+
+ The Wikipedia platform is designed for interoperability. If you want to start your own Wiki, you can split off and take your Wikipedia work with you, a process known as "forking." [...] Over the course of several months, the US Roads Project did the same. Leaving Wikipedia was painful, but the fight that drove the roads editors away was just as difficult for people on the other side. Some editors embroiled in the roads fights deleted their accounts, though none of these ex-Wikipedian's responded to Gizmodo's requests for comment. Bil Zeleny was among the casualties. After almost six years of hard work on the New Post Patrol, he reached the breaking point. The controversy had pushed him too far, and Zeleny resigned from the NPP. [...] AARoads actually predates Wikipedia, tracing its origins all the way back to the prehistoric internet days of the year 2000, complete with articles, maps, forums, and a collection of over 10,000 photos of highway signs and markers. When the US Roads Project needed a new home, AARoads was happy to oblige. It's a beautiful resource. It even has backlinks to relevant non-roads articles on the regular Wikipedia. But for some, it isn't home. "There are members who disagree with me, but my ultimate goal is to fork back," said Gronseth. "We made our articles license-compatible, so they can be exported back to Wikipedia someday if that becomes an option. I don't want to stay separate. I want to be part of the Wikipedia community. But we don't know where things will land, and for now, we've struck out on our own."<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=Rogue+Editors+Started+a+Competing+Wikipedia+That's+Only+About+Roads%3A+https%3A%2F%2Fnews.slashdot.org%2Fstory%2F24%2F03%2F01%2F2246227%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fnews.slashdot.org%2Fstory%2F24%2F03%2F01%2F2246227%2Frogue-editors-started-a-competing-wikipedia-thats-only-about-roads%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://news.slashdot.org/story/24/03/01/2246227/rogue-editors-started-a-competing-wikipedia-thats-only-about-roads?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244202&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ BeauHD
+ 2024-03-02T00:02:00+00:00
+ wikipedia
+ forge-your-own-path
+ news
+ 42
+ 42,40,35,28,12,4,2
+
+
+ Hands Up If You Want To Volunteer For Layoffs, IBM Tells Staff
+ https://slashdot.org/story/24/03/01/2143247/hands-up-if-you-want-to-volunteer-for-layoffs-ibm-tells-staff?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ Paul Kunert writes in an exclusive report for The Register: IBM is asking staff who want to take voluntary redundancy to raise their hand as it embarks on a new round of global job cuts, though roles in Europe and within a handful of departments are expected to shoulder the brunt. The Resource Action, as Big Blue likes to euphemistically refer to layoffs, shouldn't be a massive surprise to anyone with more than a passing interest in IBM as it was signaled last month in a Q4 earnings call. Insiders told us this latest process is not considered to be financial but "transformative," although IBM was quite clear in January when CFO James Kavanaugh discussed achieving "$3 billion annual run rate in savings by the end of 2024." This is a third bigger than the initial ambition. The Reg understands that 80 percent of the reduction target is aimed at Enterprise Operations & Support (EO&S) and Q2C missions, Finance & Operations (including Procurement, CIO, HR, Marketing & Comms and Global Real Estate).
+
+ The European Works Council, one IBMer told us, has informed staff that circa 50 percent of IBM's reduction goal will impact staffing levels across the European continent. As if often the preferred route, IBM is seeking employees that are happy to take voluntary redundancy, rather than ditching someone that doesn't want to leave. The sources we spoke to did not reveal the total population in scope for redundancies or the numbers of volunteers being sought. IBM did not confirm the numbers either. [...] Slovakia, we're told, is to feel the tightest squeeze with around a third of IBM's cuts in Europe landing on its International (shared services) Center in Bratislava; the Center in Hungary that supports EO&S/ Q2C, as well as the Finance function in Bulgaria are also going to absorb what our sources described as the most dramatic staff reductions.<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=Hands+Up+If+You+Want+To+Volunteer+For+Layoffs%2C+IBM+Tells+Staff%3A+https%3A%2F%2Fslashdot.org%2Fstory%2F24%2F03%2F01%2F2143247%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fslashdot.org%2Fstory%2F24%2F03%2F01%2F2143247%2Fhands-up-if-you-want-to-volunteer-for-layoffs-ibm-tells-staff%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://slashdot.org/story/24/03/01/2143247/hands-up-if-you-want-to-volunteer-for-layoffs-ibm-tells-staff?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244132&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ BeauHD
+ 2024-03-01T23:20:00+00:00
+ ibm
+ tough-times-in-tech
+ slashdot
+ 28
+ 28,28,24,24,9,4,1
+
+
+ Police Now Need Warrant For IP Addresses, Canada's Top Court Rules
+ https://news.slashdot.org/story/24/03/01/2136253/police-now-need-warrant-for-ip-addresses-canadas-top-court-rules?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ The Supreme Court of Canada ruled today that police must now have a warrant or court order to obtain a person or organization's IP address. CBC News reports: The top court was asked to consider whether an IP address alone, without any of the personal information attached to it, was protected by an expectation of privacy under the Charter. In a five-four split decision, the court said a reasonable expectation of privacy is attached to the numbers making up a person's IP address, and just getting those numbers alone constitutes a search. Writing for the majority, Justice Andromache Karakatsanis wrote that an IP address is "the crucial link between an internet user and their online activity." "Thus, the subject matter of this search was the information these IP addresses could reveal about specific internet users including, ultimately, their identity." Writing for the four dissenting judges, Justice Suzanne Cote disagreed with that central point, saying there should be no expectation of privacy around an IP address alone. [...]
+
+ In the Supreme Court majority decision, Karakatsanis said that only considering the information associated with an IP address to be protected by the Charter and not the IP address itself "reflects piecemeal reasoning" that ignores the broad purpose of the Charter. The ruling said the privacy interests cannot be limited to what the IP address can reveal on its own "without consideration of what it can reveal in combination with other available information, particularly from third-party websites." It went on to say that because an IP address unlocks a user's identity, it comes with a reasonable expectation of privacy and is therefore protected by the Charter. "If [the Charter] is to meaningfully protect the online privacy of Canadians in today's overwhelmingly digital world, it must protect their IP addresses," the ruling said.
+
+ Justice Cote, writing on behalf of justices Richard Wagner, Malcolm Rowe and Michelle O'Bonsawin, acknowledged that IP addresses "are not sought for their own sake" but are "sought for the information they reveal." "However, the evidentiary record in this case establishes that an IP address, on its own, reveals only limited information," she wrote. Cote said the biographical personal information the law was designed to protect are not revealed through having access to an IP address. Police must use that IP address to access personal information that is held by an ISP or a website that tracks customers' IP addresses to determine their habits. "On its own, an IP address does not even reveal browsing habits," Cote wrote. "What it reveals is a user's ISP -- hardly a more private piece of information than electricity usage or heat emissions." Cote said placing a reasonable expectation of privacy on an IP address alone upsets the careful balance the Supreme Court has struck between Canadians' privacy interests and the needs of law enforcement. "It would be inconsistent with a functional approach to defining the subject matter of the search to effectively hold that any step taken in an investigation engages a reasonable expectation of privacy," the dissenting opinion said.<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=Police+Now+Need+Warrant+For+IP+Addresses%2C+Canada's+Top+Court+Rules%3A+https%3A%2F%2Fnews.slashdot.org%2Fstory%2F24%2F03%2F01%2F2136253%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fnews.slashdot.org%2Fstory%2F24%2F03%2F01%2F2136253%2Fpolice-now-need-warrant-for-ip-addresses-canadas-top-court-rules%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://news.slashdot.org/story/24/03/01/2136253/police-now-need-warrant-for-ip-addresses-canadas-top-court-rules?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244130&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ BeauHD
+ 2024-03-01T22:40:00+00:00
+ canada
+ private-links
+ news
+ 25
+ 25,25,21,17,3,0,0
+
+
+ A Leaky Database Spilled 2FA Codes For the World's Tech Giants
+ https://developers.slashdot.org/story/24/03/01/2130254/a-leaky-database-spilled-2fa-codes-for-the-worlds-tech-giants?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ An anonymous reader quotes a report from TechCrunch: A technology company that routes millions of SMS text messages across the world has secured an exposed database that was spilling one-time security codes that may have granted users' access to their Facebook, Google and TikTok accounts. The Asian technology and internet company YX International manufactures cellular networking equipment and provides SMS text message routing services. SMS routing helps to get time-critical text messages to their proper destination across various regional cell networks and providers, such as a user receiving an SMS security code or link for logging in to online services. YX International claims to send 5 million SMS text messages daily. But the technology company left one of its internal databases exposed to the internet without a password, allowing anyone to access the sensitive data inside using only a web browser, just with knowledge of the database's public IP address.
+
+ Anurag Sen, a good-faith security researcher and expert in discovering sensitive but inadvertently exposed datasets leaking to the internet, found the database. Sen said it was not apparent who the database belonged to, nor who to report the leak to, so Sen shared details of the exposed database with TechCrunch to help identify its owner and report the security lapse. Sen told TechCrunch that the exposed database included the contents of text messages sent to users, including one-time passcodes and password reset links for some of the world's largest tech and online companies, including Facebook and WhatsApp, Google, TikTok, and others. The database had monthly logs dating back to July 2023 and was growing in size by the minute. In the exposed database, TechCrunch found sets of internal email addresses and corresponding passwords associated with YX International, and alerted the company to the spilling database. The database went offline a short time later.<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=A+Leaky+Database+Spilled+2FA+Codes+For+the+World's+Tech+Giants%3A+https%3A%2F%2Fdevelopers.slashdot.org%2Fstory%2F24%2F03%2F01%2F2130254%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fdevelopers.slashdot.org%2Fstory%2F24%2F03%2F01%2F2130254%2Fa-leaky-database-spilled-2fa-codes-for-the-worlds-tech-giants%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://developers.slashdot.org/story/24/03/01/2130254/a-leaky-database-spilled-2fa-codes-for-the-worlds-tech-giants?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244108&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ BeauHD
+ 2024-03-01T22:02:00+00:00
+ database
+ exposed-databases
+ developers
+ 7
+ 7,7,6,5,2,0,0
+
+
+ Stack Overflow To Charge LLM Developers For Access To Its Coding Content
+ https://developers.slashdot.org/story/24/03/01/1912250/stack-overflow-to-charge-llm-developers-for-access-to-its-coding-content?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ Stack Overflow has launched an API that will require all AI models trained on its coding question-and-answer content to attribute sources linking back to its posts. And it will cost money to use the site's content. From a report: "All products based on models that consume public Stack Overflow data are required to provide attribution back to the highest relevance posts that influenced the summary given by the model," it confirmed in a statement. The Overflow API is designed to act as a knowledge database to help developers build more accurate and helpful code-generation models. Google announced it was using the service to access relevant information from Stack Overflow via the API and integrate the data with its latest Gemini models, and for its cloud storage console.<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=Stack+Overflow+To+Charge+LLM+Developers+For+Access+To+Its+Coding+Content%3A+https%3A%2F%2Fdevelopers.slashdot.org%2Fstory%2F24%2F03%2F01%2F1912250%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fdevelopers.slashdot.org%2Fstory%2F24%2F03%2F01%2F1912250%2Fstack-overflow-to-charge-llm-developers-for-access-to-its-coding-content%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://developers.slashdot.org/story/24/03/01/1912250/stack-overflow-to-charge-llm-developers-for-access-to-its-coding-content?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244014&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ msmash
+ 2024-03-01T21:22:00+00:00
+ programming
+ pay-to-play
+ developers
+ 28
+ 28,28,25,21,5,2,0
+
+
+ Worldwide Obesity Tops 1 Billion
+ https://news.slashdot.org/story/24/03/01/190220/worldwide-obesity-tops-1-billion?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ Rates of obesity in the U.S. and around the world have more than doubled over the past three decades, according to a new study in The Lancet. From a report: More than 1 billion people worldwide now have obesity, a sign of worsening nutrition that's also raising the risk of leading causes of death and disease such as high blood pressure, cancer and diabetes. The global rate of obesity more than doubled among women, from 8.8% to 18.5%, and nearly tripled in men, from 4.8% to 14.0%, between 1990 and 2022, according to research that pulls from over 3,600 studies.
+
+ The obesity rate among children and adolescents increased by roughly four times, from 1.7% to 6.9% in girls and 2.1% to 9.3% in boys. Just over 4 in 10 adults and 2 in 5 kids in the U.S. are obese. The U.S. now has the world's 10th-highest male obesity rate and 36th-highest female obesity rate. In 1990, the U.S. had the world's 17th-highest male obesity rate and the 41st-highest female obesity rate.<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=Worldwide+Obesity+Tops+1+Billion%3A+https%3A%2F%2Fnews.slashdot.org%2Fstory%2F24%2F03%2F01%2F190220%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fnews.slashdot.org%2Fstory%2F24%2F03%2F01%2F190220%2Fworldwide-obesity-tops-1-billion%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://news.slashdot.org/story/24/03/01/190220/worldwide-obesity-tops-1-billion?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244012&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ msmash
+ 2024-03-01T20:41:00+00:00
+ news
+ tragedy
+ news
+ 121
+ 121,116,96,81,16,5,1
+
+
+ Carbon Emissions Reached Record High in 2023, IEA Says
+ https://news.slashdot.org/story/24/03/01/1854225/carbon-emissions-reached-record-high-in-2023-iea-says?utm_source=rss1.0mainlinkanon&utm_medium=feed
+ Energy-related emissions of carbon dioxide hit a record high in 2023, the International Energy Agency (IEA) said in a report on Friday. The IEA analysis showed that it rose by 410 million tonnes, or 1.1%, in 2023 to 37.4 billion tonnes. From a report: "Far from falling rapidly -- as is required to meet the global climate goals set out in the Paris Agreement -- CO2 emissions reached a new record high," the IEA said. However, the Paris-based watchdog also found clean energy including wind and solar energy, as well as electric vehicles, had helped to offset the impact of the continued burning of coal and oil growth, which was 1.3% in 2022.
+
+ The reopening of China's economy after the COVID-19 pandemic and a recovery in the aviation sector contributed to an overall rise, the IEA said in its report. Severe droughts last year in China, the United States, India, and other countries hampered hydropower production. It accounted for around 40% of the rise in emissions or 170 million tonnes of CO2. "Without this effect, emissions from the global electricity sector would have fallen in 2023," the IEA said. Carbon dioxide emissions from coal accounted for the remaining increase. The IEA analysis showed that 2023 was the first year in which at least half of electricity generation in industrialized countries came from low-emission sources such as renewable energy and nuclear power. Energy-related emissions in the United States fell by 4.1%, and 9% in the European Union, driven by a surge in renewable power generation.<p><div class="share_submission" style="position:relative;">
+ <a class="slashpop" href="http://twitter.com/home?status=Carbon+Emissions+Reached+Record+High+in+2023%2C+IEA+Says%3A+https%3A%2F%2Fnews.slashdot.org%2Fstory%2F24%2F03%2F01%2F1854225%2F%3Futm_source%3Dtwitter%26utm_medium%3Dtwitter"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
+ <a class="slashpop" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fnews.slashdot.org%2Fstory%2F24%2F03%2F01%2F1854225%2Fcarbon-emissions-reached-record-high-in-2023-iea-says%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>
+
+
+
+ </div></p><p><a href="https://news.slashdot.org/story/24/03/01/1854225/carbon-emissions-reached-record-high-in-2023-iea-says?utm_source=rss1.0moreanon&utm_medium=feed">Read more of this story</a> at Slashdot.</p><iframe src="https://slashdot.org/slashdot-it.pl?op=discuss&id=23244010&smallembed=1" style="height: 300px; width: 100%; border: none;"></iframe>
+ msmash
+ 2024-03-01T20:01:00+00:00
+ earth
+ growing-concern
+ news
+ 54
+ 54,52,33,28,6,2,0
+
+
+ Search Slashdot
+ Search Slashdot stories
+ query
+ https://slashdot.org/search.pl
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_anime2you.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_anime2you.xml
new file mode 100644
index 000000000..b0f0f926b
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_anime2you.xml
@@ -0,0 +1,550 @@
+
+
+
+ Aktuelle Anime-News in chronologischer Reihenfolge | Anime2You
+
+ https://www.anime2you.de/news/
+ Täglich aktuelle Anime-News
+ Thu, 21 Dec 2023 18:10:41 +0000
+ de-DE
+
+ hourly
+
+ 1
+
+
+ Geschichte von »Jujutsu Kaisen« nähert sich dem Ende
+ https://www.anime2you.de/news/749807/jujutsu-kaisen-naehert-sich-ende/
+ https://www.anime2you.de/news/749807/jujutsu-kaisen-naehert-sich-ende/#comments
+
+
+ Thu, 21 Dec 2023 16:39:46 +0000
+
+
+ https://www.anime2you.de/?p=749807
+
+
+
Im Rahmen des Jump Festa 2024 enthüllte »Jujutsu Kaisen«-Schöpfer Gege Akutami, dass sich seine erfolgreiche Geschichte immer weiter ihrem Ende nähert. Wir fassen zusammen. Ende innerhalb eines Jahres? Während sich derzeit sowohl im Manga als auch im Anime die Ereignisse überschlagen und den Fans regelrecht den Atem rauben, wurde natürlich entsprechend erwartungsvoll auch das »Jujutsu […]
+]]>
+
+ https://www.anime2you.de/news/749807/jujutsu-kaisen-naehert-sich-ende/feed/
+ 3
+
+
+
+
+ Neue »One Piece«-Figuren von Ruffy, Nami und Shinobu
+ https://www.anime2you.de/news/751116/one-piece-drei-neue-figuren/
+ https://www.anime2you.de/news/751116/one-piece-drei-neue-figuren/#comments
+
+
+ Thu, 21 Dec 2023 15:55:17 +0000
+
+
+ https://www.anime2you.de/?p=751116
+
+
+
Das japanische Unternehmen Bandai Spirits stellte vor Kurzem neue Figuren von Ruffy, Nami und Shinobu aus der Anime-Serie »One Piece« vor. Wir fassen alle Details für euch zusammen. Figuren erscheinen ab Juni 2024 Die neuen Figuren von Monkey D. Ruffy, Shinobu und Nami aus der »The Grandline Series«-Reihe von Bandai Spirits messen jeweils eine Größe […]
+]]>
+
+ https://www.anime2you.de/news/751116/one-piece-drei-neue-figuren/feed/
+ 3
+
+
+
+
+ Autor von »My Hero Academia« teasert baldiges Ende an
+ https://www.anime2you.de/news/749891/my-hero-academia-autor-ende-teaser/
+ https://www.anime2you.de/news/749891/my-hero-academia-autor-ende-teaser/#comments
+
+
+ Thu, 21 Dec 2023 15:50:45 +0000
+
+
+ https://www.anime2you.de/?p=749891
+
+
+
Im Rahmen des Jump Festa 2024 gab »My Hero Academia«-Schöpfer Kohei Horikoshi bekannt, dass er seinen Manga innerhalb des nächsten Jahres zum Abschluss bringen möchte. Wir fassen zusammen. Charakter sollte sterben Nachdem vor Kurzem verkündet wurde, dass die siebte »My Hero Academia«-Staffel nach vier Recap-Episoden offiziell am 4. Mai 2024 starten wird, sorgte Autor Kohei Horikoshi […]
Das Unternehmen Good Smile Company stellte vor Kurzem eine neue Figur von Maomao zur Anime-Umsetzung von »The Apothecary Diaries« (jap.: »Kusuriya no Hitorigoto«) vor. Wir fassen zusammen. Figur erscheint im Juni 2024 Die neue Figur von Maomao aus der »Pop Up Parade«-Reihe von Good Smile Company misst eine Größe von etwa 17 Zentimeter und wurde vom […]
Das japanische Unternehmen Bandai Spirits stellte vor Kurzem eine neue Figur von Chisato Nishikigi aus der Anime-Serie »Lycoris Recoil« vor. Wir fassen alle Details für euch zusammen. Figur erscheint im Mai 2024 Die neue Figur von Chisato Nishikigi aus der »Relax Time«-Reihe von Bandai Spirits misst eine Größe von circa 11 Zentimeter. Für die Herstellung des […]
+]]>
+
+ https://www.anime2you.de/news/751076/lycoris-recoil-relax-time-figur-chisato/feed/
+ 1
+
+
+
+
+ Neue »Our Dating Story«-Figur von Runa vorgestellt
+ https://www.anime2you.de/news/751085/our-dating-story-furyu-figur-runa/
+ https://www.anime2you.de/news/751085/our-dating-story-furyu-figur-runa/#comments
+
+
+ Thu, 21 Dec 2023 15:25:10 +0000
+
+
+ https://www.anime2you.de/?p=751085
+
+
+
Das japanische Unternehmen FuRyu stellte vor Kurzem eine neue Figur von Runa Shirakawa aus der Anime-Adaption von »Our Dating Story: The Experienced You and The Inexperienced Me« vor. Wir fassen die Details nachfolgend für euch zusammen. Figur erscheint im Mai 2024 Die neue Figur von Runa Shirakawa aus der »Trio-Try-iT«-Reihe des Herstellers FuRyu misst eine […]
Das japanische Unternehmen Bandai Spirits stellte vor Kurzem eine neue Figur von Izuku Midoriya aus der Anime-Serie »My Hero Academia« vor. Wir fassen alle Details zusammen. Figur erscheint im Juni 2024 Die neue Figur von Izuku Midoriya in der »7th Season Figure Version« des Herstellers Bandai Spirits misst eine Größe von ungefähr 23 Zentimeter. Für die […]
Auf dem Twitter-Account der Anime-Adaption von »Dr. STONE« wurde heute verkündet, dass diese mit einer vierten Staffel fortgesetzt wird. Einen ersten Teaser könnt ihr euch weiter unten ansehen. Anime feiert Finale Die vierte Staffel trägt den Titel »Dr.STONE: Science Future« und soll gleichzeitig auch das Finale der Anime-Umsetzung darstellen. Wann diese im japanischen Fernsehen startet […]
+]]>
+
+ https://www.anime2you.de/news/751143/dr-stone-staffel-4-angekuendigt/feed/
+ 7
+
+
+
+
+ Die 10 gefragtesten Anime im Jahr 2023 bei Google Japan
+ https://www.anime2you.de/news/747682/google-gefragteste-anime-2023-japan/
+ https://www.anime2you.de/news/747682/google-gefragteste-anime-2023-japan/#comments
+
+
+ Wed, 20 Dec 2023 20:52:53 +0000
+
+
+ https://www.anime2you.de/?p=747682
+
+
+
Nachdem in den vergangenen Tagen bereits die diesjährigen Ergebnisse der »Spotify Charts« und der »Yahoo! Japan Search Awards« enthüllt wurden, gab nun auch Google bekannt, was bei den Japanern in den vergangenen zwölf Monaten angesagt war. Wir fassen nachfolgend zusammen. Konkurrenz für »Oshi no Ko«? Wie in den beiden vorangegangenen Artikeln konzentrieren wir uns wieder […]
Erst vor wenigen Wochen haben wir über den Rechtsstreit zwischen dem »Sailor Moon«-Regisseur und einer unbekannten Frau berichtet – nun wurde das Urteil verkündet. Wir fassen zusammen. Frau wurde verurteilt Wir erinnern uns: Eine unbekannte Dame hatte Kunihiko Ikuhara, den Regisseur populärer Titel wie »Sailor Moon«, »Revolutionary Girl Utena« und »Penguindrum«, mit Plagiatsvorwürfen konfrontiert und […]
Nach der Ankündigung eines Remakes von »One Piece« drückte ein Mitwirkender an der ersten Serie seine Unzufriedenheit über diese Entscheidung aus. Wir fassen die Details zusammen. Animator enttäuscht Netflix scheint mit »One Piece« sein neues Zugpferd auserkoren zu haben, denn nicht nur die überaus erfolgreiche Live-Action-Adaption soll mit einer zweiten Staffel fortgesetzt werden, sondern auch […]
+]]>
+
+ https://www.anime2you.de/news/750808/one-piece-animator-remake-kritik/feed/
+ 37
+
+
+
+
+ Regisseure sprechen sich auf drastische Weise für KI aus
+ https://www.anime2you.de/news/747982/regisseur-sprechen-sich-fuer-ki-aus/
+ https://www.anime2you.de/news/747982/regisseur-sprechen-sich-fuer-ki-aus/#comments
+
+
+ Wed, 20 Dec 2023 17:34:34 +0000
+
+
+ https://www.anime2you.de/?p=747982
+
+
+
Zwei renommierte Anime-Regisseure gaben im Rahmen eines aktuellen Interviews an, dass sie »faule Animatoren« gerne durch künstliche Intelligenz ersetzen würden. Wir fassen zusammen. »Faule Animatoren« ersetzen Während sich Regisseur Makoto Shinkai (»Your Name.«) in der Vergangenheit recht diplomatisch über sein Interesse an der Nutzung künstlicher Intelligenz geäußert hatte, sorgten die beiden Regisseure Keiichi Hara (»Crayon […]
Auf dem offiziellen Twitter-Account der Anime-Adaption von »The Eminence in Shadow« (jap.: »Kage no Jitsuryokusha ni Naritakute!«) wurde heute verkündet, dass diese demnächst mit einem Film fortgesetzt wird. Ein erstes Visual könnt ihr euch unten ansehen. Details stehen noch aus Bislang ist lediglich bekannt, dass der Film den Titel »The Eminence in Shadow: Lost Echoes« […]
Auf dem offiziellen Twitter-Account der Anime-Adaption von »Gods’ Game We Play« (jap.: »Kami wa Game ni Ueteiru.«) wurde heute verkündet, dass diese ab April 2024 im japanischen Fernsehen ausgestrahlt wird. Einen neuen Trailer könnt ihr euch weiter unten ansehen. Anime entsteht bei LIDENFILMS »Gods’ Game We Play« entsteht unter der Regie von Tatsuya Shiraishi (Key […]
Das japanische Unternehmen FuRyu stellte vor Kurzem eine neue Figur von Manjirou (Mikey) aus der Anime-Serie »Tokyo Revengers« vor. Erste Bilder könnt ihr euch weiter unten im Artikel ansehen. Figur erscheint im August 2024 Die neue Figur von Manjirou Sano aus der »F:Nex«-Reihe des Herstellers FuRyu misst im Maßstab 1:7 eine Größe von ungefähr 21 Zentimeter. […]
+]]>
+
+ https://www.anime2you.de/news/750675/tokyo-revengers-fnex-figur-mikey/feed/
+ 3
+
+
+
+
+ Hardball Films bringt »Black Jack« auf Blu-ray
+ https://www.anime2you.de/news/750739/hardball-films-black-jack-lizenz/
+ https://www.anime2you.de/news/750739/hardball-films-black-jack-lizenz/#comments
+
+
+ Tue, 19 Dec 2023 20:06:27 +0000
+
+
+ https://www.anime2you.de/?p=750739
+
+
+
Der Publisher Hardball Films gab heute bekannt, dass man sich die Lizenz an der Serie »Black Jack« gesichert hat und diese demnächst auf DVD sowie erstmals auch auf Blu-ray veröffentlichen wird. Termin noch offen »Black Jack« umfasst zehn rund 50-minütige Episoden, die auf Deutsch und Japanisch mit Untertiteln als Gesamtausgabe in den Handel kommen werden. […]
+]]>
+
+ https://www.anime2you.de/news/750739/hardball-films-black-jack-lizenz/feed/
+ 11
+
+
+
+
+ Voting: Welcher Anime war im Jahr 2023 am besten?
+ https://www.anime2you.de/news/750398/voting-bester-anime-des-jahres-2023/
+ https://www.anime2you.de/news/750398/voting-bester-anime-des-jahres-2023/#comments
+
+
+ Tue, 19 Dec 2023 20:00:44 +0000
+
+
+ https://www.anime2you.de/?p=750398
+
+
+
Das Jahr 2023 neigt sich dem Ende entgegen. Passend dazu starten wir heute unser großes Voting! Welche Serien haben euch in den letzten zwölf Monaten am besten gefallen? Stimmt jetzt ab! Wählt eure Favoriten! In der nachfolgenden Auflistung sind alle Anime-Serien zu finden, die im Jahr 2023 im japanischen Fernsehen sowie hierzulande im Simulcast zu […]
Das japanische Unternehmen Good Smile Company stellte vor Kurzem eine neue Figur von Yukino aus der Anime-Serie »My Teen Romantic Comedy SNAFU« vor. Wir fassen die Details zusammen. Figur erscheint im Dezember 2024 Die neue »Yukino Yukinoshita – Light Novel Volume 6 Cover Illustration Version« des Herstellers Good Smile Company misst im Maßstab 1:6 eine Größe […]
+]]>
+
+ https://www.anime2you.de/news/750569/oregairu-light-novel-figur-yukino/feed/
+ 3
+
+
+
+
+ Crunchyroll ergänzt einen Film und zwei Katalog-Updates
+ https://www.anime2you.de/news/749888/zwei-neue-anime-updates-crunchyroll/
+ https://www.anime2you.de/news/749888/zwei-neue-anime-updates-crunchyroll/#comments
+
+
+ Tue, 19 Dec 2023 19:59:06 +0000
+
+
+ https://www.anime2you.de/?p=749888
+
+
+
Der Streaming-Dienst Crunchyroll hat sein Programm erweitert: Ab sofort sind drei weitere Katalog-Updates auf Abruf verfügbar. Wir fassen alle Details zusammen. Drei neue Katalog-Updates Zu den Neuzugängen zählen die Episoden 69 bis 102 der Mystery-Serie »Detektiv Conan«, welche ab sofort mit deutscher Synchronisation in der HD-Remaster-Version gestreamt werden können, sowie alle Folgen von »Horimiya: The […]
+]]>
+
+ https://www.anime2you.de/news/749888/zwei-neue-anime-updates-crunchyroll/feed/
+ 6
+
+
+
+
+ Netflix: Alle Anime-Neuzugänge im Januar 2024
+ https://www.anime2you.de/news/748252/netflix-anime-neu-im-janaur-2024/
+ https://www.anime2you.de/news/748252/netflix-anime-neu-im-janaur-2024/#comments
+
+
+ Tue, 19 Dec 2023 18:57:53 +0000
+
+
+ https://www.anime2you.de/?p=748252
+
+
+
Auch im Januar 2024 erweitert Netflix seinen Anime-Katalog mit neuen Serien und Filmen. Um welche Titel es sich dabei handelt, haben wir hier für euch zusammengefasst. Neue Anime im Januar 2024 Am 1. Januar 2024 nimmt Netflix den »War of Underworld«-Arc von »Sword Art Online: Alicization« in sein Programm auf, bevor ab dem 15. Januar 2024 der […]
Bereits im November 2023 startete der Publisher FilmConfect Anime mit dem deutschen Disc-Release der Anime-Adaption von »Kanon«. Durch Produkteinträge bei Amazon wurde nun der Termin der weiteren Volumes, die ab sofort auch vorbestellt werden können, bekannt. Drittes Volume im Februar 2024 Das dritte Volume erscheint voraussichtlich am 9. Februar 2024 als DVD und Blu-ray. Dieses beinhaltet […]
+]]>
+
+ https://www.anime2you.de/news/750638/kanon-weitere-volumes-vorbestellbar/feed/
+ 5
+
+
+
+
+ Zwei neue Plüschfiguren zu »Frieren« angekündigt
+ https://www.anime2you.de/news/750598/frieren-zwei-neue-plueschfiguren/
+ https://www.anime2you.de/news/750598/frieren-zwei-neue-plueschfiguren/#comments
+
+
+ Tue, 19 Dec 2023 17:55:15 +0000
+
+
+ https://www.anime2you.de/?p=750598
+
+
+
Das japanische Unternehmen SEGA stellte vor Kurzem neue Plüschfiguren zur Fantasy-Serie »Frieren: Beyond Journey’s End« (jap.: »Sousou no Frieren«) vor. Wir fassen alle Details zusammen. Plüschis erscheinen ab Herbst 2023 Die Prize-Veröffentlichung der neuen Mini-Plüschis von Frieren und Fern des Herstellers SEGA soll im Herbst 2023 in den japanischen Arcade-Hallen erfolgen. Weitere Mini-Plüschis sind für […]
Durch einen Eintrag beim Online-Händler Amazon wurde vor Kurzem bekannt, dass Crunchyroll den Anime-Film »Suzume« auf DVD und Blu-ray veröffentlichen wird. Wir fassen nachfolgend zusammen. Disc-Release im April 2024 »Suzume« erscheint nach aktueller Planung am 5. April 2024 als limitierte Collector’s Edition, in einer Limited Edition als Steelbook sowie als Standard-Ausgabe im Amaray-Case mit deutscher und […]
+]]>
+
+ https://www.anime2you.de/news/749291/suzume-disc-releasetermin/feed/
+ 40
+
+
+
+
+ Termin von »Great Pretender razbliuto« steht fest + Trailer
+ https://www.anime2you.de/news/750489/great-pretender-razbliuto-termin-trailer/
+ https://www.anime2you.de/news/750489/great-pretender-razbliuto-termin-trailer/#comments
+
+
+ Tue, 19 Dec 2023 16:45:36 +0000
+
+
+ https://www.anime2you.de/?p=750489
+
+
+
Auf dem offiziellen Twitter-Account der Anime-Serie »Great Pretender« wurde heute verkündet, dass die Fortsetzung ab dem 23. Februar 2024 auf japanischen Streaming-Plattformen veröffentlicht wird. Einen neuen Trailer dazu könnt ihr euch weiter unten in diesem Artikel ansehen. Erste Staffel bei Netflix Die Sequel-Serie mit dem Titel »Great Pretender razbliuto« wird unter der Regie von Hiro Kaburagi […]
Durch einen Eintrag auf der Website des Streaming-Dienstes Netflix wurde heute bekannt, dass die Anime-Serie »Record of Grancrest War« im nächsten Monat aus dem Programm entfernt wird. Anime wird bald entfernt Die 24-teilige Anime-Adaption von »Record of Grancrest War« steht demzufolge nur noch bis zum 14. Januar 2024 mit deutscher Sprachausgabe sowie in der japanischen Originalvertonung […]
+]]>
+
+ https://www.anime2you.de/news/750376/netflix-entfernt-record-of-grancrest-war/feed/
+ 13
+
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_anon.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_anon.xml
new file mode 100644
index 000000000..e8f7f1a02
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_anon.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ http://ANON.com/sub
+ The Grawlix CMS
+
+ 2018-12-13 00:00:00
+
+ http://ANON.com/sub/##
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_cornucopia.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_cornucopia.xml
new file mode 100644
index 000000000..a286b9ccb
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_cornucopia.xml
@@ -0,0 +1 @@
+tag:blogger.com,1999:blog-8354057230547055221Sun, 05 Mar 2017 13:52:33 +0000börsenbostadsbubblanpeak oilbostadaktierförsvarteknisk analysRysslandoljatramspolitiklitteraturskuldkrisenguldundersökningbankerOMXS30EUbostadbubblanStockholmUSAjordbruktillväxtInternetförsvaretinflationbloggarmediaskuldbubblanfinanskrisbostadslånkrigGöteborgguldprisenergiräntanUkrainautbildningRiksbankenSP500råvarorrättsväsendetfinanskrisenGreklandskattBNPneosurvivalismreklamsurvivalismeurodemokratibilarklimatförändringarpolisenval2014arbetslöshetSverigeeget företagfossilgaskonjunkturterrorismbolånSwedbankkärnkraftkonsumismMiljöpartietUSDsjukvårdSCBväderSyrienMalmöSEBlönerskattersilverKPIinvandringföreläsningskulderAORDNATOAnders BorgAppledeflationSverigedemokraternaTVmiljöamorteringbörskraschfonderekonomiKanadafildelningfilmtrustervalutaHOXoljeprisNorgeIT-branschenval2010Storbritannienironikonspirationsteorierekologiskt jordbrukarbetsmarknadelbilarvindkraftSkatteverketSRflygbolagföretagandesäkerhetPA ResourcessemesterCO2IT-bubblanSEKinfrastrukturobligationerFrankrikeNikkeiTysklandderivatKinatradingPiratpartietSVTSaudi-Arabienpeak gassparandeMäklarstatistikhumanekologipensionFRAsatirAvanzaIrakjärnvägGotlandStefan LöfvenFredrik ReinfeldtamorteringarskogVolvoNordeaFinansinspektionenTelialandetbiobränsledatorermatskogsbrukObamavetenskapiPhonejournalistikriskhanteringSaabmediakrisenmusikstatspapperFederal ReservepensionssparandeSBABfacketvargelprisPearlaktiefonderförsvarsmaktenkorruptionLundin PetroleumfolkhälsaBitcoinDanmarkräntaAfghanistanteknologivattenkraftvärnpliktenHandelsbankenenergikrisECBFinlandIslandLissabonfördragetförmögenhetkulturpeak coalLiberty SilverjournalisterLibyenValueguardbarnhedgefonderstatsskuldsvart svanCOSbudgetreporäntanÅsa RomsonbredbandhistoriaDAXTesla Motorsavbelåningekologisk matkapitalförsäkringarKungsbackaTurkietbensinjaktrecensionGoogleIrlandWikileaksdieselhumorkollektivtrafikmodebloggpensionerFortumIMFIsraelSpotifyutdelningarIPREDMagdalena AnderssondecembersveketskogsmarkEU-stödFacebookHang SengfiatpengargruvorinsättningsgarantikollapsräntefonderCPGEMUVIXVattenfallmobiltelefonivedeldningIranMSBSeabasedhyreshusmatbloggvågkraftDNO InternationalPPMWTIenergikrisenkolkraftpenningmängdsportDonald TrumpMargot WallströmpensionärersolcellerNASDAQSpanienfordonskrisenjulhandelAftonbladetBPEgyptenItalienhembrukkryptoval2018JapanLundTraderafastighetstaxeringClaes HembergMona SahlincentralbankeretanolexportköttmjölkAleklettAnnie LööfFTSEGLDGeorgienIEAblankningintervjuveteBrexitCAC40EURGustav FridolinNordnetPEYSASbetalkortkommunhybrisobligationsbubblanreligionAnders YgemanHeadwebOPECdatalagringliberalismsocialdemokraternaAndra världskrigetCarl BildtIngvesPeytoPortugalSJTeslaUppsalaförsäkringarinvesteringssparkontoipadJMLänsförsäkringarbilindustrinfofrkförmögenhetsskattBrentPBNTwitterkapitalförsäkringprivatekonomisolenergival2013Jan BjörklundJonas SjöstedtLars OhlyLettlandMarks kommunMassolit MediaPolenUSObokföringdeklarationplatinapolisCypernDABEricssonGöran PerssonHBORiksgäldenauktionbankfackbilindustribonusprogramcensurinfluensajulhandelnmoderaternasolkraftvertical windArbetsförmedlingenDJIADow JonesHSIKondratievNederländernaNordstreamPEABPiratebaySkåneföräldraförsäkringkreditkorträntorungvänsterpartietAlliance OilBretton WoodsEdward SnowdenGMHQIT-konsulterPeter HultqvistRadiotjänstTalebcenterpartietfusionskraftiTunes StoreklimatförändingarkonkursvattenE.OnEIAGöteborg EnergiLOMaud OlofssonPostenkommunismlånmatkrisennyemissionerrecessiontelefoniBovespaBrasilienEstlandLinköpingMicrosoftNCCNicole FossTorontoarbetstidbiogasguldmyntfotjust in timejust-in-timekonkursermaskirovkaAnna Kinberg BatraAustralienBooliOECDPWTSHBfastigheterfolkpartietnyemissionorkanerpsykologisabotagestatistikAlmedalsveckanBelgienBoråsDNOEllevioFörsäkringskassanHTEHelsingborgKarlsborgLASMexicoPR-byråSTPSödraTäbyVitrysslandXACT BearbensinpriskolkristdemokraternarymdensjöfartAfrikaAstraZenecaBen BernankeLitauenM3PVEarvsskattbarnomsorgjobbskatteavdragmedborgarlönsvarta svanarårets julklappDanske BankERFElon MuskJuholtLehmanLondonNetflixNorthlandSP 500SahlinSkanskaVenezuelaclimeonenskild firmajultomtenlivsmedelpeak fosforpreppingskogsindustrival2016AFGXClub of RomeDubaiG20Hillary ClintonMadoffMarc FaberOMXSPISMHISony EricssonStatoilTanganyika OilVolkswagena-kassanhälsainsiderinformationkronofogdenmonopolrederierräntefördelningvinArgentinaBPTBWGEnglandGBPKarin EnströmKarlshamnLöddeköpingeSLVSkottlandTV4TavexTrollhättanTwinglyVästra Götalandbiflationcykeldata mininglågkonjunkturupprorval2015AIGAMF PensionAlmegaCarnegieCelenteGrönlandICAIKEAJim RogersKoenigseggNokiaPer BolundRUBReinfeldtSACOSAPSSABStorytelTjörnUngernVoddlergaskommunermomspodcastymnighetshornetÖrebroÖstrosCAC-40EnquestGunnar LindstedtHOXFLATSWEIndienJohan NorbergKjell AleklettMonsantoNobelprisNorthstreamRadetzkiRya KraftvärmeverkSystembolagetSäpoSödertäljeTunisienVästeråsallemansrättenekobrottsmyndighetenfinankrisinflationenkopparreporäntavan RumpoyAlingsåsAmazonAnadarkoAnnika StrandhällBahrainBear USDX3 HBull OljaCSNCecilia AronssonCervenkaChryslerDBADBCFannieFinancial SenseGazaGazpromJönköpingKalifornienLandshypotekLuleåNigeriaNord StreamNordkoreaRomklubbenStefan FölsterSwishTainterUmeåVästsverigeaktieindexobligationerbankbokboendeeuronidiotikonsultbolagvarselArlaBaltic Dry IndexCHFDBEEnergy PotentialFreddieHMHafslundHalmstadIEFJAKJan JörnmarkKarlstadKeynesKnivstaMarit PaulsenNAIRUNissanPekkaRecorded FutureRick FalkvingeRoburRomneySPISchweizSchymanShellSinopecTTIPTeracomTransportstyrelsenVietnamkrigetVärmdöXACT BullbluffardeleveragingdollarfiskeiRobotkravallermoralpanikoljesandpanamapapersrealräntefonderscenarionsparbankernaÄlvsbynÖstersund19293GAkeliusAlice Bah KuhnkeBulgarienEbba BuschEktornetFTSE-100FolksamFordFred Olsen EnergyFredrik FederleyHUIHans RoslingJevons paradoxLRF KonsultLUPEMyresjöhusNASANOKNouriel RoubiniPagrotskyParisPartillePeter ErikssonPeter SchiffRBSRIGROWERTSRumänienSerbienSkandiaSlovakienSolnaSpelbrädetStenungsundSydafrikaTransoceanTrumpViking LineWallersteinWarren BuffetWibbleamorterabåtdepressioneroeihackingimportkall fusionkapitalismmiljonärmiljöbilarmonarkimänskliga rättigheterpalladiumpresidentvalrealräntanränteplaceringarskogsarbetesmåskalig elproduktionsocialismsolelsäkerställda obligationertidningar2010201234GActaAllan WidmanAlmedalenBMWBahnhofBeatrice AskCFDCOMEXChris MartensonCurrent PowerDeutsche BankESVEkeröEskilstunaEuropaExxonGLHGabriel WikströmGoldMoneyGuldcentralenGöran HägglundHaitiHallandHayekHondaHässleholmISIndonesienJan EricssonJim RodgersJordanienKPIFKameoKaupthingKyle BassLandskronaLehman BrothersLouMaerskMarkMax KeiserMensaMoldavienMölndalNackaNourel RoubiniOMRXBONDPalestinaPlexPontus SchultzPreemPutinRECScaniaSkövdeSollentunaTailsweepTeliaSoneraTjeckienToyotaTyheeVeronica PalmVestasVäxjöaktiespararnaapotekarvskattbildindustrinbli rikcrowdfundingexergifiktiongenetikiTunesinvandringenkapitalkärnkraftenlandräntaoljekonsumtionrealräntariskkapitalstrandvaskarteorinuttagsanstormningwarrantsÖresundÖsterrike2013201770-talister80-talisterAlf HornborgAnna JohanssonAxfoodAzarBear Olja HBirger SchlaugBlocketBolidenBonnierCDEChesapeake EnergyCitigroupCrucellDKKDMEDanderydDavosDnBEFNESMElectroluxEnergy TowerEnströmFalunG8GapMinderGhanaGoogle AdsenseHanif BaliHiQHyperloopIBEX35IfIsabella LövinJakop DalundeJim SinclairKlas EklundKoeniseggKroatienKubaLKABLars CalmforsLinkedInLundinsfärenLysekilMatt SimmonsMetroMorgan JohanssonNeil StraussNew WaveNorsk Svensk GuldOMXOdellPDEPRIOPVE EnterprisePanaxiaPiratparitetPride InternationalSCASIXRXSP-500SSFSamsungSandvikSara SkyttedalSaud-ArabienSchibstedSecuritasShiller-p/eSigmaSlovenienSmögenSomaliaSpotfireSundsvallSvensk ExportkreditSverker LenasTanganyikaTele-2TidalUddevallaVeckans AffärerVellingeViasatVietnamVostok GasVostok NaftaWedgewoodbilindustibiodieselbloggerdatorspelfackfjärrvärmefossil gasfårketglobaliseringguldklockaiZettlelitiumomröstningransoneringrealkapitalrekonstruktionrevolutionskolanskolmatsocial securitysponsratsvartarbetetelefonförsäljningterminerterrortillväxtismtävlingvalfuskvarvskrisenÖrnsköldsvik.2009201624h business campABBAcandoAccentureAlexander StubbAlibabaAllianceAnders BjörkAnticimexArdalan ShekarabiArmenienAudiAvestaBakkenBarbourBlack Earth FarmingBollebygdBorevindBorgerlig FramtidBoxholmBullionstarBurberryBushCADCDOCDOn.comCDSCERACastellumCecilia MalmströmChalmersChevronCitroenConnectaDDRDNDiamond OffshoreE*TradeE85EcuadorEniroErik ÅsbrinkEssungaEtrionEurocineEuronextFagerstaFalkenbergForexFredrik Reinfeldt.GHUSGINIGVAGVZGabriel UrwitzGaveKalGilead SciencesGolarGoldman SachsGunnar HökmarkHarvestHerrljungaHolmenHuddingeHypoHärrydaIOXIPCCIPRED2IkanobankenIngvar CarlssonInvestorIrma RosenbergJPYJeff RubinJemenJohan PehrsonJärfällaKalmarKatolska kyrkanKenyaKinnaKlarnaKoreakrigetKristianstadKronobergKungälvKustbevakningenKyotoKöpingLidingöLightstreamLivestationLjusdalLudvikaLundin MiningMTR ExpressMakedonienMalaysiaMaliMarstrandMercedesMerril LynchMichael RuppertMikael OdenbergModerna FonderMorgan StanleyNestleNykvarnNyköpingOdin fonderOlof PalmeOrustOskarshamnPenatesPetrobrasPfizerPriusQatarREITRJARiksbankRiksrevisionenRobert ShillerRomRussel-2000Ryssland.SAMSKFSTISTIBORSchiffSekabSjöfartsverketSonySorosStenbeckStephen D KingStrömstadSundbybergSvDSvenljungaTV3TanumTaurusTelenorTencentThailandThinkTomas BodströmTomhylsanTrent ReznorTyresöUCUlf KristerssonUlricehamnUpplands-BroUrban AhlinVAxholmVETVallentunaVarbergVeidekkeVictoriaVärmlandWaidelichWallenstamWesterbergXTOYaraaffärsmodelleraktiearbetslösarbitragearvbelåningsgradbensonbesökarebiståndbloggbävningbokförignbostadsbredbandsfilmdenlångakrisendigital allemansrättenergyengelskafascismförsta världskrigetgengasgeotermisk energigoldguidelinegåvoskattindustrijournalistkartanjulgranarjunilistankreditbrevköpcentraliborgatemilkursmodelltestneosurvivalistennäringsfastighetoljeproduktionorganisationpatentpenningmängdenpolitkpopulismporslinpressmeddelandepyramidspelpåvenrapporterremburserreparationsfondskattekontoskuldkrisen.soporstabilitetsplanstatenstrejktidskriftertillgångartoppmötenuranval2011valutaunionervinstÖsthammar-stöd200820148.28%AETAEXAberdeen Asset ManagementAdobeAffiliatorAfghaniationAfrenAlaskaAlectaAlexandra IvanovAlgerietAnders WijkmanAndrew SmithersAnita BrodénAnn LindeAnna TrobergAntarktisArevaArjeplogArkelstenArvidsjaurAsienAspiroAtlas CopcoAtterAurelian OilAustalienAxierBABASFBBCBEL-20BPEBPT InternationalBRCBRPBahnofBancoBernadotteBidenBildtBill GrossBillerudBitGoldBjurforsBjurholmBjuvBlack Earth EastBlekingeBo EkmanBo LundgrenBo PellnäsBob PrechterBodenBorgholmBorlängeBosnien-HercegovinaBosse RingholmBotkyrkaBradford BingleyBrasilien.BrookfieldBrysselBuffetByggmaxBörje LindströmCASOCNYCairnCamecoCamilla LindbergCanplatsCapinordicCapioCarsonCatellaCecilia SkingsleyCheasapeakeChrylserCircuit CityClean Tech EastCoca-ColaColin CampbellCollertConoco-PhilipsCoskataDJIDODale DavidsonDals EdDannemoraDavid MacKayDetroitDevonDilsa Demirbag-StenDixonsDominikanska RepublikenDondald TrumpDoubleDoug NolandEDBENIEQTEbayEkornesEl-GigantenElectric GenerationElectric LineElliotvågorEnköpingEric KingEritreaEuropolitanEvergreenEworkFRAKFTSEItaliaFaradayFiatFicantieriFilm2HomeFinanspolitiska rådetFindusFingerprint CardsFirst MajesticFiskarsFrankieFärgelandaFäröarnaG3GATAGPVGWGGamesaGarnterGeitnerGenstaGetingeGibraltarGlaxo Smith KlineGlitnirGlobal Gaming FactoryGoldcorpGolden StarGordon BrownGotland.GreenspanGrilloGroupOnGrumsGrängesGällivareGävleGöran GreiderGöran SkytteGötenehusHADOPIHIKPHUFHallstahammarHammaröHang SEng.Hank PaulsenHanoiHaparandaHasselbladHembergHochbergHomemaidHoneywellHoustonHugh HendryHutchinsonHärryda.HöganäsHövdingI-landsproblemIAUIBEX-35IBMIda DrouggeIndustriarbetsgivarnaInnergexIntelJJEJan MyrdalJanet YellenJeb BushJenny WenhammarJeremy GranthamJohan ThorénJohn DeereJohn HasslerJokkmokkKPA PensionKandaKarlskronaKasparovKazakhstanKingKinnevikKirunaKivaKjell-Olof FeldtKnivstanKontigo CareKrimKristina PerssonKristinehamnKroatien och TurkietKumlaKungsörKyrguzstanKävlingeLLantmäterietLars AdaktussonLars JonungLeesonLena AnderssonLennart SchönLetlandLibanonLiberaldemokraternaLilla EdetLimits to GrowthLise NordinLjusnarsbergLloydsLouisianaköpetLovefilmLuxemburgLyckoslantenLyxfällanLöfvénM2MMSMOOMTGMag SilverMagnus RedinMalmö.MalthusMandelbrotManpowerMarie AntoinetteMarita UlvskogMariupolMaroccoMarockoMarratechMarshallhjälpenMartin BorgsMekonomenMerValMichael JacksonMichael MooreMijlöpartietMikael HolmströmMinefindersModul-1MojangMonetarMontenegroMorphicMotalaMullsjöMunkedalMunkforsMyrickMärklinMörbylångaNASDAQ-100NGMNIBENSANaturvårdsverketNet EntertainmentNetonnetNevsNexarNextoryNobiaNobinaNoraNorbergNordNordamerikaNordanstigNordic CapitalNordmark NilssonNorrköpingNorrlandNorrtäljeNorstedtsNovavaxNovo NordiskNynäshamnOKOMXS30.OSEAXOccidentalOckelboOdumOhlyOllevikOmanOrangeOrlovOrreforsPAREPMTPOMOPPIPTSPakistanParansPaulo CoelhoPayPalPemexPer GudmunssonPer SchlingmanPerstorpPeter KaplanPetroChinaPhilip BotströmPickensPlastalPooliaPotasch CorpPrebonaPremier OilPär NuderRJIRJNRPIRUTRagundaRedwood PharmaRejlersRenaultRevusRocheRoger TiefenseeRon PaulRonnebyRoosevelts New DealRoskilde BankRosneftRottnerosRörvikSSF AnytimeSIDASIPRISIXRX30SMSNLSNSSPPSalaSchermanSemconSibaSilver WheatonSilvercorpSilviaSingaporeSjöboSkaraSkinnskattebergSkistarSolarcitySolarworldSollefteåSornetteSorseleSotenäsSoundcloudSouthern PacificSpaceXSpanairSpecialfastigheterSpectacureSpykerStabilitetsrådetStatkraftStefan EdmanStefan OlssonStena RecyclingSterling AirwaysSteve KeenStockhlmStrand KapitalförvaltningSudanSun TzuSuncorSurahammarSveSven-Erik BuchtSven-Olof SällströmSverigSwecoSwedish MatchSwissquoteSydamerikaSydkoreaTOGTaiwanTanTasman MetalsTelecaTesliaTessinThomas PikettyThunder HorseTidaholmTietoEnatorTime WarnerTinkTino SanandajiTokyoTomas PousetteTorekovToshibaTractionTradedoublerTranemoTransatlanticTrelleborgTrosaTruecallerTrustbuddyTrygg-HansaTullow OilTyrénsUmeå EnergiUnionenUppvidingeVMTVRVemdalenVirginVista GoldVodafoneVäsbyVästernorrlandVästervikVästmanlandWashington MutualWazeWestinghouseWilhelm AgrellWntResearchWolfhagenXOIYamanaYdreYelpYlva JohanssonYstadZARZimbabweZyngaaakiterallergieramorteraramorteringar.aoilartieravregleringavskrivningarbankgarantibibliotekbilbilpoolerbitpopblakningboktipsbolagsskattbromsenbulshyttbutikerbönderbörsen´börsernacoalconspirecourtagecyklerddadagisdefaltiondeltagarkulturdemokratdevalveringdrakkungegoekologiekoterrorismenegifilmerfinansforumfinanskisfinanskrashfinanskrsfinaschatflashfondeföretagförtetagandegeneralstrejkgersgnällgruppdynamikguldetguldpirsguldpriserhobbyhumanhybriderhygienilver Standardinflaltionjärnkakaokalendariumkaoskappahlkollkraftkonspirationerkonsumtionkontaktannonskravmaskinkristallkulakvartalsrapportkärnkratliteraturlittearturlitteratur.lokaliseringlpslyxmarknadenmassavedmatlagermedicaremetametanhydratmifflationmilitärtmiljöteknikmotionmotorcyklarmånfärdernannollräntanonsensnödlånoffentlig konstoljanoljeoljelagerpapporpeakpeakgaspenionpersonaluthyrningpiratkopieringpoliticpollprivatpysselrantarantorrearecesionresiliensrikspuckorättelseråvaorsamhällesavings-and-loankrisen (90-talets början)sexpartisverigeskuldbubblqnskuldkostnadsindexslamsloseriombudsmannensocialt arbitragespannmålspararespekulanterspråkstekarestädersurvivalismensvenskatebladtelekompaketettextilkrisentramtrastullentygpåsartågundersökningaruppsägningarvalet2014veckansfrågavinEmmavon ClausewitzÄlvkarlebyÄngelholmÅreÅrseleÖhmanÖlandÖstergötlandädelmetallerär eövningsuppgiftCornucopia?Evig tillväxt i en ändlig värld?http://cornucopia.cornubot.se/noreply@blogger.com (Cornucopia?)Blogger12026125tag:blogger.com,1999:blog-8354057230547055221.post-2490656752632862163Sun, 05 Mar 2017 13:34:00 +00002017-03-05T14:35:26.899+01:00börsenkonjunkturOMXS30teknisk analysTredje månaden med överhettad svensk ekonomi - tydlig säljsignal för börsenFör tredje månaden på raken ligger Konjunkturinsitutets barometerindikator ("konjunkturbarometern") kvar i överhettat läge. Det råder alltså en klart och tydligt långsiktig säljsignal i enlighet med konjunkturmodellen.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-hD_mqKJx-XY/WLwTIKSEt6I/AAAAAAAAqfI/sztWEjwSYAoN22y_YfnZ-yotKjQsypZHACLcB/s1600/konj.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="396" src="https://1.bp.blogspot.com/-hD_mqKJx-XY/WLwTIKSEt6I/AAAAAAAAqfI/sztWEjwSYAoN22y_YfnZ-yotKjQsypZHACLcB/s640/konj.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">OMXS30 i rött, konjunkturbarometern i rött.</td></tr></tbody></table><a name='more'></a>Börsen är nu dessutom på en lokal topp vilket bara stärker att det är dags att gå ur. Det finns kanske lite uppsida till, men framöver är det försämrad konjunktur som gäller, <i>inklusive i alla prognoser</i>, och med det kommer den överhettade svenska ekonomin vika.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-ecacsrU5mMk/WLwTeQunSjI/AAAAAAAAqfM/ogJP-hDTJbQxMQ3aSXB8sncCIL5U8FRkgCLcB/s1600/omxs30.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="396" src="https://1.bp.blogspot.com/-ecacsrU5mMk/WLwTeQunSjI/AAAAAAAAqfM/ogJP-hDTJbQxMQ3aSXB8sncCIL5U8FRkgCLcB/s640/omxs30.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Dagschart OMXS30.</td></tr></tbody></table>Värt att notera är att börsen antagligen inte kommer vända ner <i>nu</i>. Men går man ur på grund av konjunkturläget och inväntar att det är mörkt, armod, varnagel och tandagnisslan land och rike runt så kommer man vinna på det. Endast den oerfarne försöker pricka börstoppen exakt.<br /><div><br /></div><div>Ännu en indikator är att allmänheten tydligen rusar in i aktiefonder just nu. Kort sagt säljer de lite kunnigare institutionella investerarna och allmänheten får i sedvanlig ordning sitta med Svarte Petter.<br /><br /><i>När alla är överpositiva är det dags att sälja. Svårare än så är det inte.</i></div>http://cornucopia.cornubot.se/2017/03/tredje-manaden-med-overhettad-svensk.htmlnoreply@blogger.com (Cornucopia?)0tag:blogger.com,1999:blog-8354057230547055221.post-3344699881755828202Sat, 04 Mar 2017 15:01:00 +00002017-03-04T16:19:55.914+01:00Andra världskrigetArgentinaEgyptenFinlandFrankrikeförsvarhistoriaIsraelRysslandStorbritannienTysklandvärnpliktenNumerär är inte allt i strid Det svenska försvaret kritiseras ofta för att ha för <i>låga siffror</i>, för liten numerär<i>. </i>Men all erfarenhet visar att en numerärt underlägsen sida kan besegra en överlägsen motståndare. Avgörande är faktorer som kompetens, övning, utbildning, teknologi, stridsvilja och kanske framför allt <i>ledarskap</i> och <i>krigskonst</i>.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-zWcUDCjBsYo/WLqeYLz3vvI/AAAAAAAAqec/BvUTpLG55d8dULvPcMZW7oATgyX2UBtqACLcB/s1600/US_Navy_030402-N-5362A-004_U.S._Army_Sgt._Mark_Phiffer_stands_guard_duty_near_a_burning_oil_well_in_the_Rumaylah_Oil_Fields_in_Southern_Iraq.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="420" src="https://1.bp.blogspot.com/-zWcUDCjBsYo/WLqeYLz3vvI/AAAAAAAAqec/BvUTpLG55d8dULvPcMZW7oATgyX2UBtqACLcB/s640/US_Navy_030402-N-5362A-004_U.S._Army_Sgt._Mark_Phiffer_stands_guard_duty_near_a_burning_oil_well_in_the_Rumaylah_Oil_Fields_in_Southern_Iraq.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Från <i>Operation Iraqi Freedom</i> under Irakkriget 2003.</td></tr></tbody></table><a name='more'></a><div>Det brukar sägas att en angripare behöver vara <i>minst</i> tre gånger så stark som försvararen, men motexemplen på detta genom världshistorien är väldigt många. Jag kommer här fokusera på någorlunda modern tid för någraexempel.</div><div><br /></div><div>Avgörande är inte numerären. Numerärt överlägsna värnpliktiga kan besegras i grunden av yrkessoldater, trots att de värnpliktiga har haft månader på sig att genomföra fältarbeten och försvarar sig. <i>Utbildning, övning och stridsvilja</i> - <i>kompetens</i> - är tillsammans med <i>ledarskap</i> och <i>krigskonst </i>ofta avgörande.</div><div><br /></div><div>En numerärt underlägsen styrka kan fortfarande segra, även om man anfaller. Man måste exempelvis inte anfalla överallt samtidigt och det är styrkeförhållandena <i>där man faktiskt strider</i> som är avgörande. En angripare har fördelen att <i>välja sina strider</i>, dvs var man anfaller. Man ska anfalla där motståndaren är som svagast och inget annat, samt kan med små medel binda upp motståndarens större styrkor på annan plats. Något von Clausewitz hustru publicerade i hans bok <i>Om kriget</i> redan år 1832.<br /><blockquote class="tr_bq"><i>”Allmänna principer för offensiv. För en attack måste man välja en punkt i fiendens position och anfalla den med överlägsen styrka, lämnandes hans övriga styrkor i osäkerhet men uppbundna. Detta är det enda sätt man kan använda en likvärdig eller svagare styrka med övertag och därmed med en chans att lyckas. Desto svagare man är, desto färre trupper skall användas för att binda upp fienden på icke avgörande platser, för att vara så stark som möjligt där avgörandet skall ske.” - </i>Carl von Clausewitz, <i>Om kriget</i>, 1832<i> - </i>min egen översättning från <a href="http://clk.tradedoubler.com/click?p=21&a=1559424&g=16159304&url=http://www.adlibris.com/se/bok/midvintermorker-9789174752007"><i>Midvintermörker</i></a>, kapitel <i>Valdemar Atterdag.</i></blockquote><b>Man anfaller givetvis inte om man inte anser sig kunna vinna - det är den offensiva sidans fördel och initiativförmåga. Anfallaren väljer sina strider, det gör inte den som försvarar. Detta innebär att den som inleder en konflikt och angrepp oftast, åtminstone initialt, segrar och når sina mål - <i>annars hade man inte valt att anfalla.</i></b></div><div><div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: -webkit-standard; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"></div><br /><div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: -webkit-standard; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><div style="margin: 0px;">Låt oss titta på några exempel. Alla siffror är från Wikipedia.</div></div><br /></div><div>Ett exempel är förstås Falklandskriget, där man i liten skala kan titta på <i>slaget vid Goose Green</i>.</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-jXVp5L9nisY/WLqfzSJLNDI/AAAAAAAAqeo/4w3Lf5OobSIbZ27HFzBMMxPjnAUiSnFZQCLcB/s1600/The_Falklands_Conflict%252C_April_-_June_1982_FKD267.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="444" src="https://4.bp.blogspot.com/-jXVp5L9nisY/WLqfzSJLNDI/AAAAAAAAqeo/4w3Lf5OobSIbZ27HFzBMMxPjnAUiSnFZQCLcB/s640/The_Falklands_Conflict%252C_April_-_June_1982_FKD267.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Juliet-kompaniet vid 42 Commando, Royal Marines anländer till Goose Green i slagets slutfas.</td></tr></tbody></table><div>De värnpliktiga argentinarna hade i flera månader ockuperat Falklandsöarna och kunnat gräva ner sig i sina försvarsställningar.<br /><br />Vid Darwin och Goose Green genomförde brittiska fallskärmsjägare ett frontalanfall <i>till fots</i> mot de nedgrävda argentinarna. Britterna var 690 man, men argentinarna var numerärt överlägsna med mellan 896 och 1083 man, de flesta värnpliktiga. Arton britter dödades och mellan 45 och 55 argentinare miste livet. I slutändan tillfångatogs 961 argentinare när de efter ett knappt dygns strider gav upp inför den numerärt underlägsna brittiska styrkan.<br /><br />Goose Green visar i sig ensamt det mesta kring numerär kontra kompetens och ledarskap. Visserligen dödades den ursprungliga brittiska befälhavaren, när han själv ledde ett anfall mot ett argentiskt kulsprutenäste, och ersättarens <i>uppdragstaktik</i> sägs av en del varit avgörande för utfallet av slaget.<br /><br />Då anföll ändå britterna baserat på ett felaktigt underrättelseläge och trodde att den försvarande styrkan var avsevärt mindre. Men man kunde anpassa sig och via överlägsen kompetens, stridsvilja och ledarskap nedkämpa en numerärt överlägsen motståndare.<br /><br /><b>Vad gäller Falklandskriget, så utspelade det sig som bekant på ett avsevärt avstånd från Brittiska Öarna. Britterna var alltså övertygade om att de kunde besegra de argentinska värnpliktiga ockupanterna med relativt små brittiska styrkor.</b><br /><br />Vill man titta på lite större konflikter så ser man att anfallssidan ingalunda måste vara överlägsen numerärt, utan att det är andra faktorer som avgör.<br /><br />Irakkriget 2003 hade den angripande amerikanska sidan 380 000 man, varav 192 000 amerikaner. Då ska man ha i minnet att det går någonstans mellan 5-10 amerikanska soldater på <i>funktionsförband</i> per soldat på ett <i>manöverförband</i> och antalet faktiskt stridande amerikaner var betydligt färre. Irak hade 1 142 000 man. Här besegrade angriparen en numerärt tre gånger så stor styrka. Inte tvärt om - att försvararen kan besegra en tre gånger så stark angripare. <b>Även här var man helt övertygade om att man trots dålig numerär med lätthet kunde besegra en numerärt överlägsen motståndare på andra sidan jordklotet.</b><br /><br />I finska fortsättningskriget fick 750 000 finnar och tyskar 650 000 ryssar på reträtt. Visserligen var den finska sidan numerärt marginellt överlägsen, men inte de klassiska tre gånger försvararna, som när 250 000 - 300 000 finnar stoppade det sovjetiska anfallet i Vinterkriget 39-40. Där hade angripande Sovjetunionen en styrka på en miljon man.<br /><br />Under sexdagarskriget 1967 besegrade 264 000 israeler 567 000 egyptier, jordanier och syrier i ett anfall där man erövrade hela Sinai-halvön plus Golanhöjderna och Västbanken. Försvararna var nästan tre gånger så många som angriparna, men det hela var en massiv förlust för framför allt Egypten. Mätt i antalet dödade så dödades upp till 20 gånger så många försvarare som angripare (ca 18 500 kontra 776 - 983 israeler).<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-2vR8CuiRRgw/WLqliGAJE1I/AAAAAAAAqe4/X6kK9Ni7B10xUQLhZz8-a1BUIuv0Fi_BQCLcB/s1600/Bundesarchiv_Bild_146-1972-045-08%252C_Westfeldzug%252C_Rommel_bei_Besprechung_mit_Offizieren.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="426" src="https://3.bp.blogspot.com/-2vR8CuiRRgw/WLqliGAJE1I/AAAAAAAAqe4/X6kK9Ni7B10xUQLhZz8-a1BUIuv0Fi_BQCLcB/s640/Bundesarchiv_Bild_146-1972-045-08%252C_Westfeldzug%252C_Rommel_bei_Besprechung_mit_Offizieren.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Ordergivning med Rommel och <i>spökdivisionen</i>. Det som kan kallas <i>uppdragstaktik</i> tillämpades och Rommel struntade i order från högre ort, utan anpassade sig till läget och tog eget initiativ för att lösa det övergripande uppdraget att besegra motståndaren. Hans pansardivision fick öknamnet <i>spökdivisionen</i>, för att de ryckte fram så fort och långt att de inte längre var i radiokontakt med den tyska ledningen. Rommels och kollegans Guderians <i>initiativförmåga</i> och <i>ledarskap</i> gjorde tillsammans med <i>uppdragstaktik</i> att man fullständigt krossade motståndaren genom att skära de allierades styrkor i två och ringa in bland annat hela brittiska armén, som i princip helt utplånades som stridande förband i samband med evakueringen vid Dunqerque.</td></tr></tbody></table>Vid slaget om Frankrike under andra världskriget 1940 var de angripande tyskarna numerärt jämlika, med 3 300 000 man mot de allierades 3 350 000, men underlägsna numerärt i såväl stridsvagnar och artilleri. Även tekniskt var t ex franska <i>Char B1 bis</i>-stridsvagnen helt överlägsen tyska stridsvagnar i duellsituationer. Men tyskarna valde förstås inte att genomföra sitt huvudanfall där motståndaren var som starkast längs Maginotlinjen (även om man anföll även där för att hålla fransmännen uppbundna - se von Clausewitz ovan). Det tål att upprepas att <i>den som anfaller väljer tid och plats</i>. Likt sexdagarskriget var de allierades förluster mångfaldigt större än de angripande tyskarnas. Ironiskt nog sägs den stridsvagns- och flygbaserade <i>blitzkrieg-</i>tanken varit den franske generalen de Gaulles idé, publicerad 1933, och ska ha inspirera tyske Guderian. Överlägsna teorier är en sak, men det gäller att också få gehör för den och att sedan <i>genomföra</i>.<br /><br /><b>Poängen är att <i>anfallaren väljer sina strider</i> och <i>Sverige måste ha en offensiv förmåga för att anfalla en angripare på vårt eget territorium, </i>samt <i>vältränade och övade förband som är självsäkra nog att ta egna initiativ</i> som en del av landets försvar. Att enbart förlita sig på att <i>värnplikt</i> skulle lösa något är inte bara naivt, det är fördummande.</b><br /><b><br /></b> Det svenska försvarets personal har aldrig varit så bra som den är idag, eftersom vi har yrkessoldater, varav många nu har flera års träning och utbildning, samt många som deltagit i skarpa insatser utomlands. Luckorna i rekryteringen kanske kan fyllas upp med värnpliktiga, men låt oss hoppas att kärnan av yrkesförband kommer bibehållas.<br /><br />Annars kan det i värsta fall gå som vid Goose Green. Oavsett hur bra vi är på att gräva ståvärn så angriparen kan välja att anfalla någon annanstans.<br /><br /><b>Ett anfall mot svenskt territorium kommer bara ske om angriparen är övertygad om att han kommer segra. Ett starkt försvar är därför krigsavhållande. Ett anfall mot Sverige kommer alltid ske där vi är svaga, och det är därför vara nödvändigt att kunna genomföra offensiva insatser mot angriparen i efterhand - vi kommer aldrig kunna försvara hela landets yta mot hypotetiska angrepp.</b><br /><br /><i>Sedan ska man vara medveten om att vår enda möjliga angripare - <b>Ryssland - har riktigt usla värnpliktiga soldater</b>. Riktigt kukiga<sup>1.</sup> faktiskt. Även deras elitförband har under striderna i sydöstra Ukraina och i Syrien visat sig vara ganska kassa även mot Call of Duty-spelande krigsturister och <a href="http://cornucopia.cornubot.se/2016/12/ryssland-utrustar-is-med-vapen.html">förlorade t ex Palmyra och massiva mängder utrustning så fort IS visade lite stridsvilja</a>, även om de kanske är bättre än svenskt hemvärn. Det är också högst tveksamt hur det står till med moral och motivation hos de breda massorna av värnpliktigt rekryterade soldater i den ryska försvarsmakten. <b>Det ryska värnplikts- och militära utbildningsystemet bygger på grupptryck och pennalism, och största risken att dödas som rysk soldat är genom misshandel av sina kamrater och befäl</b>. Visserligen lär sig alltså ryska värnpliktiga att döda, men det handlar om att döda varandra. Mörkertalet är stort men det kan handla om något tusental om året, vilket förstås kallas "olyckor". På högre nivå är ryssarna kompetenta, om än hierarkiska och med dålig känsla för uppdragstaktik och eget initiativ, men i slutändan är det alltid en soldat som måste genomföra. Det finns otaliga redogörelser från sydöstra Ukraina om hur ryska soldater blir helt passiva utan ledning och i princip kan nedkämpas utan att de ens skjuter tillbaka, då de bara hänger och väntar på att någon ska säga till dem att skjuta tillbaka. Den ryska mentaliteten, inte bara i det militära, är att om man inte gör något så har man inte heller gjort något fel.</i><br /><i><br /></i> <i><b>Enbart januari-februari i år har 101 ryssar sökt asyl i Sverige, enligt uppgifter till bloggen mestadels deserterade ryska värnpliktiga, som inte vill riskera att dödas av sina befäl eller kamrater under utbildningen eller senare i sydöstra Ukraina. Siffran är upp från 61 under samma period förra året. 101 på två månader ska också jämföras med 401 asylsökande från Ryssland under hela förra året. Moralen och viljan att dö för sin diktatur och fader Putin hos ryska värnpliktiga lämnar en hel del att önska.</b></i><br /><i><b><br /></b></i> <i>Dock har <a href="http://24-my.info/the-russian-army-is-preparing-for-a-grand-funeral-the-military-buys-a-huge-amount-of-flags-of-the-russian-federation-for-the-decoration-of-coffins/">ryska armén nu beställt 49 000 ryska flaggor</a> som ska användas som svepningar av kistor. Man förbereder sig på massiva förluster, väl medvetna om att det enda man har att komma med är en kötttsunami och en sådan kostar i egna liv.</i><br /><i><br /></i><sup>1. Kuk är på rysk slang (<i>mat</i>) negativt, fitta är positivt. Att vara kukig är att vara dålig, att vara fittig är bra.</sup></div>http://cornucopia.cornubot.se/2017/03/numerar-ar-inte-allt-i-strid.htmlnoreply@blogger.com (Cornucopia?)47tag:blogger.com,1999:blog-8354057230547055221.post-781063288764157469Sat, 04 Mar 2017 13:15:00 +00002017-03-04T14:15:04.719+01:00journalistikmediaMSBpolitiksjukvårdvetenskapEndast vetenskapliga rapporter ska beaktas - Ilmar Reepalus vinstrapport kan alltså kasserasDet senaste i Sverige är att endast vetenskapliga rapporter ska beaktas. Det betyder att alla statliga utredningar, rapporter från politiska partier och all journalistik kan kasseras, då dessa inte är vetenskapligt. Det betyder också att Ilmar Reepalus rapport om förbud mot vinster inom välfärdsföretag kan kasseras. Den är nämligen inte vetenskaplig.<br /><div><a name='more'></a><br /></div><div>Grunden är att Myndigheten för samhällsskydd och beredskap gav <a href="http://www.svt.se/nyheter/inrikes/rapportforfattaren-pierre-durrani-var-med-i-muslimska-brodraskapet">muslimen och tidigare medlemmen i Muslimska brödraskapet, fil kand Pierre Durrani</a>, och terrorismforskaren dr Magnus Norell i uppdrag att göra en förstudie kring det av flera muslimska länder (inklusive av Ryssland, som bekant ett land med tiotalet miljoner muslimer) terroriststämplade så kallade Muslimska Brödraskapet. Rapporten har fått kritik av diverse islamister, samt akademiker, för att <i>inte vara vetenskaplig</i>. Norell har bemött kritiken genom att undra vad kritikerna rökt innan de läst rapporten och att alla svar på deras kritik står i rapporten (vilket väcker lite frågor om de alls har läst).</div><div><br /></div><div>MSB påtalar dock att <a href="https://www.msb.se/sv/Om-MSB/Nyheter-och-press/Nyheter/Nyheter-fran-MSB/MSB-om-forstudien-Muslimska-brodraskapet-i-Sverige/">rapporten är en <i>förstudie</i> och inte var avsedd att vara vetenskaplig</a>.</div><div><br /></div><div>Gott så.</div><div><br /></div><div><b>Eftersom nu endast vetenskapliga rapporter ska beaktas kan vi härmed strunta i all journalistik, alla statliga utredningar, alla rapporter från politiska partier och tankesmedjor. Dessa är nämligen inte <i>vetenskap</i>. Dit räknas t ex Ilmar Reepalus utredning om förbud mot vinster i välfärden.</b></div><div><b><br /></b></div><div>Det är förstås ett mycket positivt och välkommet besked att vi kan kassera alla politiska rapporter på grund av deras ovetenskaplighet.</div><div><br /></div><div>Därmed är hela frågan om vinster i välfärden avgjord. </div><div><br /></div><div>Man kan förstås också bortse från <a href="https://www.mynewsdesk.com/se/vardforetagarna/documents/patienttoppen-2016-59743">rapporten <i>Patienttoppen 2016</i>, där 1 148 vårdcentraler betygssats av 109 065 personer</a>. Den visar ju annars att 16 av de 20 bästa vårdcentralerna (enligt patienterna) är privata och att den bästa vårdcentralen i 16 av landets 21 regioner drivs privat.</div><div><br /></div><div>Men som sagt, inte vetenskapligt - <i>var är kontrollgrupperna till de 109 065 respondenterna - var är den vetenskapligt granskade publikationen -</i> så vi kan bortse även från den.</div><div><br /></div><div><b>Så kom ihåg att nästa gång någon politiker uttalar sig eller presenterar något, säg "<i>inte vetenskapligt"</i> så kan man direkt avfärda det hela.</b></div>http://cornucopia.cornubot.se/2017/03/endast-vetenskapliga-rapporter-ska.htmlnoreply@blogger.com (Cornucopia?)13tag:blogger.com,1999:blog-8354057230547055221.post-7841582487980941818Sat, 04 Mar 2017 08:10:00 +00002017-03-04T09:59:38.830+01:00humanekologivattenÖrebroVattenbrist i Örebro - kan inte hantera befolkningstillväxtenSedan i höstas råder det vattenbrist i Örebro kommun. Kommunen klarar inte av befolkningstillväxten och dränerar sjöarna man har som vattentäkter. Man uppmanar att spara på vattnet och väntas införa bevattningsförbud (på vintern...). Ändå vill kommunen växa.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td><a href="https://4.bp.blogspot.com/-4X8kttPIPBo/WLpyltMx0-I/AAAAAAAAqeA/08h9Cj5PLaI1FQTvSiKL-ZQZ4e_2W3HwgCLcB/s1600/orebro_fors.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://4.bp.blogspot.com/-4X8kttPIPBo/WLpyltMx0-I/AAAAAAAAqeA/08h9Cj5PLaI1FQTvSiKL-ZQZ4e_2W3HwgCLcB/s640/orebro_fors.JPG" width="640" /></a></td></tr><tr><td class="tr-caption" style="font-size: 12.800000190734863px;">Svartån genom Örebro för ett år sedan.</td></tr></tbody></table><a name='more'></a>Som exempel på desperationen är nu vattenståndet mycket lågt i sjöarna Ölen, Storbrjödekn och Toften, som har avrinning till Svartån, som är kommunens vattentäkt. Dräneringen kommer fortsätta och kommunen lutar sig mot en vattendom från 1600-talet, där den fyra meter djupa sjön Ölen tillåts sänkas med 2.6 meter, dvs till 1.4 meters djup.<br /><br />Nerikes Allehandla skriver om det hela (offline).<br /><br />Kommunens VA-chef varnade redan i november och i december gick kommunen ut med uppmaning till Örebroarna att spara på vattnet.<br /><blockquote class="tr_bq"><i>"I mitten av december sänktes den reda låga sjön Ölen ytterligare en halvmeter, ett medvetet beslut av Örebro kommun. Efter nyår ströps flödet i Svartån ännu mer för att behålla vatten i sjöarna, så vattenförsörjningen är säkrad ytterligare en tid."</i></blockquote>Man förväntar sig nu att Örebro kommun ska införa ett <i>bevattningsförbud mitt i vintern</i>, men beslutet är inte taget än.<br /><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-_wE5tWKleQw/WLp1BgSYxRI/AAAAAAAAqeM/RBeHiyCFD5IEYIFLKhH_W92Ln0OXyce5wCLcB/s1600/orebro.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="171" src="https://1.bp.blogspot.com/-_wE5tWKleQw/WLp1BgSYxRI/AAAAAAAAqeM/RBeHiyCFD5IEYIFLKhH_W92Ln0OXyce5wCLcB/s200/orebro.png" width="200" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Folkmängden i Örebro. Källa: SCB.</td></tr></tbody></table><br />Problemet är att Örebro kommun växer, i den eviga myten om att <i>fler människor är bra och lönsamt</i>. <a href="http://cornucopia.cornubot.se/2017/01/det-finns-ingen-fordel-med-att-bli-fler.html">I verkligheten finns det inga fördelar med att bli fler. Fler personer innebär linjärt mer utgifter inom välfärd</a> där det också saknas skalningsfördelar.<br /><blockquote class="tr_bq"><i>"Speciellt infrastrukturen är till stora delar betald sedan tidigare och därmed mycket billig i drift, liksom tidigare byggda sjukhus, skolor, vårdcentraler och dagis. När detta måste byggas ut blir det dyrt, även om man bokföringsmässigt kan trixa till det.<br />En ökande befolkning är inga supermänniskor som är friska och inte behöver utbildning. Och inom välfärdstjänster finns inga nämnvärda skalfördelar. [...]<br />Pratet om större befolkning skulle rädda ekonomin baserar sig på att man medvetet försämrar välfärden genom att inte skala upp den och hoppas att folket inte ska märka något." - </i>jag</blockquote>Tvärt om råkar man istället ut för kraftigt höjda investeringskrav och naturgivna begränsningar, likt tillgången på vatten.<br /><br />Örebro kommun är landets sjunde mest folkrika kommun. Sedan år 2000 har kommunen ökat med 18% i befolkning, men mängden vatten är förstås konstant. Naturligtvis har inte ökade intäkter från stigande befolkning lagts på att bygga ut vattenförsörjningen. Om det alls är möjligt att få några ytterligare vattendomar - Örebro ligger som bekant i ett jordbrukslandskap.<br /><br /><b>Normalt kanske Örebro klarar sig, men det räcker alltså att det sägs varit dåligt med nederbörd en sommar för att Sveriges sjunde största kommun ska få problem med vattenförsörjningen till vardags.</b><br /><b><br /></b> Nu återstår att se när och om förbudet mot bevattning tas under senvintern i Sveriges sjunde största kommun. I ett av de länder i världen med bäst tillgång till vatten.<br /><br />Sveriges VA-intrastruktur är enormt eftersatt och vi lever på forna investeringar. Ersättningstakten är i storleksordningen 300 år. Det är dock en annan fråga än själva tillgången till vatten. Men även denna är med sina vattendomar dimensionerad för gamla Folkhemssverige med mindre än åtta miljoner invånare. Eller för den delen domar från 1600-talet.<br /><br /><i>Man ska också komma ihåg att det kommunala utjämningssystemet gör att en kommun inte får några vinster på att öka sin befolkning och kommunalskatt - moms, företagsskatter etc går till staten och ökade kommunala skatteintäkter försvinner in i utjämningssystemet. För övrigt samma anledning som gör att Karlshamns kommun inte kommer tjäna något på sina silverpenningar för Nordstream 2 - fler i jobb i kommunen ger inte ökade intäkter när den kommunala utjämningen gjort sitt.</i><br /><div style="text-align: justify;"></div>http://cornucopia.cornubot.se/2017/03/vattenbrist-i-orebro-kan-inte-hantera.htmlnoreply@blogger.com (Cornucopia?)64tag:blogger.com,1999:blog-8354057230547055221.post-9203478174899567827Fri, 03 Mar 2017 13:53:00 +00002017-03-03T15:09:05.223+01:00tramsFredagsmys: Läser du den här bloggen - du kan vara ett geni!Dags för lite härligt fredagsmys, och denna gång blir det återkoppling på <a href="http://cornucopia.cornubot.se/2017/02/vad-har-du-for-iq.html">senaste enkäten</a>, där 945 av bloggens veckoliga 50 000 - 70 000 läsare gjorde seriösare IQ-test och rapporterade sina resultat. Slutsatsen måste var att <i>om du läser den här bloggen kan du vara ett geni</i>. Eller kraftigt begåvningsbegränsad.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-d-FIls8axyA/WLlxec37a3I/AAAAAAAAqdk/zqoqND9bmtAlzjIFItShl-dAfMNA1puIwCLcB/s1600/iq.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="574" src="https://2.bp.blogspot.com/-d-FIls8axyA/WLlxec37a3I/AAAAAAAAqdk/zqoqND9bmtAlzjIFItShl-dAfMNA1puIwCLcB/s640/iq.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Bloggläsarnas IQ enligt Wechslerskalan, samt allmänhetens fördelning.</td></tr></tbody></table><a name='more'></a>Som synes ovan är bloggens läsare överbegåvade, dvs betydligt mer begåvade än normalt. Endast 13.68% av bloggläsarna är normalbegåvade eller under normalbegåvade, vilket innebär att 86.32% av bloggläsarna är överbegåvade.<br /><div><br /></div><div>Därtill tillhör hela 19.17% den procent av svenskarna som har högst IQ, <i>och kan var genier</i>. Helt fantastiskt. Om du läser det här blogginlägget har du alltså nästan en chans på fem att vara bland den mest intelligenta procenten i Sverige.</div><div><br /></div><div>Dock finns det en viss överrisk att man är <i>kraftigt begåvningsbegränsad</i>, eller som det hette förr - <i>förståndshandikappad</i>. Alltså tillhör de 2% av svenskarna som har lägst IQ. Dock föreslog jag ju att de som röstar på SD med fördel kunde välja 69 eller lägre om de inte orkade göra ett lite seriösare IQ-test, <a href="http://cornucopia.cornubot.se/2017/02/tino-sanandaji-upprepar-sdare-har-lagt.html">vilket kan förklara överrepresenationen av <i>kraftigt begåvningsbegränsade</i></a>.</div><div><br /></div><div>Sedan skulle det kunna vara så att läsarna <a href="http://cornucopia.cornubot.se/2017/02/vad-har-du-for-iq.html">trots uttrycklig uppmaning</a> har rapporterat sin IQ enligt Catellskalan och att siffrorna ovan därmed inte helt stämmer med verkligheten. Inte så begåvat att inte kunna ta till sig enkla instruktioner dock. Likväl så ligger överbegåvningen kvar även med Catell, då normalbegåvning även i den skalan ligger runt 100.</div><div><br /></div><div><i>Eller så är personer som har hög intelligens mer benägna att göra IQ-tester, så de kan lämna svar på en sådan här enkät...</i></div><div><br /></div><div>Men som fredagsmys tar vi alla med oss att bloggläsarna uppenbarligen är <i>skitsmarta</i>. Förklarar varför jag har en begränsad läsekrets. Majoriteten (67.26%) av läsarna säger sig tillhöra de 9% smartaste i Sverige, och om det är vad jag tilltalar med mina skriverier så blir det förstås svårt att nå ut till de breda lagren.</div><div><br /></div><div>Så trevligt fredagsmys på er! </div><div><br /></div><div><i>Vilket tal följer på denna talserie: 1 16 35 54 73</i></div>http://cornucopia.cornubot.se/2017/03/fredagsmys-laser-du-den-har-bloggen-du.htmlnoreply@blogger.com (Cornucopia?)66tag:blogger.com,1999:blog-8354057230547055221.post-1287963908043040379Fri, 03 Mar 2017 11:50:00 +00002017-03-03T12:50:51.917+01:00bostadbostadbubblancrowdfundingfastigheterKameoNorgereklamÄr det smart att investera i två fastighetsmarknader?<i>Detta inlägg är sponsrat av <a href="https://www.kameo.se/">Kameo</a>.</i><br /><i><br /></i>Det finns stora skillnader mellan bostadsmarknaderna i Sverige och Norge enligt Kameo, som erbjuder investerare att till hög ränta finansiera bostadsprojekt i de två grannländerna. Man har just nu <a href="https://www.kameo.se/Marknadsplats/9-5-raenta.-Vi-finansierar-byggnation-av-tvaa-bostadsfastigheter-tillsammans">ett projekt i Oslo till 9.5% ränta</a> och ett <a href="https://www.kameo.se/Marknadsplats/7-raenta-Vi-finansierar-renoveringen-av-en-fastighet-i-Goeteborg-tillsammans">projekt i Göteborg till 7.0% ränta</a>. Samtidigt har nu utvandringsvågen från Sverige till Norge vänt och Sverige ser ut att få nettoinvandring av svenskar från Norge för första gången sedan början av 2000-talet.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-fv30XILxjoU/WLlR6Zs-MMI/AAAAAAAAqdU/lLmmoNGKYnw_BdoOEKgPnxoazbKUygaogCLcB/s1600/IMG_1362.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://1.bp.blogspot.com/-fv30XILxjoU/WLlR6Zs-MMI/AAAAAAAAqdU/lLmmoNGKYnw_BdoOEKgPnxoazbKUygaogCLcB/s640/IMG_1362.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Oslo från Holmenkollen.</td></tr></tbody></table><br /><a name='more'></a>Som jag skrivit om tidigare är Norges bostadsmarknad i stort sett <i>fungerande</i>, till skillnad mot den svenska.<br /><br />En avgörande skillnad är att man i Norge <i>äger sin lägenhet</i>, medan svenskarna via bostadsrätter bara äger <i>rätten att bo</i>. Det betyder att norrmännen fritt kan hyra ut sina lägenheter, vilket leder till en fungerande bostadsmarknad med tusentals konkurrerande hyresvärdar istället för enstaka lokala kommunalt ägda oligopol som i Sverige.<br /><br />Både bostadsmarknaden i Norge och Sverige är dock heta, även om det är billigare med bostäder i Oslo än i Stockholm. Bidragande orsaker är enligt Kameo bostadsbristen, samt skattefördelar med bostadsägande. Snittpriser i Stockholm på ca 94 000:- SEK per m2 är högre än de motsvarande 75 000:- SEK per m2 som gäller i Oslo.<br /><br />Bostadspriserna stiger just nu snabbare i Norge än i Sverige, vilket förstås leder till att det byggs mer. Här kommer Kameo in och kan finansiera de topplån, som bankerna kräver egen finansiering på, eller för den delen hela projekt via sin <i>crowdfunding.</i><br /><br />Svenskar börjar nu flytta tillbaka från Norge <a href="http://e24.no/jobb/arbeidsliv/naa-reiser-svenskene-hjem/23663959">rapporterar norska E24</a>, och för första gångens sedan början av 2000-talet flyttar fler svenskar från Norge än till.<br /><br />Kameo lanserar snart en plattform för både svenska och norska fastighetslån, men man kan alltså redan idag vara med och <a href="https://www.kameo.se/Marknadsplats/9-5-raenta.-Vi-finansierar-byggnation-av-tvaa-bostadsfastigheter-tillsammans">till en ränta på 9.5% vara med och finansiera norska bostadsprojekt</a>. Det kommer framöver bli betydligt fler projekt att investera och beroende på riskprofil kommer man alltså kunna välja mellan Sverige eller Norge. Föredrar man Sverige finns <a href="https://www.kameo.se/Marknadsplats/7-raenta-Vi-finansierar-renoveringen-av-en-fastighet-i-Goeteborg-tillsammans">ett projekt i Göteborg med 7.0% i ränta</a>.<br /><joakim proad.se=""><lars wilderang.se=""><vanja kameo.se=""><br /></vanja></lars></joakim><joakim proad.se=""><lars wilderang.se=""><vanja kameo.se="">Det finns förstås de sedvanliga riskerna med denna typ av investeringar. Med investeringar i Norge tillkommer valutarisken, men på medellång till lång sikt är NOK och SEK stabila mot varandra, eller det som Kameos Sebastian Harung kallar <i>skandinaviska kronor.</i></vanja></lars></joakim><br /><joakim proad.se=""><lars wilderang.se=""><vanja kameo.se=""><i><br /></i></vanja></lars></joakim><a href="http://blogg.kameo.se/stockholm-vs-oslo-vilken-bostadsmarknad-ar-hetast/">Ni kan läsa mer om en jämförelse mellan den norska och svenska bostadsmarknaden på Kameos blogg</a>.<br /><joakim proad.se=""><lars wilderang.se=""><vanja kameo.se=""> </vanja></lars></joakim><br /><joakim proad.se=""><lars wilderang.se=""><vanja kameo.se=""><i>Detta inlägg är sponsrat av <a href="https://www.kameo.se/">Kameo</a>.</i></vanja></lars></joakim><br /><joakim proad.se=""><lars wilderang.se=""><vanja kameo.se=""><br /></vanja></lars></joakim>http://cornucopia.cornubot.se/2017/03/ar-det-smart-att-investera-i-tva.htmlnoreply@blogger.com (Cornucopia?)10tag:blogger.com,1999:blog-8354057230547055221.post-5926830160295157511Fri, 03 Mar 2017 09:33:00 +00002017-03-03T10:33:12.492+01:00bredbandförsvarinfrastrukturIT-branschenmobiltelefoniNorgetelefoniNorska PTS rekommenderar 700 Mhz-bandet till kommersiella aktörer - med rätt för krisbrukNorges motsvarighet till PTS rekommenderar likt svenske Patrik Fältström att 700 Mhz-bandet går till civila mobiloperatörer. Dessa ska dock ge kris- och beredskapsmyndigheter möjlighet att bruka samtliga nät. Ett eget nät kostar åtta gånger så mycket som att nyttja fyra kommersiella nät med bättre redundans och täckning.<br /><div style="text-align: justify;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-BOb04MMlud4/WLkk776n1tI/AAAAAAAAqdA/BL2DNlmLlvYOafUwGZ-NrmNdVzvD98j7QCLcB/s1600/norge_oslo_radhus.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://1.bp.blogspot.com/-BOb04MMlud4/WLkk776n1tI/AAAAAAAAqdA/BL2DNlmLlvYOafUwGZ-NrmNdVzvD98j7QCLcB/s640/norge_oslo_radhus.jpg" width="640" /></a></div><div><a name='more'></a>Norska Nasjonal Kommunikationsmyndihet, NKOM, motsvarigheten till den svenska Post- och Telestyrelsen, PTS, rekommenderar alltså att 700 Mhz-banden släpps till de kommersiella mobiloperatörerna. Dessa ska dock ge kris- och beredskapsmyndigheter tillgång till näten.<br /><br />Detta är alltså <a href="http://cornucopia.cornubot.se/2017/02/patrik-falstrom-bygg-inte-ett-eget.html">helt i linje med Patrik Fältströms förslag</a>, och kommer ge betydligt bättre täckning till avsevärt lägre pris för krisberedskapen.</div><br /><a href="http://www.nkom.no/aktuelt/nyheter/_attachment/27620?_download=true&_ts=15a7fd5fdd8">NKOM skriver (PDF)</a>:<br /><blockquote class="tr_bq"><i>"Frekvensbåndene 703-733 MHz og 758-788 MHz refereres ofte til som dupleksbåndene i 700 MHz båndet, og de vil støttes i LTE-nettverksutstyr og brukerterminaler over hele verden. Dette er derfor attraktive frekvenser med stor verdi for flere aktører. Hovedproblemstillingen i denne analysen er hvordan disse frekvensene kan anvendes på en måte som gir mest effektiv utnyttelse av frekvensressursene og er samfunnsøkonomisk mest gunstig. En viktig del av denne vurderingen er hvordan nød- og beredskapsbrukeres behov for mobil bredbåndskommunikasjon kan ivaretas i ulike løsningsmodeller. <b>Etter en samlet vurdering er det vår anbefaling at alle frekvensressursene i det aktuelle båndet gjøres tilgjengelige for offentlige mobilnett, men slik at mobiloperatører som tildelesfrekvenser samtidig pålegges å legge til rette for nød- og beredskapsbrukeres behov."</b></i></blockquote><a href="http://www.nkom.no/aktuelt/nyheter/samfunns%C3%B8konomisk-analyse-av-700-mhz-b%C3%A5ndet">Något kortare står det på hemsidan</a>:<br /><blockquote class="tr_bq"><i>"En sentral del av Nkoms vurderinger vil omhandle nød- og beredskapssektorens og Forsvarets behov for mobile bredbåndtjenester<b>. Den samfunnsøkonomiske analysen anbefaler å legge til rette for en løsning der disse behovene ivaretas i de offentlige mobilnettene.</b>"</i></blockquote><b>Kort sagt: <i>Den samhällsekonomiska analysen är att kris- och beredskapsbehoven tas till vara i de offentliga mobilnäten.</i> </b><br /><b><br /></b>Det finns också siffror i rapporten, på skillnaden i pris. Ett separat nät för kriskommunikation beräknas kosta 27.7 miljarder NOK i totalkostnad. Om man använder de offentliga näten beräknas kostnaden till 3.5 miljarder NOK (sidan 4 i ovan länkade PDF).<br /><br /><b>Ett eget nät är alltså åtta gånger så dyrt.</b><br /><br />Dessutom kommer det alternativet vara bättre eller lika bra på på täckning, tillgänglighet, robusthet, funktionalitet och framtidssäkring som att driva ett eget nät. Enda skillnaden till fördel för eget nät ligger i viss ökad säkerhet (sidan 5 i PDF:en). <i>Vad nu säkerhet är värt om nätet inte har täckning - fyra operatörer kommer garanterat ge bättre täckning tillsammans än en operatör.</i><br /><br /><b>Sammantaget är det alltså billigare och bättre att använda prioriterad trafik i de offentliga näten än att bygga själv. Därmed kan vi vara säkra på att Sverige i sedvanlig ordning väljer den sämsta lösningen - åtta gånger dyrare och sämre.</b>http://cornucopia.cornubot.se/2017/03/norska-pts-rekommenderar-700-mhz-bandet.htmlnoreply@blogger.com (Cornucopia?)9tag:blogger.com,1999:blog-8354057230547055221.post-2914460029146726059Fri, 03 Mar 2017 07:48:00 +00002017-03-03T08:48:08.473+01:00budgetekonomipolitikskattekontoStatens överskott endast 10 miljarder - sparande på skattekonto förklaringenStatens överskott 2016 var inte alls 60 miljarder enligt finansutskottets Jan Ericson (m). 50 miljarder av "överskottet" beror på att företag och privatpersoner använde skattekontot som bank. Nu har räntan satts till noll och pengarna förväntas strömma ut från skattekontot.<br /><div style="text-align: justify;"></div><div><a name='more'></a><br />Skattekontot har på grund av tidigare lagstiftning erbjudit en för ränteläget hög och skattefri ränta. Företag och privatpersoner har därför deponerat likvider på skattekontot, <i>vilket är förklaringen till statens bokföringsmässiga överskott under 2016. </i><br /><i><br /></i> <b>Av statens överskott på 60 miljarder beror 50 miljarder av sparande på skattekonto, som i själva verket är en skuld staten har till medborgarna.</b><br /><br /></div><div><a href="http://www.ericsoniubbhult.se/">Jan Ericson (m), ledamot av finansutskottet i riksdagen, skriver på sin blogg</a>:</div><div><blockquote class="tr_bq"><i>"[H]ela statens överskott beror på att skattebetalarna använt Skattekontot som bank. Det är inte riktiga skatteintäkter som staten får behålla. Nu har regeringen dessutom beslutat att sätta räntan till noll, och därmed förväntas överlikviditeten på skattekontot minska igen, och Riksgälden spår att 2017 blir betydligt sämre. "Underskottet i statsbudgeten väntas bli 20 miljarder kronor 2017" skriver man i sitt pressmeddelande."</i></blockquote>Siffrorna kommer bland annat från <a href="https://www.riksgalden.se/sv/For-investerare/Aktuellt/Nyheter-och-pressmeddelanden/Pressmeddelande/2017/Lagre-underskott-for-staten-2017-ger-minskad-upplaning/">Riksgäldens pressmeddelande i januari</a>.</div><div><blockquote class="tr_bq"><i>"Tolkningen av statsfinanserna försvåras fortsatt av de överinsättningar som finns på skattekontot. Riksgäldens bedömning är att de i dag uppgår till cirka 50 miljarder kronor, vilket är samma bedömning som i oktober. Detta innebär att både Riksgäldens lånebehov och den redovisade statsskulden blir lägre än vad de skulle varit utan överinsättningarna på skattekontot."</i></blockquote><b>Riksgälden förväntar sig nu ett <i>underskott</i> på 20 miljarder kronor för 2017, eller 80 miljarder i skillnad mot de felaktiga siffror som regeringen slänger sig med för 2016.</b><br /></div>http://cornucopia.cornubot.se/2017/03/statens-overskott-endast-10-miljarder.htmlnoreply@blogger.com (Cornucopia?)32tag:blogger.com,1999:blog-8354057230547055221.post-4090588541343199995Thu, 02 Mar 2017 20:51:00 +00002017-03-02T21:54:53.141+01:00försvarRysslandSäpovänsterpartietLäs: Patrik Oksanen exponerar SVR och RISS operationer mot SverigePatrik Oksanen har i en massiv <i>tour de force</i> exponerat en av den ryska utländska underrättelsetjänsten SVR och dess informationskrigsdel RISS operationer mot Sverige. Detta är obligatorisk läsning och inkluderar hur Vänsterpartiets ledamot i inte bara försvarsutskottet och försvarsberedningen utan även det svenska kontraspionagets politiska insynsråd anser att SVR har större rätt att finnas i Sverige än Säpo.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-B5Xqt3_JLtQ/WLiD6c8CF3I/AAAAAAAAqcw/84l8GCPOysgunY_92GaQtb10-7YT_z85ACLcB/s1600/personer_patrik_oksanen.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://3.bp.blogspot.com/-B5Xqt3_JLtQ/WLiD6c8CF3I/AAAAAAAAqcw/84l8GCPOysgunY_92GaQtb10-7YT_z85ACLcB/s640/personer_patrik_oksanen.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Patrik Oksanen.</td></tr></tbody></table><a name='more'></a>Det finns inte så mycket att anmärka på <a href="http://www.helahalsingland.se/opinion/ledare/stig-henrikssons-v-markliga-omsorg-om-rysk-underrattelsetjanst">Oksanens ledartext, annat än att det är en lång och obligatorisk läsning</a> som skildrar hur SVR/RISS alltså bedriver sk <i>reflexiv kontroll</i> rätt in i försvarsutskottet och även kontraspionaget Säpos politiska insynsråd.<br /><div><br /></div><div>Anmärkningsvärt är att Vänsterpartiets Stig Henriksson (v) alltså anser att Säpo inte får närvara i Sverige, men väl ryska underrättelsetjänsten SVR och dess informationskrigsdel RISS. </div><div><br /></div><div><b>Dessutom är det nu dokumenterat att Stig Henriksson öppet talar om vad som diskuterats i Säpos insynsråd och alltså publikt diskuterar vad svenskt kontraspionage sysslar med.</b><br /><div><blockquote class="tr_bq"><i>"Och det är på Sveavägen 41 som Stig Henriksson, riksdagsledamot för Vänsterpartiet, ledamot i Säpos insynsråd, i en direktsändning bekräftar uppgifterna att den som Säpo syftat på i intervjun med DN är just chefen för RISS:s rådgivargrupp, Vladimir Kozin."</i></blockquote></div><div><div><a href="http://www.helahalsingland.se/opinion/ledare/stig-henrikssons-v-markliga-omsorg-om-rysk-underrattelsetjanst">Ni hittar alltså texten här</a>. Obligatorisk läsning!<br /><br />Under kalla kriget hölls Vänsterpartiet på mils avstånd från försvarsutskott etc. Kanske dags att överväga detta igen. Det är inte så konstigt att Försvarsmakten är ovilliga att informera försvarsutskottet om saker av hemlig natur, vilket gör att utskottet får problem att fatta rätt beslut.</div></div></div>http://cornucopia.cornubot.se/2017/03/las-patrik-oksanen-exponerar-svr-och.htmlnoreply@blogger.com (Cornucopia?)49tag:blogger.com,1999:blog-8354057230547055221.post-676086801069462893Thu, 02 Mar 2017 13:16:00 +00002017-03-02T14:16:02.561+01:00försvarRysslandUSAUSA:s Constant Phoenix spanade efter strålning utanför KaliningradDet ena amerikanska Boeing WC-135C <i>Constant Phoneix</i> spanade igår efter strålning utanför den Ryska Federationens exklav i Königsberg<sup>1.</sup> vid Östersjön. Detta efter att <a href="http://cornucopia.cornubot.se/2017/02/constant-phoenix-soker-av-barents-hav.html">tidigare spanat efter strålning vid norska gränsen mot Ryssland</a> och Barents Hav.<br /><div style="text-align: justify;"></div><div><blockquote class="twitter-tweet" data-lang="en"><div dir="ltr" lang="en">West of <a href="https://twitter.com/hashtag/Kaliningrad?src=hash">#Kaliningrad</a> over the Baltic Sea <br /><br />🇺🇸 USAF RC135W 62-4138 ABIL087 <a href="https://t.co/etRAbbCQTm">pic.twitter.com/etRAbbCQTm</a></div>— CivMilAir ✈ 🚁 (@CivMilAir) <a href="https://twitter.com/CivMilAir/status/836988425467281410">March 1, 2017</a></blockquote><script async="" charset="utf-8" src="//platform.twitter.com/widgets.js"></script></div><div><a name='more'></a>Officiellt heter det fortfarande att WC-135C <i>Constant Phoenix</i> är i Europa för att mäta upp en normalbild. Samtidigt har de första två flygningarna varit riktade mot ryska gränsen mot svenska grannländer som Norge eller Polen.</div><div><br /></div><div>Man kan bara spekulera i hur känsliga instrumenten ombord på flygplanet är - kan det t ex detektera närvaron av kärnvapen? Det känns högst tveksamt, då dessa normalt finns i skyddade lager, men det är möjligt att <i>flytt</i> av kärnvapen i det öppna, t ex vid lastning på vapenbärare eller omgruppering, skulle kunna ge spår av joniserande strålning. Detta känns dock osannolikt.</div><div><br /></div><div><i>Constant Phoenix</i> närvaro i Europa har kopplats till upptäckten av jod-131, men med tanke på ämnets halveringstid finns det knappast kvar något att mäta just nu.</div><div><br /></div><div><b>En annan hypotes är att <a href="http://cornucopia.cornubot.se/2017/02/har-ryssland-brutit-mot.html">spana efter spår av kärnvapenprov</a>, som ju släpper ut jod-131, men dessa sker inte i Königsberg. Att flyga specifikt till gränsen till Königsberg handlar <i>specifikt</i> om att mäta någon form av rysk kärnvapenrelaterad aktivitet. Hade man bara viljat ha ett normalläge hade man inte <i>enbart</i> spanat av vid gränsen till Königsberg respektive rysk-norska gränsen tidigare.</b><br /><b><br /></b>Därtill flög man alltså an mot den ryska örlogs- och militärbasen vid Baltijsk och inte inne över Polens territorium för att komma närmare andra baseringar i Kaliningrad. Mätningen framstår därmed som inriktad mot främst flottan.</div><div><br />Ryssland har ett antal kärnvapenlager i Königsbergexklaven, bedömt främst avsett för taktiskt bruk, t ex till Iskanderrobotar, eller som kryssningsrobotar eller bomber på attackflyg. Några strategiska kärnvapen finns inte stationerade i exklaven, annat än teoretiskt ombord på kryssningsrobotutrustade örlogsfartyg, likt de Kalibr-bestyckade korvetter som nyligen omgrupperades till Östersjön. Man har dock inga strategiska robotubåtar i Östersjön. Taktiska kärnvapengranater ska sedan tidigare vara avrustade av bägge sidor.<br /><br /></div><div><sup>1. Königsberg är oftast känt som Kaliningrad. Ryssland och Kreml pratar ju om att gamla gränser ska gälla, så vi ser alla fram emot att Königsberg lämnas tillbaka till Tyskland. Dock rensade ryssarna Ostpreussen etniskt, så det finns i princip inte en enda tysk kvar. Finns en del intressant att berätta om de som rensades ut, mer om det och ett blogginlägg om besök i området vid senare tillfälle.</sup></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-TKndtlyHhCc/WLgK6xL44UI/AAAAAAAAqcg/YKaPmY4huWoFfeF1NcaJ73QYslN5DPqcACLcB/s1600/DSC_8912.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://1.bp.blogspot.com/-TKndtlyHhCc/WLgK6xL44UI/AAAAAAAAqcg/YKaPmY4huWoFfeF1NcaJ73QYslN5DPqcACLcB/s640/DSC_8912.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Parasiten mistel är mycket vanlig i forna Ostpreussen. Eget foto.</td></tr></tbody></table>http://cornucopia.cornubot.se/2017/03/usas-constant-phoenix-spanade-efter.htmlnoreply@blogger.com (Cornucopia?)23tag:blogger.com,1999:blog-8354057230547055221.post-397697348304997386Thu, 02 Mar 2017 11:53:00 +00002017-03-02T12:53:24.059+01:00bolånbostadobligationerräntanSBABHar de svenska marknadsräntorna vänt upp?SBAB höjde i dagarna sin listränta för tvååriga bolån. Man hänvisade till höjda upplåningskostnader (dvs högre räntor på bolåneobligationerna), men har svenska marknadsräntor egentligen vänt upp?<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-w18ETIDH7lo/WLgFcdwK8FI/AAAAAAAAqcQ/M277git1TkoUFT1nsNj2MX2_DOdZP2UZACLcB/s1600/rantor.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="558" src="https://2.bp.blogspot.com/-w18ETIDH7lo/WLgFcdwK8FI/AAAAAAAAqcQ/M277git1TkoUFT1nsNj2MX2_DOdZP2UZACLcB/s640/rantor.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Svenska marknadsräntor under 2016 och 2017. Källa: Sveriges Riksbank.</td></tr></tbody></table><a name='more'></a>För att finansiera bolån med fasta löptider sker <i>upplåning</i>, dvs emitterande av bolåneobligationer. Räntan på dessa styr också räntan mot slutkund. SBAB hävdade att upplåningskostnaden stigit och höjde därför sina oprutade listräntor för tvååriga obligationer.<br /><div><br /></div><div>Som man ser har generellt marknadsräntorna faktiskt stigit sedan i höstas, undantaget den statliga tvååringen. Samtidigt har räntorna fallit tillbaka sedan årsskiftet, för att precis nu ta ett skutt uppåt.</div><div><br /></div><div><b>Min hypotes är att den längre trenden med fallande räntor kan sägas brutits i höstas. Frågan blir om onsdagens skutt uppåt innebär slutet på den rekyl som gällt under delar av januari tills nu?</b></div><div><b><br /></b></div><div>Därmed är inte sagt att det är lönsamt att binda räntan idag. Det kan fortfarande exempelvis ta tre år innan rörlig ränta går över den 5-årsränta du bundit, och givet linjär uppgång kommer du då ändå inte tjäna på bundet lån under en femårsperiod.</div><div><br /></div><div>Marknadsräntorna är fortfarande negativa utom för statliga löptider på över sju år, eller 5-åriga bolåneobligationer. Till och med för tvååriga bostadslån är räntorna negativa, där investerarna alltså är beredda att betala för att få deponera sina medel hos banker som SBAB. Snacka om förtroende för att det inte finns någon svensk bostadsbubbla och att svenskarna kommer kunna betala sina räntor de kommande två åren.</div><div><br /></div><div>I övrigt är det intressant att se hur 5-åriga bolåneobligationer skuggar 10-åriga statsobligationer.</div><div><br /></div><div>Räntan på rörliga lån påverkas inte av obligationsmarknaden, utan av penningmarknaden, där upplåningsräntorna i stort sett följer Riksbankens styrränta reporäntan och tillhörande in- och utlåningsräntor. Inte exakt samma räntor, men det händer exempelvis väldigt lite med STIBOR eller statsskuldväxlar, annat än när Riksbanken ändrar reporäntan. Åtminstone inte mer än att det är ointressant att publicera grafer.</div>http://cornucopia.cornubot.se/2017/03/har-de-svenska-marknadsrantorna-vant-upp.htmlnoreply@blogger.com (Cornucopia?)29tag:blogger.com,1999:blog-8354057230547055221.post-410400829341017273Thu, 02 Mar 2017 09:53:00 +00002017-03-02T11:00:08.538+01:00försvarmediapolitikvärnpliktenVärnplikten: Regeringen riktar bort fokus från behovet av 6.5 miljarderGenom att dagen efter Försvarsmakten och ÖB lämnat sitt budgetunderlag och <a href="http://cornucopia.cornubot.se/2017/02/ob-forsvarsmakten-saknar-65-miljarder.html">konstaterat att det saknas 6.5 miljarder kronor i anslag</a>, så väljer regeringen att återinföra värnpliktsutbildning. Detta sparar inga pengar, men beslutet kommer för att rikta bort uppmärksamheten från Socialdemokraternas och Miljöpartiets ovilja att anslå ytterligare 6.5 miljarder till försvaret för de politiska beslut man redan fattat. Istället kommer vi nu få en okunnig debatt om värnplikt.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-cdz7MAcS0R8/WLfk0QEaSjI/AAAAAAAAqb0/JxA4DJdtAdMqOTKvwiOVLEtHqpB7RTeGQCLcB/s1600/DSC_8514.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://3.bp.blogspot.com/-cdz7MAcS0R8/WLfk0QEaSjI/AAAAAAAAqb0/JxA4DJdtAdMqOTKvwiOVLEtHqpB7RTeGQCLcB/s640/DSC_8514.JPG" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">"Stefan, vi behöver 6.5 miljarder kronor till för att kunna genomföra de beslut ni tagit."<br />"Det kan ni glömma. Här betalar vi inte för den försvarspolitik vi klubbat. Låt oss prata om värnplikt istället!"</td></tr></tbody></table><a name='more'></a>Försvarsmakten behöver <i>minst</i> 6.5 miljarder kronor till för att kunna genomföra den försvarspolitik regering och riksdag beslutat om. Det är ungefär som att regering och riksdag t ex beslutat om sjukförsäkringar, föräldraförsäkringar, flyktingmottagning mm, och när det visar sig bli dyrare än planerat, <b>så skjuter man till pengarna som behövs för att genomföra de politiska besluten</b>.<br /><div><br /></div><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-CTcPthSnKss/WLfmfOzZhUI/AAAAAAAAqcA/bwyRggqVbPgKyKLY0fCRZbUc7JKDuvmpgCLcB/s1600/sakine.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="96" src="https://2.bp.blogspot.com/-CTcPthSnKss/WLfmfOzZhUI/AAAAAAAAqcA/bwyRggqVbPgKyKLY0fCRZbUc7JKDuvmpgCLcB/s320/sakine.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Så här ser vänrpliktsdebatten ut.</td></tr></tbody></table><div>Men Försvarsmakten får inte dessa 6.5 miljarder kronor. För att snabbt ta bort fokus i den mediala debatten klubbar istället minoritetsregeringen igenom ett återinförande av värnpliktsutbildning, väl medvetna om att det kommer leda till en infantil och djupt okunnig debatt kring att ungdomar behöver lära sig bädda sängen och annat rent trams.</div><div><br /></div><div>Det finns bara tre frågor att ta ställning till angående värnplikten.</div><div><br /></div><div><b>Höjer värnpliktsutbildning svensk beredskap? Höjer värnpliktsutbildning krigsdugligheten hos Sveriges krigsförband? Höjer värnpliktsutbildning det svenska försvarets operativa förmåga?</b></div><div><br /></div><div>Svaret på samtliga dessa frågor är <i>nej</i>. Värnpliktsutbildningen sparar och frigör inte ens pengar, då den kommer ske på samma villkor som för frivillig personal. Försvarsmakten säger idag uttryckligen att det inte kommer vara någon skillnad på frivilliga och tvångsrekryterade.</div><div><br /></div><div>Därtill är forna tiders värnpliktssystems infrastruktor och organisation inte längre kvar. </div><div><br /></div><div>Infrastrukturen är borta. Efter GMU:n, när man går in i befattningsutbildning är det <i>bostäder</i> som gäller. Logement finns inte kvar. Istället finns motsvarande lägenheter, ibland delade mellan flera. Detta gäller t ex på övningsfälten där personalhotell upprättats. Efter tjänstedagen är slut är bostaden <i>privat</i>. Inget där någon kan komma och kräva bäddning.</div><div><br /></div><div><b>Den stora ekonomiska vinsten med forna värnplikten låg inte i att soldaterna fick några kronor i timmen i betalt under utbildningen - idag runt 20:- SEK i timmen, en intressant ingångslön att ta med sig i debatten om ingångslöner - utan i <i>grå arbetskraft</i>, som numera är olaglig.</b></div><div><br /></div><div>Dels placerades värnpliktiga som <i>depå- och bevakningssoldater</i>, även känt som <i>malajer</i>, som utförde riktigt arbete som fastighetsskötsel, tvätt, bevakning, sambandstjänst, kontorsarbete mm, medan övriga värnpliktiga lekte krig. Malajerna bar upp försvarets ekonomi. Idag är deras tjänster ersatta med kommersiella underleverantörer till marknadsmässiga priser istället för 2:50 SEK i timmen. Dels användes värnpliktiga till att utföra riktiga jobb i det skarpa försvaret, som radaroperatörer, flygplanstekniker etc, allt till några kronor i timmen i lön. Ingenjörsförbandens värnpliktiga byggde skarpa befästningar och fältarbeten, precis likt man i diktaturen <a href="http://cornucopia.cornubot.se/2017/02/vitryssland-mobiliserar-mot-ost-och.html">Vitryssland nyligen kallat in värnpliktiga för att som slavarbetskraft bygga befästningar mot ryska gränsen</a>. </div><div><br /></div><div>Eftersom grå arbetskraft är avskaffat finns inga ekonomiska vinster med värnplikt. Tvärt om kommer värnplikt utöver den andel av de 4% som ska utbildas varje år att kosta stora belopp när infrastrutkur måste återskapas.</div><div><br /></div><div><b>Det är knappast någon slump att regeringen Löfven dagen efter att Försvarsmakten begärt 6.5 miljarder kronor i extra anslag väljer att rikta bort debatten till värnplikt. Därmed kommer infantiliserade och okunniga debattörer att tro att försvarets ekonomi är löst och helt glömma bort att myndighetschefen igår krävde 6.5 miljarder kronor i tillskott.</b></div><div><br /></div><div><i>Jag gjorde värnpliktsutbildning 1991-92 och en särskild övning befäl 1995. Jag har inget negativt att säga om min egen värnpliktsutbildning, men jag var högt motiverat befäl. Jag togs ut som KB-elev för att bli ställföreträdande plutonchef på pansarskytte, men kompanichefen ansåg efter grundutbildningens gröntjänst att det var slöseri med mina förmågor och jag utbildades istället till kompanistabschef/stabstroppchef/ställföreträdande plutonchef stab- och tross. En mycket givande tjänst med ett antal kvalificerade utbildningsmoment, inklusive att jobba med skarpa C-stridsmedel. Som stabschef </i><i>(aka "pansarattackpärmbärare") </i><i>hade man ansvar för bland annat underrättelsetjänst och säkerhetstjänst, skyddstjänst (ABC/NBC idag CBRN), samband, luftförsvar, samt ledande av stridstrossen. Som stab ingick en stabsgrupp, en skydds- och spaningsgrupp och en pansarbandvagnsgrupp (kompanichefens vagn) i stabsdelarna, men i praktiken turades man om med kvartermästaren att leda hela stridstrossen, inklusive i strid, vilket även inkluderade sjukvårdsgrupp, mekgrupp (idag driftstödsgrupp) och brogrupp. En ställföreträdande kvartermästare tog hand om andra halvan av stab- och trossplutonen, vilket inkluderade kokgrupp och packgrupp, samt ibland brogruppen. </i></div><div><i><br /></i></div><div><i>På min tid gjorde ca 80-90% av alla män i en årskull värnplikten, inklusive vapenfri tjänst vid t ex FRA eller räddningstjänsten, vilket gjorde att värnplikten kunde rättfärdigas. Idag ska högst 4% av en årskull göra värnplikten, vilket gör det hela djupt orättfärdigt.</i></div><div><i><br /></i></div><div><i>Oavsett löser inte värnplikt försvarsmaktens problem, utan kommer istället leda till att debattens fokus ändras från där den borde ligga - <b>ekonomiska anslag och operativ förmåga</b>.</i></div>http://cornucopia.cornubot.se/2017/03/varnplikten-regeringen-riktar-bort.htmlnoreply@blogger.com (Cornucopia?)51tag:blogger.com,1999:blog-8354057230547055221.post-8850196980892351504Thu, 02 Mar 2017 06:28:00 +00002017-03-02T07:44:25.221+01:00arbetsmarknadförsvarlönerpolitikvärnpliktenRegeringen beslutar om återinförd tvångsrekrytering till försvaretEnligt mediauppgifter kommer regeringen idag fatta beslut om återinförande av tvångsrekrytering till det militära försvaret, sk <i>värnplikt</i>. 13% av en årskull ska genomföra mönstring och upp till 4% ska förlora ett år av sin livsinkomst och karriär medan övriga 96% slipper detta. Samtidigt är regeringen emot sänkta ingångslöner i andra sektorer, medan man alltså tvångsrekryterar till Sveriges lägst avlönade yrke - soldatyrket. Lönerna är så låga att man inte ens kan rekrytera 4 000 personer om året.<br /><div style="text-align: justify;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-wAZyuqa5VVY/WLe16r3lLyI/AAAAAAAAqbU/6PR-RD-W4N45wrs4NhlJTdkjBE1qZtEkQCLcB/s1600/svfm_p4_42mekbat.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://4.bp.blogspot.com/-wAZyuqa5VVY/WLe16r3lLyI/AAAAAAAAqbU/6PR-RD-W4N45wrs4NhlJTdkjBE1qZtEkQCLcB/s640/svfm_p4_42mekbat.jpg" width="640" /></a></div><div><a name='more'></a>Enligt mediauppgifter (<a href="http://sverigesradio.se/sida/artikel.aspx?programid=83&artikel=6642527">SR</a>) vägrar vägrar regeringen alltså höja lönerna för att göra det samhällsbärande soldatyrket attraktivt. Istället ska de 4000 utbildningsplatser som inte blir fyllda av frivilliga fyllas av tvångsrekryterade ungdomar. I praktiken <i>lönedumpning</i>.</div><div><br /></div><div><b>Det handlar alltså inte om någon upprustning eller utökning av svenskt försvar, utan bara om att slippa höja yrkets löner genom tvångsrekrytering.</b> <b>ÖB är tydlig i gårdagens budgetunderlag att <i>krigsduglighet</i> prioriteras och antalet soldater eller förband kommer inte ökas.</b></div><div><br /></div><div>De tvångsrekryterade kommer få samma utbildningsersättning som frivilliga, så det är inte heller en fråga om att spara pengar. Tvångsrekryterade ska främst ersätta de sk <i>tidvis tjänstgörande</i> (GSS/T), dit det är svårt att rekrytera. Tvångsrekryterade innebär här dock en <i>ökad kostnad</i>, eftersom deras lön vid krigsförbandsövningar (KFÖ) och repetitionsutbildningar är högre än för GSS/T.</div><div><br /></div><div>GSS/T får den låga soldatlönen på KFÖ eller repetitionsutbildningar. De tvångsrekryterade får sin SGI, dvs 80% av 97% av sin lön med ett tak. Med tvångsrekrytering och krigsplacering som sk GSS/K kommer det nu bli ännu svårare att rekrytera GSS/T.</div><div><br /></div><div><b>För att upprätthålla krigsduglighet blir alltså de tvångsrekryterade <i>dyrare</i> än yrkessoldater, och dränerar försvarsekonomin ytterligare om inte regeringen avser att höja anslagen.</b></div><div><b><br /></b></div><div>Regeringen vägrar på andra områden tillåta sk <i>lönedumpning</i> för att få in folk på arbetsmarknaden, men vill alltså inte anslå medel för att betala attraktiva löner för att riskera livet för att försvara Sveriges frihet och självbestämmande. Soldatyrket är ett av de yrken som har lägst lön i landet.</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-96y5F4nFNeg/WLe32bgJ2EI/AAAAAAAAqbk/9MkSjzgtMasFaL1lKJdlqsUZdW77lEm8QCLcB/s1600/loner.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://2.bp.blogspot.com/-96y5F4nFNeg/WLe32bgJ2EI/AAAAAAAAqbk/9MkSjzgtMasFaL1lKJdlqsUZdW77lEm8QCLcB/s640/loner.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Löner i Sverige. Soldatyrket är inringat med rött.</td></tr></tbody></table><div>Ett återinförande av tvångsrekryteringen bör ses som förberedande för att faktiskt utöka svenskt försvar. Eftersom man inte vill betala marknadsmässiga löner så lär det vara mycket svårt att utöka krigsorganisationen ytterligare. </div><div><br /></div><div><b>Det är dock viktigt att förstå att det idag inte finns någon kapacitet att utöka krigsförbanden utan att i så fall säga upp yrkessoldaterna och ersätta deras mycket krigsdugliga förband och mycket hög beredskap med tvångsrekryterade med låg beredskap.</b></div><div><b><br /></b></div><div>Förhoppningen är nu att det ska bli lättare att rekrytera och utbilda officerare framöver, så att man kan skala upp krigsorganisationen, men det kommer ta många år innan man får upp numerären som behövs för att utbilda dessa även vid tvångsrekrytering. Lönerna måste upp oavsett, vilket Sveriges framtida regeringar kommer upptäcka.</div><div><br /></div><div><b>Återigen, ett återinförande av värnplikten innebär inte ett starkare försvar utan ett dyrare försvar, utan att regeringen anslår medel för kostnadsökningarna. Alternativet är att man likt förr inte kallar in till krigsförbandsövningar och repetitionsutbildningar och väljer pappersförsvaret istället för krigsduglighet. Sveriges försvar idag är så litet att <i>krigsduglighet</i> och <i>hög beredskap</i> är helt avgörande för förmågan och man kan inte förlita sig på en köttvägg av forna tiders 100 000-tals värnpliktiga.</b></div><div><b><br /></b></div><div>Det är också djupt orättfärdigt att upp till 4% av svenska ungdomar får sin karriär och livsinkomst fördröjd med ett helt år, och kommer få lägre pension mm på grund av att de är borta från arbetsmarknaden ett extra år. Allt tjafs om att man gör <i>"män av pojkar"</i> eller att <i>"ungdomarna får lära sig hyfs"</i> är rent nonsens, då det dels är väldigt få som omfattas, och dels kommer det vara skötsamma ungdomar med fläckfritt förflutet. Med högst 4% uttag kommer man förstås välja de mest begåvade och lovande ungdomarna, speciellt som det ofta är till tjänster inom funktionförbandens specialförmågor det är svårt att rekrytera. <i>Alla vill bli jägare eller åka stridsvagn, ingen vill bli sambandssoldat. </i>Dessutom ska försvaret försvara Sverige och inte ersätta utebliven uppfostran.</div><div><i><br /></i></div><div><b>Det hade varit önskvärt att återinförd tvångsrekrytering av upp till 4% hade åtföljts av en försvarsskatt på de 96% som inte försvarar eller försvarat Sverige. Låt de som inte själva deltar i Sveriges försvar genom att aldrig varit krigsplacerade betala för försvaret.</b></div><div><b><br /></b></div><div><i>Nu återstår att se när regeringen inför tvångsrekrytering till andra offentliga bristyrken, som t ex lärare. Kom också ihåg att de flesta diktaturer har värnplikt, medan det är betydligt vanligare med yrkesförsvar i våra västerländska demokratier. Regeringens argument mot sänkta ingångslöner för personer som står långt från arbetsmarknaden har med införandet av tvångsrekrytering till försvaret nu fallit.</i></div>http://cornucopia.cornubot.se/2017/03/regeringen-beslutar-om-aterinford.htmlnoreply@blogger.com (Cornucopia?)74tag:blogger.com,1999:blog-8354057230547055221.post-1921162613463663198Wed, 01 Mar 2017 18:07:00 +00002017-03-01T19:07:13.464+01:00biobränsleenergiflygbolagpeak oilBiobränsle ständigt tio år bort - även till flygetNu pratas det om bioflygbränsle, och likt alla biobränslen ligger det alltid tio år bort. Svensk produktion av tre gånger så dyrt flygbränsle från skogsavfall <i>kan</i> vara redo om tio år. Men vi minns att <a href="http://cornucopia.cornubot.se/2013/04/ivlchalmers-11-26-fornyelsebara.html"><i>inte ett enda</i> av planerade biobränsleprojekt har blivit av</a>. Så vi kommer stå här om tio år och fortfarande ha tio år tills det blir något av biobränsle för flyget.<br /><div style="text-align: justify;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-kHjPjgMaYVY/WLcJ2WmpaaI/AAAAAAAAqbE/CGlKNr7RvmsFmg_oFPxHhSs3JNWvejeIgCLcB/s1600/flyg_air_greenland_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://3.bp.blogspot.com/-kHjPjgMaYVY/WLcJ2WmpaaI/AAAAAAAAqbE/CGlKNr7RvmsFmg_oFPxHhSs3JNWvejeIgCLcB/s640/flyg_air_greenland_2.jpg" width="640" /></a></div><div><a name='more'></a>Biobränslen (flytande dito som ersättning för fordon) i större skala är en ständigt undflyende hägring. Av tidigare <a href="http://cornucopia.cornubot.se/2013/04/ivlchalmers-11-26-fornyelsebara.html">sammanställning över större svenska projekt har inte ett enda blivit av</a>, utan har bara varit fria fantasier:</div><div><blockquote class="tr_bq"><i>"Det konstaterades dock att dessa biobränsleprojekt saknade finansiering och existerade bara i lobbyvärlden, eftersom energipriserna var för låga redan år 2013, när oljan låg ganska stabilt runt 100 USD. Dessutom väntade man på klara politiska riktlinjer, vilket man aldrig fick."</i></blockquote>Det blev inte ens något av <a href="http://cornucopia.cornubot.se/2015/09/goteborg-energis-biogassatsning-skrivs.html">den enda som verkade faktiskt bli något, Göteborg Energis Gobigas</a>.<br /><br />Gisslet för dessa stora projekt är att de aldrig hinner bli klara i tid innan man får en av de återkommande dipperna i oljepriset.<br /><br />Nu pratas det, antagligen desperat, om biobränslen i stor skala till flyget. Den aktuella flygskatten som Sverige ensidigt ska införa hotar nämligen svensk flygtrafik och hobbyprojekten för diverse kommuner som sponsrar trafik till olika flygplatser landet runt, och därför måste man vifta med att det minsann går att flyga på biobränslen. Om tio år, förstås. <a href="http://www.nyteknik.se/fordon/gront-svenskt-bransle-blir-fardigt-om-tio-ar-6827096">Ny Teknik skriver</a>:<br /><blockquote class="tr_bq"><i>"Om allt rullar på kan vi ha en demonstrationsanläggning inom sju till tio år. En fullskalig produktion av jetbränsle – det är mer än tio år innan vi är där.</i><i><br /></i><i>I dag finns inget bioflygbränsle med lignin som råvara som är godkänt för flygtrafik. Så certifieringsprocessen återstår också."</i></blockquote>Som vanligt en väldigt massa <i>om</i>. Biobränsle för flyg kostar idag ungefär tre gånger så mycket som det sinande fossila flygbränslet. Väldigt lite talar för att det blir billigare.<br /><br />Regeringen vill förstås få fram biobränslen och slänger därför en flygskatt på flyget i tron att det magiskt uppenbarar sig biobränslen då. Vad som istället kommer uppenbara sig är att alla internationella flygsträckor från Sverige, undantaget till våra direkta grannländer, kommer försvinna. Allt internationellt flyg framöver, undantaget till grannländerna, kommer gå till Köpenhamn, där man får byta till ett skattebefriat flyg vidare till andra länder.<br /><br />Så kan man fundera på hur många år efter <i>peak oil </i>vi ligger om tio år? Hela frågan om <i>peak oil</i> försvann effektivt under den nuvarande tillfälliga nedgången i oljepriset, men kommer antagligen bli medialt intressant igen när priset når 100 - 150 USD igen framöver.<br /><br />Oavsett har inte billigt flyg någon framtid, så ni kan lika gärna passa på att flyga medan ni kan göra det billigt. Så har ni något att berätta för barnbarnen om.<br /><br /><b><a href="http://cornucopia.cornubot.se/2014/03/de-tre-villfarelserna.html">Kom ihåg ihåg de tre villfarelserna</a>. Bara för att man kan framställa några kubikmeter biobränsle från frityrolja i Kalifornien så betyder det inte att man kan göra det i några volymer som spelar någon som helst roll för samhället.</b></div>http://cornucopia.cornubot.se/2017/03/biobransle-standigt-tio-ar-bort-aven.htmlnoreply@blogger.com (Cornucopia?)44tag:blogger.com,1999:blog-8354057230547055221.post-3263617897821515361Wed, 01 Mar 2017 15:14:00 +00002017-03-01T16:21:08.168+01:00bostadkonsumismteknologiTvå vintrar med det smarta hemmet - överskattat och självutplånandeVi fortsätter på dagens tekniktema. Jag har nu haft ett sk <i>smart hem</i> i ungefär ett och ett halvt år, inklusive två mörka vintrar och kan egentligen bara upprepa tidigare slutsatser. Det smarta hemmet är för teknofiler och nördar, men löser inga egentliga problem och är som transparent teknik något man glömmer bort och som sådan alltså är självutplånande. Däremot finns det stora vinster i robotisering <i>av faktiska problem</i>.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-FiQWUvgie9s/WLbZRCcqUfI/AAAAAAAAqa0/d6iAEB56Fj8zMXdL_HYaPfMl18c6YmnyQCLcB/s1600/IMG_2923.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://3.bp.blogspot.com/-FiQWUvgie9s/WLbZRCcqUfI/AAAAAAAAqa0/d6iAEB56Fj8zMXdL_HYaPfMl18c6YmnyQCLcB/s640/IMG_2923.JPG" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Philips Hue "smarta" spotlights. Här färgschema "Söderhavet".</td></tr></tbody></table><a name='more'></a>Det <i>"smarta hemmet"</i> handlar om uppkopplade hushållsfunktioner, som kan styras över Internet eller via appar, och förstås automatiseras. Skillnaden mot vanliga rörelsedetektorer och tidsreläer handlar just om möjligheten till extern styrning med varierande tillhörande <i>programmering</i>, felaktigt kallat <i>intelligens</i> eller <i>smarthet</i>.<br /><div><br /></div><div>I praktiken automatiserar man problem som egentligen inte finns, som att tända en lampa i ett rum. Det tar en tiondels sekund att tända lampan för hand, men att säga till Siri att tända lampan tar sin lilla tid. </div><div><br /></div><div><b>När väl man är nöjd med konfigurationen av sitt <i>smarta hem</i> så blir det i praktiken transparent och inget man tänker på och som sådant inte heller uppskattar, då det <i>smarta hemmet</i> inte löser några existerande problem.</b></div><div><br /></div><div>Utvidgar man däremot begreppet till andra uppkopplade eller robotiserade lösningar med rörliga hushållsrobotar (stationära hushållsrobotar har vi haft länge - tvättmaskiner, diskmaskiner, torktumlare mm), så finns det däremot en del vinster. Med hushållsrobotar får man mer tid över till att jobba istället för att t ex dammsuga eller klippa gräset.</div><div><br /></div><div>Men först en titt på vad som är så <i>smart</i>. </div><div><br /></div><div>Som tillbedjare av <i>Church of S:t Jobs</i> har jag valt <i>Apple Homekit</i> som lösning. Säkerheten ska vara hög, då alla produkter rent av har ett av Apples Homekit-chip i sig just för säkerheten, i bemärkelsen cyberangreppssäkerhet. '</div><div><br /></div><div><i>Detta inlägg berör inte riktiga säkerhetsfunktioner och intrångsskydd (t ex larm med åtgärd (grannar, väktare etc), extra gallergrindar, gästboende när man är bortrest (har djur så hemmet är aldrig tomt när jag är borta), larmcentralkopplad brandvarnare, övervakningskameror, dimgeneratorer (mkt effektivt - kan rekommenderas om man samtidigt har larm med åtgärd - dimman är inte försvunnen förrän åtgärd är på plats och gör hemmet helt ogenomträngligt tills dess), concertinatråd, utbildad vakthund, larmminor (rådjur ställer till det där ibland), snubbeltråd etc), som använder andra lösningar och separata system, som inte kommer beröras i några blogginlägg, ej heller detta.</i></div><div><div><br /></div></div><div>De Homekitprodukter som testats är framför allt Philips <i>Hue</i>-system med styrbar belysning, som kopplas in i form av LED-lampor i befintliga armaturer. Dessa kompletteras med ett antal Homekit-styrda reläer och sensorer från <i>Elgato Eve</i>. </div><div><br /></div><div>Ljusen löser icke-problemet med att behöva tända och släcka själv. Hue-lampor i sovrummet är kopplade till väckarklockeappen på mobilen och tonas upp när det är dags att vakna. Samtidigt slås även ljuset på på olika platser i huset om solen ännu inte gått upp. Lamporna släcks sedan när det är tillräckligt ljust.</div><div><br /></div><div>TV:n har ett Eve-relä, som ser till att den är bortkopplad nattetid.</div><div><br /></div><div>Funktioner som att släcka lamporna utifrån GPS om jag lämnar hus eller gård användes initialt, men är inte uppskattat av övriga hushållet av förklarliga skäl. Istället ges ett manuellt kommando till Siri om huset är tomt när man lämnar, så allt går in i <i>ej hemma</i>-läge.</div><div><br /></div><div>Däremot slås lampor på automatiskt om jag kommer hem (GPS-baserat) och om det sker från skymning och framåt tonas också utebelysningen, som är Hue-baserad - dock endast Hue White, upp maximalt.</div><div><br /></div><div>När man lägger sig släcks allt antingen automatiskt vid en viss tidpunkt, eller på Sirikommandot <i>god natt</i>, vilket släcker eller tonar ner alla lampor i huset. På kvällen efter det är tänkt att man ska sluta jobba (ja, jag vet att jag är skämtsam ibland) byts belysningens färger inomhus om till ett mer avslappnande ljus.</div><div><br /></div><div><b>Fast vid normala rutiner behöver man aldrig röra en lampa, utom där det inte finns Huestöd pga icke kompatibla installationer. Allt tänds och släcks automatiskt vid behov. Man glömmer bort systemets existens och det blir alltså självutplånande. Det går lika bra med en vanlig timer för t ex golvvärme i badrummet.</b></div><div><b><br /></b></div><div>En del saker används i princip inte alls. Det t ex finns ett Everelä på vattenkokaren. Tanken är att ha vattenkokaren fylld med vatten och påslagen, men bortkopplad med relät, och sedan slå på det när man närmar sig hemmet för att ha varmt vatten redo. Eller på morgonen. Används sällan, rent av nästan aldrig. Det är inte speciellt jobbigt att sätta på vatten själv när man vill ha kaffe eller te - <i>man måste ändå fylla på vatten och sätta vattenkokaren och reläet i rätt läge</i>. Det handlar bara om <i>när</i> man förbereder sitt varma vatten - f<i>öre</i> man går och lägger sig eller lämnar hemmet, eller <i>efter </i>man vaknat eller kommer hem. Arbetsinsatsen är den samma och man löser inga problem.</div><div><br /></div><div>Sedan kan det vara kul att göra olika ljussättningar med Huelampornas färgmöjligheter, eller med ett ord till mobilen ställa om huset till partyläge eller filmläge, eller kanske läsbelysning. Men det löser som sagt inga faktiska problem.</div><div><br /></div><div>Överlag rätt oanvändbart. Visst, det är väl skönt att inte behöva programmera om tidreläer för utebelysning i takt med årstiderna.</div><div><br /></div><div>Väderstationen, som inte kör Homekit, utan är Netatmobaserad och ett separat system, är förstås roande om man är en datanörd (data som i faktapunkter, inte som i datorer) som jag, men löser sällan några speciella problem. </div><div><br /></div><div><b>Det som faktiskt är användbart är rörliga hushållsrobotar, som dammsugarrobot, mopprobot och gräsklipparrobot. De löser till skillnad mot det <i>smarta hemmet</i> faktiska problem, eller åtminstone sådant som annars tar bort värdefull arbetstid. </b></div><div><b><br /></b></div><div>Utvärdering av ett och ett halvt år med städrobotar kommer i ett senare inlägg. Sammanfattningsvis kan jag konstatera att jag aldrig har för avsikt att gå tillbaka till manuell damsugning och moppning igen. Det samma gäller gräsklippande. Däremot måste man underhålla robotarna och byta en del slitagedelar, men frånvaron av t ex dammsugarpåsar kompenserar detta kostnadsmässigt.</div><div><br /></div><div><b>Men övrig hemautomation tilltalar antagligen bara en teknofil och nörd, men löser inte några egentliga problem. För de flesta skulle vanliga dumma timers, rörelsedetektorer eller ljusreläer lösa problematiken, men då har man förstås inte någon app att styra dem med. Kort sagt kommer <i>smarta hem</i> knappast vara någon storsäljare idag.</b></div><div><b><br /></b></div><div><a href="http://cornucopia.cornubot.se/2017/01/gartners-hypecykel-ny-teknik-tar-lang.html">Som med all teknik gäller <i>hypecykeln</i> även de smarta hemmen</a>. Smarta hem lever inte upp till någon hype, löser inte några existerande problem. De kommer säkert vara allerstädes närvarande någon gång i framtiden när man hittat <i>vad de faktiskt ska användas till</i>. Men där är vi inte idag. Dagens smarta hem fyller ingen funktion och löser inga problem. <a href="http://cornucopia.cornubot.se/2015/07/fredagsmys-vad-ska-vi-med-smarta-hem.html">Min slutsats från juli 2015 gäller alltså fortfarande</a>. </div><div><br /></div><div>Idag kan man antagligen rent tekniskt göra <i>vad som helst</i> med ett smart hem om leverantörer och kunder ville. Men med tanke på att problemen är icke-existerande och därmed behoven icke-existerande så har inte det smarta hemmet fått något genomslag. Jag kan inte heller se hur det ska få något genomslag i närtid heller, om nu ingen uppfinner en verklig <i>killer app</i>. Och det finns inte idag.</div><div><br /></div><div><i>Tvättroboten (Miele) totalhaverarde nyligen efter 16 års felfri drift, då trumman lossnade och det började ryka lite. Enligt servicetekniker per telefon skulle det kosta lika mycket att byta trumma och lager som att köpa en ny. Vid besök på Mediamarkt för akut inköp av en ny Miele fanns det uppkopplade appstyrda tvättrobotar från t ex LG och Samsung. Bland säljargumenten uppsatta på skyltar över dessa fanns t ex "få en notifiering på din mobil över vad som gått fel"</i>. <i>Öh, nej, jag vill inte ha en tvättrobot där något går fel. Jag vill ha ren tvätt. Så det blev en dum Miele av enklaste modell. Visade sig hantera sju kilo tvätt mot fyra kilo på den gamla, till samma pris som en reparation, så nyinköp gav bättre produkt än reparation. Enda andra skillnaden var en display som visade hur lång tid det är kvar på tvätten. Det behövs inte någon app och Wifiuppkopplng för det. Vad skulle man ha en "smart tvättrobot" till? Starta maskinen via en app? Men man stoppar ju ändå in tvätten för hand och det är inget problem att starta den själv därefter. Fast visst, någon av de uppkopplade tvättrobotarna kunde ge fina grafer som visade var i tvättcykeln din maskin befann sig...</i></div>http://cornucopia.cornubot.se/2017/03/tva-vintrar-med-det-smarta-hemmet.htmlnoreply@blogger.com (Cornucopia?)50tag:blogger.com,1999:blog-8354057230547055221.post-6795704712126181336Wed, 01 Mar 2017 10:03:00 +00002017-03-01T15:18:07.122+01:00bredbandInternetlandetmobiltelefonipreppingteknologiTeliaPrepping: Automatisk Internet-redundans med failover till mobilt bredbandJag har nu på grund av återkommande driftsavbrott för min DSL-uppkoppling, införskaffat automatisk failover till mobilt bredband om den fasta förbindelsen till Internet går ner. Tillsammans med avbrottsfri kraft ger detta goda möjligheter att kunna fortsätta leverera blogguppdateringar även vid infrastrukturstörningar utan att behöva lämna hemmet. Även tillgången till Internet sorterar jag ner under <i>prepping</i>. Jämförande förbindelsetest nedan skvallrar lite om hur mobilt bredband står sig mot DSL på landsbygden, nu när Telia river kopparnäten.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/--Qsf2dTqWgs/WLaU9-9kY9I/AAAAAAAAqZ4/mfbpWzWoEq0lErimUyi3-hZZqHfP4P5oQCLcB/s1600/asus.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="510" src="https://3.bp.blogspot.com/--Qsf2dTqWgs/WLaU9-9kY9I/AAAAAAAAqZ4/mfbpWzWoEq0lErimUyi3-hZZqHfP4P5oQCLcB/s640/asus.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Huvudskärmen för <a href="http://clk.tradedoubler.com/click?p=46&a=1559424&url=https://cdon.se/hemelektronik/asus-4g-ac55u-p36527252">Asus 4G-AC55U</a>. Den fasta WAN-anslutningen är aktiv och det mobila bredbandet står redo att ta över. Notera att uppkopplingen är LTE, dvs 4G och inte 3G.</td></tr></tbody></table><div><a name='more'></a><div style="text-align: justify;"></div>Eftersom mitt fasta bredband slutar att fungera några gånger om året, vilket stör produktionen av blogguppdateringar, så har jag nu införskaffat en <a href="http://clk.tradedoubler.com/click?p=46&a=1559424&url=https://cdon.se/hemelektronik/asus-4g-ac55u-p36527252">Asus 4G-AC55U</a>. Det är en bredbandsrouter med inbyggt 3G/4G (LTE)-modem och WAN-port för uppkoppling mot fast bredband via gigabit ethernet. Efter i mitt fall tio sekunders avbrott på det fasta bredbandet går routern istället över till mobilt "bredband" och sedan tillbaka igen när den fasta uppkopplingen fungerar.<br /><div><br /></div><div>Man upplever en kortare paus i uppkopplingen och i mitt fall sedan en något förändrad hastighet. Lägre nedladdningshastighet med mobilt bredband, men snabbare uppladdning, som delvis kompenserar upplevelsen och även sänker svarstiderna.<br /><div><br /></div><div>Mobilt bredband är förstås ingen långsiktigt hållbar lösning, då jag för över mellan 20 och 100 gigabyte data per dygn normalt. Men det ger en viss redundans och yrkesmässigt är det förstås helt avgörande med en uppkoppling. </div></div><div><br /></div><div>Sedan finns det åtminstone en hel del överföringskapacitet i beredskap. I den sparade potten på mitt mobilabonnemang hos Telia ligger det drygt 80 gigabyte av maximalt 100 och väntar. Med ett extra SIM-kort för data går det att använda i Asusroutern och mobilen samtidigt. Jag har även via något erbjudande från Telia fått ett <i>gratis</i> 20 gigabytes mobilt bredbandsabonnemang med än så länge 40 gig i potten av maximalt 100. Därtill finns ett <i>gratis </i>5 gigabytes mobilt bredbandsabonnemang, där man för 199:- SEK kan fylla på med 100 gigabyte i nödfall. I värsta fall får man successivt byta SIM-kort i routern, och fördelen är också att man förstås kan välja SIM-kort från olika leverantörer. Telia har dock klart bäst täckning där jag bor.</div><div><br /></div><div>Routern har inget eget DSL-modem, utan där används Telias "gratis" (=inbakat i abonnemangskostnaden) DSL-router/modem, som körs i DMZ-läge (http://192.168.1.1/dmz.lp) istället för bryggat läge. Genom att köra i DMZ-läge istället för bryggat får jag fortfarande tillgång till administratörsfunktioerna på Teliaroutern, men bara brandväggsfunktionerna hos Asus-routern används för att skydda övriga nätet. En fördel med frånvaron av DSL-modem och bara en gigabit ethernetport som WAN är att samma uppsättning sömlöst kan flyttas över till fiberuppkopplingen, som kommer senare under året.</div><div><br /></div><div>Routrarna sitter på en liten väggmonterad <a href="https://ad.zanox.com/ppc/?39804462C1841175593&ulp=[[dator-natverk/datortillbehor/ups/apc-es-700-va-ups-p44097?utm_source=zanox_%23%23WebsiteID%23%23&utm_medium=affiliate&utm_content=text&utm_campaign=aff_1_2015]]">APC Back-UPS ES700</a> som avbrottsfri kraft, som vid testkörning visat sig ge ungefär två timmars strömförsörjning och med det Internet. Bärbara datorer idag har upp till tolv timmars batteri och behöver knappast köras på UPS:en. Viktigt är att välja en korrekt dimensionerad UPS, som kan köra på de mycket låga strömförbrukningarna som två routrar ger. Det finns UPS:ar med betydligt mer batteri, men de kräver ofta större förbrukning för att köra.</div><div><br /></div><div>Med 300 W sinusväxelriktare och flera sk <i>fritidsbatterier</i> stående på laddning finns det gott om tid att inom två timmar koppla in reservkraft till den avbrottsfria kraften. Ett fulladdat sådant 75 Ah fritidsbatteri bör kunna köra routrarna i ungefär två dygn, men vid det laget kan det bli nödvändigt att även ladda datorer.</div><div><br /></div><div><b>Mobilt bredband <i>fungerar</i> hyfsat, men är hastigheten kan variera stort beroende på andra brukare. Listade "säljhastigheter" är som bekant helt teoretiska. Största problemet är att man inte likt fast förbindelse har fri överföring. Nedan följer mätningar av skillnaden i överföringskvalitet.</b></div><div><b><br /></b></div><div>Vi börjar med att titta på det mobila bredbandet. Samtliga mätningar har skett med samma nätverksuppsättning och går från en dator över gigabit ethernet till routern, och sedan vidare över Telia DSL 12-30 Mbit/s eller Telia mobilt bredband.</div><div><br /></div><div>Uppkopplingen är LTE, dvs 4G även om hastigheterna mer är 3G i praktiken.</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-m5aYDoQHLcQ/WLaUhiMRa3I/AAAAAAAAqZs/fTBOlCEzliYqyuLgw3xbs4Nn33UP-RcpQCLcB/s1600/mobil_kvalitet.png" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="402" src="https://3.bp.blogspot.com/-m5aYDoQHLcQ/WLaUhiMRa3I/AAAAAAAAqZs/fTBOlCEzliYqyuLgw3xbs4Nn33UP-RcpQCLcB/s640/mobil_kvalitet.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Uppkopplingens kvalitet med tillhörande förkortningar för den intresserade.</td></tr></tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-Vza48wjlsBY/WLaWhQDTI3I/AAAAAAAAqaI/ukC_4dH5IwwhoO3zOgJhVktiXIscLy1agCLcB/s1600/mobilt_ping.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://3.bp.blogspot.com/-Vza48wjlsBY/WLaWhQDTI3I/AAAAAAAAqaI/ukC_4dH5IwwhoO3zOgJhVktiXIscLy1agCLcB/s640/mobilt_ping.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Svarstider från en egen server på Internet. IP-adressen har dolts av förklarliga skäl. Som man märker är inte pingtiderna stabila, utan varierar stort. Detta beror på andra brukare av det mobila bredbandet, då man inte ser denna variation med DSL (se nedan).</td></tr></tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-7TLEoLiYFw4/WLaW2cLALCI/AAAAAAAAqaM/9f6Itb75opIiRQYniaxwcyDzO5yn-e-VACLcB/s1600/mobilt_bredbandskollen.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="640" src="https://2.bp.blogspot.com/-7TLEoLiYFw4/WLaW2cLALCI/AAAAAAAAqaM/9f6Itb75opIiRQYniaxwcyDzO5yn-e-VACLcB/s640/mobilt_bredbandskollen.png" width="392" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Mätning med Bredbandskollens app på MacOS, som identifierar Stockholmsservern som den nätverksmässigt närmaste servern. Telia kör sin marknadsföring med <b><i>"Surfa med upp till 300 Mbit/s"</i>. </b>Ovanstående 11.42 Mbit/s är verkligheten i mitt fall med cirka 1.5 kilometer till basstationen, men få som knör i samma cell. Uppladdningshastigheten är dock avsevärt snabbare än DSL, och snabbare uppåt ger också lägre svarstider än DSL.</td></tr></tbody></table><div>Nedan följer motsvarande för DSL-uppkopplingen, som inte har några överföringsbegränsningar. </div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-mkBjo6hV2Q4/WLaXnOy7VwI/AAAAAAAAqaU/a3aJrIQqxi4j0y5H3zzkn9x_XAeL5DxUACLcB/s1600/dsl.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="458" src="https://4.bp.blogspot.com/-mkBjo6hV2Q4/WLaXnOy7VwI/AAAAAAAAqaU/a3aJrIQqxi4j0y5H3zzkn9x_XAeL5DxUACLcB/s640/dsl.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Kvalitet på DSL-kopplingen, som är såld som en 12-30 Mbit/s DSL. Lyckas förhandla fram drygt 18 Mbit/s nedåt, vilket får anses vara väntat med två kilometer kabel till DSLAM i telestationen. Notera 387 gigabyte nedladdning på tre dygn och fem timmar, eller drygt 100 gigabyte per dygn.</td></tr></tbody></table><div><br /></div><div class="separator" style="clear: both; text-align: center;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-ir3O9VnDAWM/WLaYNjuYl1I/AAAAAAAAqac/b9AgFnWNucMPsYQz7C_Q_tCpDo4_MvV-QCLcB/s1600/dsl_ping.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="520" src="https://3.bp.blogspot.com/-ir3O9VnDAWM/WLaYNjuYl1I/AAAAAAAAqac/b9AgFnWNucMPsYQz7C_Q_tCpDo4_MvV-QCLcB/s640/dsl_ping.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Avsevärt stabilare ping mot extern server (IP dolt även här). Dock är svarstiderna längre än de kortaste svarstiderna på det mobila bredbandet, vilket förklaras av den högre hastigheten uppåt på mobilt bredband.</td></tr></tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-ZMJuzNWZ18Y/WLaYfRuDtbI/AAAAAAAAqag/-OftqTht_AoG1JIBC2_A0x5z0LPEAou7QCLcB/s1600/dsl_bredbandskollen.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="640" src="https://1.bp.blogspot.com/-ZMJuzNWZ18Y/WLaYfRuDtbI/AAAAAAAAqag/-OftqTht_AoG1JIBC2_A0x5z0LPEAou7QCLcB/s640/dsl_bredbandskollen.png" width="394" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Mätning med Bredbandskollens app på MacOS. Här identifieras Göteborgsservern som närmast nätverksmässigt. Högre nedladdningshastighet, men sämre uppåt och längre svarstider.</td></tr></tbody></table><div>Telia klipper nu kopparkablarna på landsbygden och man kan konstatera att <i>i ovanstående exempel</i> är mobilt bredband någorlunda jämförtbart med DSL. Detta är även utan externt monterade riktantenner, men jag har alltså relativt nära till Telias basstation. Personer som får sin kopparledning och DSL klippt nu kan dock bo längre bort från än jag, som ändå bor bara någon kilometer utanför en större by.</div><div><br /></div><div>Problemet är att inte ens 100 gigabyte per månad är tillräckligt <i>för att kunna jobba</i> över Internet idag. Klippandet av kablarna på landsbygden omöjliggör kvalificerat distansarbete och nyttjandet av moderna tjänster. Det inkluderar t ex backuplösningar och fillagring i <i>molnet</i>, videokonferenser, research över onlinevideo mm. Idag synkas t ex bilder automatiskt från din telefon och upp i molnet, en telefon som också backas upp automatiskt till molnet. Naturligtvis går sådant att stänga av, men det innebär alltså att man inte kan nyttja moderna lösnignar.</div></div><div><br /></div><div>Ett hushåll om fyra där alla har iPrylar får en rätt hårt smäll vid mjukvaruuppdateringar. Det samma gäller datorer där man kan ha en uppsjö programvaror som regelbundet slukar gigabyte i uppdateringar.</div><div><br /></div><div>Senare under året kommer <i>civilsamhället</i> leverera fiber via en fiberförening och det interna gigabitethernetet kommer få en adekvat uppkoppling mot omvärlden. Då kommer det mobila bredbandet som backuplösning inte ha en chans i jämförelse. Det är dock inte poängen med det mobila bredbandet. Poängen är att ha en flexibel och automatisk redundans, så jag kan leverera blogguppdateringar även vid infrastrukturavbrott.</div><div><br /></div><div><b>Flaskhalsen ligger nu som jag ser det bortom min kontroll och handlar om strömförsörjning hos leverantörernas telestation och mobilbassationer. Med dubbla uppkopplingar, avbrottsfri kraft och reservkraft för några dygn har jag gjort vad jag kan.</b></div><div><b><br /></b></div><div><a href="http://clk.tradedoubler.com/click?p=46&a=1559424&url=https://cdon.se/hemelektronik/asus-4g-ac55u-p36527252">Asus 4G-AC55U kostar 2049:- SEK hos CDON</a>. Lösningen kan fungera för det mindre företaget, men för större arbetsplatser finns det förstås lösningar med högre kapacitet på brandväggen. Det är också tveksamt om en större arbetsplats skulle klara sig på den låga överföringskapaciteten mobilt bredband innebär.</div>http://cornucopia.cornubot.se/2017/03/prepping-automatisk-internet-redundans.htmlnoreply@blogger.com (Cornucopia?)47tag:blogger.com,1999:blog-8354057230547055221.post-4496493817615883723Wed, 01 Mar 2017 08:17:00 +00002017-03-01T09:17:17.691+01:00Annika StrandhällpensionpensionssparandePPMStefan LöfvenSocialdemokraterna tänker nu skrota PPM - oavsett vad oppositionen tyckerRegeringen med statsminister Stefan Löfven (s) och socialförsäkringsminister Annika Strandhäll (s) avser nu skrota premiepensionssystemet, oavsett vad oppositionen tycker. Degen ska in och premiepensionerna är satta åt sidan till skillnad mot övriga pensionsinbetalningar.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-uWOSiZG6MTI/WLaBX2Yzp3I/AAAAAAAAqZE/B94TD83Z4gYgfaa9hTeerUONGZky1yKlwCLcB/s1600/personer_stefan_lofven.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://4.bp.blogspot.com/-uWOSiZG6MTI/WLaBX2Yzp3I/AAAAAAAAqZE/B94TD83Z4gYgfaa9hTeerUONGZky1yKlwCLcB/s640/personer_stefan_lofven.JPG" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Läs mina läppar: Du blir lurad. Av mig.</td></tr></tbody></table><a name='more'></a>Socialdemokraterna har tröttnat på att den sk premiepensionen förvaltas av spararna själva och faktiskt finns avsatta som existerande pensionskapital. Man vill därför avskaffa premiepensionssystemet.<br /><div><br />Socialförsäkringsminister Strandhäll säger <a href="https://www.svd.se/s-redo-overge-premiepensionen/om/allras-usla-avkastning">enligt SvD</a>:</div><div><blockquote class="tr_bq"><i>"Visst det var en bärande del av pensionsöverenskommelsen när det nya pensionssystemet kom på plats, men vi kommer inte framåt kunna stå bakom en konstruktion som utsätter våra sparare för en så här stor risk [...] Det här är ett extremt system och vi har en situation som ingen har kunnat förutse."</i></blockquote><div>Beskedet är tydligt. Premiepensionssystemet ska bort.<br /><blockquote class="tr_bq"><i>"Om de borgerliga inte är beredda att förändra systemet med premiepension i grunden, så är Socialdemokraterna beredda att överge systemet, som de aldrig varit riktigt förtjusta i."</i></blockquote>Kort sagt kommer Socialdemokraterna skrota PPM oavsett vad oppositionen säger. Så var det med den leken. Vi är rätt många som inte tagit premiepensionssystemet på allvar, väl medvetna om att det kommer avskaffas. Pensionssystemet är ständigt bara ett riksdagsbeslut från att göras om, och oppositionen orkar väl inte rösta emot avskaffandet.<br /><br />Lustiga är när Stefan Löfven säger följande:<br /><blockquote class="tr_bq"><i>"Ingen ska riskera att bli lurad i vårt allmänna pensionssystem"</i></blockquote>Samtidigt lurar man alltså bort premiepensionerna. I ett första steg ska man inte få förvalta dem hur man vill. Nästa steg kommer blir att de helt avskaffas och går in i statskassan likt övriga pensionsinbetalningar och man får en skuldsedel undertecknad Stefan Löfven istället. För socialdemokraterna har ju aldrig lurat någon...<br /><br /><b>Ett pensionssystem är och förblir alltid en syltburk för politikerna att stoppa sina giriga fingrar i - det handlar om enorma belopp och därmed frestelser som är alldeles för stora.</b><br /><b><br /></b>I dagarna sägs många ha fått sitt sk orange kuvert. Jag har inte fått det, eller så har jag som vanligt reflexmässigt slängt det oläst i pappersåtervinnen, väl medveten om att jag som 70-talist aldrig kommer få någon statlig pension värd namnet. Fast det sägs finnas någon siffran <i>hur länge man måste jobba</i>. Kan ju vara spännande att se hur den siffran kryper upp ett år varje år...</div></div>http://cornucopia.cornubot.se/2017/03/socialdemokraterna-tanker-nu-skrota-ppm.htmlnoreply@blogger.com (Cornucopia?)124tag:blogger.com,1999:blog-8354057230547055221.post-2878655652206236271Tue, 28 Feb 2017 20:13:00 +00002017-02-28T21:15:19.066+01:00folkhälsapolitiksjukvårdKomplettering om sjukhusbäddar - psykiatrireformen och äldrevårdenNågra korta kompletteringar kring antalet minskade sjukhusbäddar. Till modernisering och effektivisering av medicin och kirurgi, så kommer även psykiatrireformen och äldrevårdsreformerna, som minskat antalet sjukhusbäddar rejält. Det betyder inte att dessa inte får vård.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-lVqkdjndM1M/WLXYXH2g2gI/AAAAAAAAqYw/KXrXfscSOlMzj0jyp4QJhUEZMDQyPclaACLcB/s1600/1000.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="442" src="https://1.bp.blogspot.com/-lVqkdjndM1M/WLXYXH2g2gI/AAAAAAAAqYw/KXrXfscSOlMzj0jyp4QJhUEZMDQyPclaACLcB/s640/1000.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Antalet sjukhusbäddar per 100 invånare i Norden 1960 - 2012.</td></tr></tbody></table><a name='more'></a>I förra inlägget påtalade jag moderniseringen av vården (avseende kirurgi och medicin) som stor anledning till minskade antal sjukhusbäddar. Men antagligen minst lika viktiga är psykiatrireformen och tillhörande förbättrade mediciner (främst SSRI antar jag), samt reformerna av äldrevården.<br /><div><br /></div><div>Som bekant innebar psykiatrireformen att endast särskilt ömmande fall vårdas inlagda på sk <i>slutenvård</i>. Övriga under psykiatrisk behandling bor på egen hand och tillsammans med betydligt bättre mediciner med tillhörande självmedicinering har det faktiska behovet av institutionsvård av psykiatriska patienter minskat rejält. Det är knappast en förlust att sjukhusbäddar minskat, när man istället fått ut patienterna till att vara (i varierande grad) fungerande människor i samhället istället för på institution. I mänsklig värdighet och livskvalitet har öppenvården antagligen hjälpt många patienter, relativt hur det hade varit på 80-talet eller tidigare. Naturligtvis finns det mer eller mindre tragiska anekdoter om motsatsen.</div><div><br /></div><div>Det samma gäller äldre, som i allt högre grad kan bo kvar i hemmet och få vård där. Den sk <i>långvården</i> finns inte kvar. Även det är antagligen en rejäl livskvalitetshöjning jämfört med att ligga på institution. Men det finns förstås även här mer eller mindre tragiska anekdoter om motsatsen.</div><div><br /></div><div>Kom bara ihåg att anekdoter inte nödvändigtvis ger en korrekt bild av helheten. <a href="http://cornucopia.cornubot.se/2015/06/fakta-vs-anekdoter-medellivslangd-och.html">Exempelvis dör endast 2.8% av männen vid medellivslängden</a>. Det är ett medel, men det är inte vanligt.</div><div><br /></div><div><b>Det går inte att stirra sig blind på sjukhusbäddar som kvalitetsmätare på svensk sjukvård. Det är säkerligen så att antalet faktiska sjukhusbäddar på medicin och kirurgi inte ökat i samma takt som befolkningen, kanske rent av minskat, men det finns inget självändamål i att ha fem gånger så många sjukhusbäddar som idag.</b></div>http://cornucopia.cornubot.se/2017/02/komplettering-om-sjukhusbaddar.htmlnoreply@blogger.com (Cornucopia?)21tag:blogger.com,1999:blog-8354057230547055221.post-521715775671809281Tue, 28 Feb 2017 12:33:00 +00002017-02-28T17:10:26.959+01:00DanmarkFinlandfolkhälsaIslandNorgepolitiksjukvårdskuldkrisenAntalet sjukhusbäddar ner 78% sedan 1990Antalet sjukhusbäddar per capita i Sverige har sedan 1990 minskat med 78% och 83% sedan början av 70-talet. Det är dock inte någon unik svensk utveckling, utan beror främst på förändrade vårdmetoder. Sverige har dock lägst antal bäddar per capita i Norden, men undantaget Finland är skillnaden inte speciellt stor.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-0iybL4jJXw0/WLWg1iyDxwI/AAAAAAAAqYg/c7UjOhhDrGczAPRNe_KWnFofBfUJ6hO_QCLcB/s1600/1000.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="442" src="https://2.bp.blogspot.com/-0iybL4jJXw0/WLWg1iyDxwI/AAAAAAAAqYg/c7UjOhhDrGczAPRNe_KWnFofBfUJ6hO_QCLcB/s640/1000.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Antalet sjukhusbäddar per 1 000 invånare i Norden 1960 - 2012. Källa: Världsbanken</td></tr></tbody></table><br /><a name='more'></a><br />Det framhävs ofta hur antalet sjukhusbäddar per capita minskat kraftigt, vilket i sig stämmer. Sedan toppen på 70-talet har antalet bäddar per capita fallit med 83% och sedan 1990 med 78%. Just 1990 är intressant, då året inledde den sk <i>90-talskrisen</i>, där Sverige fick göra upp med det gamla så kallade välfärdssamhället, som levde på skuldsättning och devalveringar av en fast växelkurs. Som bekant fick sedan svensk välfärd ställas om till att faktiskt vara finansierad av skatteintäkter och inte av lån.<br /><div><br /></div><div>Men den stora anledningen till neddragningarna handlar om <i>modernisering av sjukvården</i>. Det finns inget självändamål i att patienter ska ligga kvar över natten för att de har fått eller ska få kirurgi. Istället har man gått över till <i>dagkirurgi</i> och att skicka hem patienter till vad som oftast är ett betydligt bättre boende i hemmet. Dock läggs man faktiskt ibland in även idag, även om man cyniskt annars kan konstatera att <i>sjukhusbäddar har bytts ut till korridorsovande</i>. För med reducerat antal bäddar finns ingen redundans vid stora skadeutfall, smittoutbrott eller t ex medicinskt stängande av avdelningar pga t ex smittorisk.</div><div><br /></div><div><b>Att det handlar om modernisering av sjukvården och inte om någon svensk <i>systemkollaps</i> påvisas av att bäddar per capita har gått ner även hos våra mer funktionsdugliga nordiska fränder. </b></div><div><br /></div><div>Kvaliteten på den svenska vården har faktiskt blivit bättre, och även om vi har minst antal sjukhusbäddar per capita i Norden så har vi bäst canceröverlevnad. <a href="http://cornucopia.cornubot.se/2014/05/sverige-bast-pa-cancervard-i-norden.html">Cancervården är inte perfekt, långt ifrån, men den är alltså bäst i Norden</a>. Man ska komma ihåg att den som fått vård vederbörande är nöjd med inte får några rubriker hos Aftonbladet. </div><div><br /></div><div><b>Sverige har dock minst antal bäddar per capita i Norden. Ja, Sverige är sämst i Norden på antalet sjukhusbäddar per capita, och även om det delvis beror på faktiska neddragningar av välfärden till en finansierad nivå så handlar det i mycket om en modernisering som speglas hos våra grannländer.</b></div><div><b><br /></b></div><div><div>2012 hade Sverige 2.7 bäddar per 1 000 invånare. Island var nere på 3.2 efter att till synes fått reducera rejält i spåren av skuldkrisen, likt Sverige gjorde på 90-talet. Norge ligger på 3.3, Danmark på 3.5 och Finland sticker ut med 5.5.</div></div><div><br /></div><div>Man kan konstatera att Norge och Danmark aldrig hade det höga antalet bäddar per capita som Sverige, Island och Finland hade, och förändringen av vården kanske därmed inte <i>upplevs</i> lika dramatisk i de länderna.<br /><br /><b>Att skicka hem sjuka människor är inte en systemkollaps, utan en avsiktlig och fullt medveten förändring av vården. Sedan kan hemskickandet mycket väl ha gått för långt, men det kan inte avgöras av rubriker om tragiska anekdoter i kvällspressen.</b></div><div><br /></div><div><i>Världsbankens siffror sträcker sig till 2012 och säger inget om utvecklingen sedan dess. Då data fram till 90-talet inte förekommer med varje år - även sporadiskt för Island hela tiden - så har senaste statistiken upprepats fram till nästa datapunkt - ingen extrapolering har skett. Det gör t ex att Islands bäddar ser ut att krascha 2002, men det handlar antagligen snarare om en linjär nedgång. Den svenska utvecklingen har dock data år för år sedan 90-talet. Extrapolerade grafer lämnas som en övning åt läsaren.</i></div>http://cornucopia.cornubot.se/2017/02/antalet-sjukhusbaddar-ner-78-sedan-1990.htmlnoreply@blogger.com (Cornucopia?)38tag:blogger.com,1999:blog-8354057230547055221.post-4926042377853741565Tue, 28 Feb 2017 09:44:00 +00002017-02-28T11:00:37.382+01:00försvarÖB: Försvarsmakten saknar 6.5 miljarder kronor - anskaffning luftvärn skjuts upp<blockquote class="tr_bq"><i>"Marginalerna är borta. Ekonomi som inte finns på 6.5 miljarder kronor." - </i>Överbefälhavare Micael Bydén</blockquote>Försvarsmakten saknar enligt ÖB Micael Bydén 6.5 miljarder kronor och måste dra ner på och försena ett antal projekt och förmågor. Ett antal viktiga investeringar måste skjutas på framtiden och aktuellt försvarsbeslut kan alltså inte genomföras i tid. Därtill viker oavsett förmågan efter 2020. Bland annat kommer inget medelräckviddigt luftvärn anskaffas om inte pengar skjuts till.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-F0aE1Vfv6mE/WLVGWhsEvkI/AAAAAAAAqYQ/u9pf2OgiERgCQUsPyXMicjqz8N6rUYT8ACLcB/s1600/svfm_micael_byden_fofrk_4.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://2.bp.blogspot.com/-F0aE1Vfv6mE/WLVGWhsEvkI/AAAAAAAAqYQ/u9pf2OgiERgCQUsPyXMicjqz8N6rUYT8ACLcB/s640/svfm_micael_byden_fofrk_4.JPG" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ÖB Micael Bydén.</td></tr></tbody></table><a name='more'></a>Främst får man skjuta upp investeringar till efter 2020, vilket innebär att ett antal system måste skjutas upp. Bland annat skjuter man rent konkret upp ledningssystem för brigad.<br /><div style="text-align: justify;"></div><div><br /></div><div>Regeringen har fått ett dokument på vad för brister och neddragningar man behöver göra, men handlingarna är av förklarliga skäl hemligstämplade då det avslöjar det svenska försvarets brister.<br /><br /><a href="http://www.forsvarsmakten.se/sv/aktuellt/2017/02/hart-arbete-kravs-for-starkt-formaga/">Försvarsmakten skriver på sin hemsida</a>:<br /><blockquote class="tr_bq"><i>"Urholkningseffekt och kostnadsökningar för underhåll och vidmakthållande av materielsystem medför att Försvarsmakten behöver <b>ta bort, reducera eller skjuta fram tidigare planerade åtgärder för drygt 6,5 miljarder</b>."</i></blockquote><b>I budgetunderlaget (<a href="http://www.forsvarsmakten.se/siteassets/4-om-myndigheten/dokumentfiler/budgetunderlag/budgetunderlag-2018/fm2016-10870-28-huvuddokument-bu-18.pdf">PDF</a>) nämns uttryckligen att <i>medelräckviddigt luftvärn inte kan anskaffas om inte man får mer pengar. </i></b><br /><blockquote class="tr_bq"><i>"Den hittills genomförda beredningen indikerar dock att anskaffningen av [medelräckviddigt luftvärn] är så omfattande att ekonomiska tillskott under perioden 2018 - 2020 erfordras."</i></blockquote>Kort sagt skjuter man upp anskaffningen av modernt luftvärn, istället för våra nuvarande HAWK-system från initialt 1960.</div>http://cornucopia.cornubot.se/2017/02/ob-forsvarsmakten-saknar-65-miljarder.htmlnoreply@blogger.com (Cornucopia?)31tag:blogger.com,1999:blog-8354057230547055221.post-2487564271668296642Tue, 28 Feb 2017 08:12:00 +00002017-02-28T10:11:04.607+01:00AftonbladetförsvarMiljöpartietpolitikRysslandRysk infiltration av Miljöpartiets riksdagskansli - diskutera i små grupperEnligt Aftonbladet får nu SD sällskap av Miljöpartiet, som också utsatts för infiltration av ryska intressen i riksdagskansliet. En hög politisk tjänsteman hos Miljöpartiet påstås ha fått sparken på grund av att vederbörande agerat inflytelseagent åt ryska ambassaden. Tjänstemannen förnekar allt och ingen vill offentligt säga något i ärendet.<br /><div style="text-align: justify;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-RIXmqMXpTVc/WLUuYR0oKfI/AAAAAAAAqXg/Vq_RWiIlx-ssdNqaQkxM4azEEYVJJQOdgCLcB/s1600/valurna.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="332" src="https://2.bp.blogspot.com/-RIXmqMXpTVc/WLUuYR0oKfI/AAAAAAAAqXg/Vq_RWiIlx-ssdNqaQkxM4azEEYVJJQOdgCLcB/s640/valurna.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Genomskinlig rysk valurna på ryska ambassaden med fönster för möjlighet att titta på vad individer röstar på. <a href="http://cornucopia.cornubot.se/2016/09/skenvalet-pa-ryska-ambassaden-i.html">Från Dumaskenvalet i höstas</a>.</td></tr></tbody></table><div><a name='more'></a>En hög fd politisk tjänsteman hos Miljöpartiets riksdagskansli har alltså fått sparken sedan vederbörande enligt uppgifter till Aftonbladet har gått ryska ambassadens ärenden i försök att få Miljöpartiet att acceptera diktaturen i Kremls linjer i internationell politik. Detta rimligtvis inklusive stöd för invasionen av Krim och Sydöstra Ukraina, samt hävande av sanktioner mot diktaturen och dess kreatur.</div><div><br /></div><div>Den fd höge (och då menas i organisationen och inte, ja, ni vet ... svamp och diverse örter) politiske tjänstemannen <a href="http://www.aftonbladet.se/nyheter/samhalle/a/PQdBJ/mp-mannen-om-anklagelserna-det-kan-jag-inte-tro">förnekar allt</a> och det påstås istället handla om en sprucken kärleksrelation mellan personer i organisationen. Alla inblandade förnekar allt och <a href="http://www.aftonbladet.se/nyheter/samhalle/a/epGjy/miljopartiet-vagrar-kommentera-uppgifterna">vägrar kommentera officiellt</a>, men anonymt är man <a href="http://www.aftonbladet.se/nyheter/samhalle/a/1aM2e/hog-mp-tjansteman-fick-sparken--efter-misstankta-rysskopplingar">väldigt tydliga till Aftonbladet</a>.</div><div><blockquote class="tr_bq"><i>"Men flera källor - både riksdagsledamöter och högt uppsatta MP-politiker - bekräftar för Aftonbladet att det i själva verket handlade om att mannens chef ansåg att han utgjorde en säkerhetsrisk. [...] Syftet med de ryska kontakterna var enligt Aftonbladets uppgiftslämnare att få partiet att ändra inställning till Ryssland och anamma en mer vänlig Rysslandspolitik. Men det fanns också farhågor att han försökt lämna uppgifter till Ryssland"</i></blockquote></div><div>Med tanke på de Kreml- och diktaturvänliga åsikterna hos vissa riksdagsledamöter hos Miljöpartiet är det förstås föga överraskande, men får ändå sägas vara positivt att man alltså gav mannen sparken. Han ska också sedan försökt få jobb på UD, men nekats på grund av att <i>"det finns en mapp på honom"</i>.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-w7GGEEFwXZc/WLUyyyc68eI/AAAAAAAAqXs/YhIWe1A2HEc-EbKKUlCtyV3wPnhrKRoHACLcB/s1600/IMG_0744.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="350" src="https://4.bp.blogspot.com/-w7GGEEFwXZc/WLUyyyc68eI/AAAAAAAAqXs/YhIWe1A2HEc-EbKKUlCtyV3wPnhrKRoHACLcB/s640/IMG_0744.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Ryska ambassaden på Gjörwellsgatan på Kungsholmen i Stockholm.</td></tr></tbody></table>Expressen har mer information. Bland annat ska tjänstemannen fått ersättning från ambassaden i form av presentkort (=transaktionerna kan inte spåras). Får man betalt av främmande makt kallas man för <i>agent</i> eller om man får betalt för att lämna uppgifter för <i>spion</i>. <a href="http://www.expressen.se/nyheter/mp-tjansteman-fick-sluta--var-sakerhetsrisk/">Expressen</a>:<br /><blockquote class="tr_bq"><i>"Tjänstemannen har haft kontakter med den ryska ambassaden och även fått gåvor därifrån i form av presentkort, säger en uppgiftslämnare.</i><i><br /></i><i>Syftet bakom de täta kontakterna med Rysslands ambassad ska ha varit att få MP att ändra riktning till en mer ryssvänlig inställning. Tjänstemannen har tidigare uttalat sig för sitt partis räkning i frågor som rör Nato och synen på Ryssland, och bland annat hävdat att närområdet är stabilt och att Sverige inte skulle ha något mer mervärde av ett medlemskap utan konstaterat att Ryssland skulle ha känt sig trängt av en sådan Natoexpansion."</i></blockquote>Samtidigt väcker förstås detta funderingar kring vilka inflyteleoperationer som går oupptäckta. Det är även intressant att Kreml och Ryssland alltså genomför dessa inflytelseoperationer rakt in i svenska riksdagen och mot ett regeringsparti. Genom sin fientlighet mot samarbete med västerländska demokratier inom NATO och EU har Miljöpartiet förstås öppnat upp för att på detta vis utsättas för yttre påverkan från diktaturen i Kreml.<br /><br />Sedan blir det otroligt roande när Aftonbladet först skriver och rubriksätter Ryssland för att i intervju sedan låta <a href="http://www.aftonbladet.se/nyheter/kolumnister/a/moKbl">Lena Mellin prata om <i>främmande makt</i></a>. Rent löjeväckande, men det är förstås positivt att Aftonbladet för en gångs skull faktiskt granskar ett av de två socialistiska regeringspartierna.<br /><br />Diskutera i små grupper.</div>http://cornucopia.cornubot.se/2017/02/rysk-infiltration-av-miljopartiets.htmlnoreply@blogger.com (Cornucopia?)39tag:blogger.com,1999:blog-8354057230547055221.post-2244965555964456356Tue, 28 Feb 2017 06:52:00 +00002017-02-28T07:54:17.500+01:00bilarkollektivtrafikskattStockholmTrängselskatten höjs i Stockholm - igenDagens Industri glädjer oss alla med att trängselskatterna ska höjas igen i Stockholm. Trafikverket vänder på varje sten för att få ut mer pengar ur de som fortfarande envisas med att köa på Essingeleden eller andra trevliga platser runt Stockholm.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-gR8_YVhd7mc/WLUc6kooDyI/AAAAAAAAqXI/1BxsYddznzI8Gv3JOlok18745QG3CFXEACLcB/s1600/IMG_4986.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://4.bp.blogspot.com/-gR8_YVhd7mc/WLUc6kooDyI/AAAAAAAAqXI/1BxsYddznzI8Gv3JOlok18745QG3CFXEACLcB/s640/IMG_4986.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Skattebetalare.</td></tr></tbody></table><a name='more'></a><div><a href="http://di.se/nyheter/trangselskatten-hojs-igen">Dagens Industri skriver följande</a>:</div><div><blockquote class="tr_bq"><i>"Skatten på Essingeleden höjs från 30 till 35 kronor under rusningstid.</i><i><br /></i><i>Skatt införs även på vissa dagar före helgdagar, som i dag är skattebefriade.</i><i><br /></i><i>Skatten tas ut redan från klockan 6 på morgonen, i stället som i dag från 6.30."</i></blockquote></div><div>Pengarna ska användas till att bygga en ny spårvagnslinje och att bygga ut tunnelbanan. DI skriver också vad argumentet var för införande av trängselskatt ursprungligen var:<br /><blockquote class="tr_bq"><i>"Även om trängselskatten är en viktig finansieringskälla är det ursprungliga syftet med skatten att minska utsläppen och öka framkomligheten på vägarna."</i></blockquote>Som bekant har det inte blivit så - vare sig i Göteborg eller Stockholm, utan effekterna varade högst tillfälligt tills bekvämlighet och tillvänjning infann sig.<br /><br /><b>Trängselskatt är numera endast ett sätt att få in mer pengar till statskassan och har inget med <i>trängsel</i> att göra. Korrekt benämning är <i>vägtullar</i> och inte något med trängsel. Höjningarna för att finansiera andra projekt visar tydligt att det handlar om <i>beskattning</i> och inget annat.</b><br /><b><br /></b>Något slut på intäktskällans existens finns inte heller. I Norge har man haft vägtullar specifikt för att uttryckligen finansiera specifika projekt. När tullarna har dragit in önskat belopp har de sedan avskaffats, men i Sverige är detta nu en permanent försörjningsväg för staten. Vilket är synd, då det gör att man inte vill bli av med biltrafiken på riktigt, för då blir man av med inkomsterna.</div>http://cornucopia.cornubot.se/2017/02/trangselskatten-hojs-i-stockholm-igen.htmlnoreply@blogger.com (Cornucopia?)57tag:blogger.com,1999:blog-8354057230547055221.post-4647589022017093930Mon, 27 Feb 2017 15:26:00 +00002017-02-27T16:28:29.928+01:00försvarkonsumismtramsMÖP-måndag: Casio G-Shock - när operatören själv får väljaSå var det dags för MÖP-måndag igen, och idag konstaterar vi att Casio G-Shock är det som gäller när Försvarsmaktens specialoperatörer själva får välja. Om ni funderat på vad det är för klocka som syns på Försvarsmaktens senaste SOG-film, så behöver ni inte fundera på vilken längre. Modellnummer följer i artikeln nedan, och priset är endast cirka 1000:- SEK.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-4-FtacihO9E/WLRBV1w3x6I/AAAAAAAAqWs/N3wKUPCOwxsxJl-L-fumsVYH8swW-KV5wCLcB/s1600/IMG_2467.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://2.bp.blogspot.com/-4-FtacihO9E/WLRBV1w3x6I/AAAAAAAAqWs/N3wKUPCOwxsxJl-L-fumsVYH8swW-KV5wCLcB/s640/IMG_2467.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Casio G-Shock Mudman på ärmen hos en civilklädd men beväpnad operatör i tjänst hos Försvarsmakten.</td></tr></tbody></table><a name='more'></a><div>Ända sedan det enligt reportaget och boken Black Hawk Down visade sig att amerikanska <i>Delta Force:s</i> operatörer använde prisvärda Casio G-Shock, har klockan fått en allt större spridning hos militärer och även svansen av MÖP:ar. Men också hos t ex blåljusmyndigheterna.</div><div><br /></div><div><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-VFP4heAAWYI/WLRC-_hv1NI/AAAAAAAAqW4/Pg-oxuI1hl8hAS01YeH3iNbmwAcQ9qLpACLcB/s1600/ber.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="116" src="https://3.bp.blogspot.com/-VFP4heAAWYI/WLRC-_hv1NI/AAAAAAAAqW4/Pg-oxuI1hl8hAS01YeH3iNbmwAcQ9qLpACLcB/s200/ber.png" width="200" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">G-Shock GD-100-1BER.<br /><a href="https://www.youtube.com/watch?v=xsZUcShUzRQ">Från 5:25 in i SOG-filmen</a>. Syns även<br />vid fler tillfällen.</td></tr></tbody></table>Senast syntes klockvarumärket i SOG-filmen, <a href="http://cornucopia.cornubot.se/2016/12/film-pa-sog-bekraftar-lwrci-ic-som-ny.html">där man visade upp Särskilda Operationsgruppens nya automatkarbiner</a>, som ni tidigare <a href="http://cornucopia.cornubot.se/2016/11/mop-nytt-ny-m4-baserad-automatkarbin.html">kunde läsa om här på bloggen</a>. Nu kan man förvisso välja vad man vill betala för sin G-Shock, men i SOG-filmen lägger MÖP:en mäkre till den enklare <a href="http://www.casio-europe.com/se/produkter/armbandsur/g-shock/gd-100-1ber/">G-Shock GD-100-1BER</a>, som kostar runt 1000:- SEK att köpa.<br /><br />Dyrare utgåvor inom G-Shockserien är t ex Rangeman för ca 3000 - 5000:- SEK, Mudmaster för 3000 - 8000:- SEK, Frogman för 11000 - 12000:-, Gravitymaster för 3000 - 12000:-, Gulfmaster för 5000 - 12000:- SEK och Waveman för upp till 22 000:-. Mudmanmodellen ovan är alltså lite dyrare än en tusenlapp.<br /><br />Men för fältbruk (eller åtminstone bordning av en passagerarfärja) går det uppenbarligen lika bra med en G-Shock för runt tusenlappen, om man ska lita på kofösarna i Särskilda operationsgruppen. Antagligen får man mycket hållbarhet för pengarna i det nedre prisintervallet.<br /><br /><i>Ingen form av ersättning har utgått för detta blogginlägg, som alltså bara är MÖP:erier och inte reklam.</i></div>http://cornucopia.cornubot.se/2017/02/mop-mandag-casio-g-shick-nar-operatoren.htmlnoreply@blogger.com (Cornucopia?)52tag:blogger.com,1999:blog-8354057230547055221.post-7572191339310713232Mon, 27 Feb 2017 11:04:00 +00002017-02-27T13:32:17.282+01:00bredbandförsvarinfrastrukturIT-branschenmobiltelefonitelefoniPatrik Fältström: Bygg inte ett eget statligt mobilt bredband<div>Svenska staten har stoppat utbyggnaden av nästa generations mobilnät, 5G, eftersom staten vill ha 700 Mhz-bandet för sig själva för en ersättare till Rakel. Det blir en dyrare, sämre och mindre redundant lösning än att låta staten vara en <i>virtuell operatör</i> som använder alla kommersiella aktörers nät samtidigt. Den svenske Internetpionjären Patrik Fältström är mycket kritisk.<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-rHpzaYv1jDw/WLQHrQEMFeI/AAAAAAAAqWc/YGs1tK4qhfcIub1KIcC03fgKYr-LO22OQCLcB/s1600/infrastruktur_teracom_mast_satila.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://2.bp.blogspot.com/-rHpzaYv1jDw/WLQHrQEMFeI/AAAAAAAAqWc/YGs1tK4qhfcIub1KIcC03fgKYr-LO22OQCLcB/s640/infrastruktur_teracom_mast_satila.JPG" width="640" /></a></div><br /></div><div><a name='more'></a>Kriskommunikationsradiosystemet Rakel kostar enbart i drift cirka 600 MSEK om året för staten. Till detta kommer abonnemangskostnader för de olika kundernas 60 000 användare.</div><div><br /></div><div>Rakel har dock inte tillräckliga funktioner för moderna datatjänster och staten vill därför bygga ett nytt kriskommunikationssystem, som ska ta upp 700 Mhz-bandet som i övriga världen ska användas för 5G - nästa generation mobilt bredband.</div><div><br /></div><div>Den legendariske svenska Internetpionjären <a href="http://sverigesradio.se/sida/artikel.aspx?programid=83&artikel=6639973">Patrik Fältström är mycket kritisk och menar att det vore bättre om staten skapar en virtuell operatör</a> som fungerar i samtliga kommersiella nät.</div><div><blockquote class="tr_bq"><i>"Den bästa lösningen är att man skapar en virtuell operatör som ledar ut sim-kort och så köper den virtuella operatören plats i alla nätägarens nät. Precis på samma sätt som Telia hyrde in sig Tele2:s 3G-nät, så skulle den här speciella virtuella operatören kunna finnas i alla nät i Sverige"</i></blockquote></div><div>Därmed får man inte bara tillgång till ett eget nät som kommer vara en prioriterad måltavla för en angripare - både frekvenserna och infrastrukturen - utan man får tillgång till fyra kommersiella nät med massivt bättre redundans. Behovet av kryptering sköts via en APN+VPN-lösning och man kan också ha system för trafikprioritering där den statliga virtuella operatören prioriteras i ett krisläge, så trängseln är inte ett problem.<br /><br />Därtill vill inte en angripare i hybridkriget slå ut befolkningens mobilkommunikation, eftersom informationsoperationer och desinformation via sociala medier inte fungerar då. Det minskar angreppsviljan mot de kommersiella näten, i ett försök att slå ut kriskommunikationen för blåljusmyndigheterna.<br /><br /><b>Det ter sig självklart att det är billigare att hyra in sig i fyra nät byggda för att hantera åtta miljoner kunder än att bygga ett eget nät för 60 000 användare. Med tanke på svensk upphandlingskompetens blir det ännu värre att bygga själv. Därtill kommer det statliga virtuella nätet fungera med vanliga kommersiella standardutrustning direkt från hyllan, istället för att likt med Rakel ta fram speciella terminaler i för branschen mycket små (och dyra) serier.</b><br /><b><br /></b>Naturligtvis får man välja 5G-terminaler som uppfyller säkerhetskraven, men likt inom 3G och 4G kommer det existera en uppsjö av sådana. Framför allt handlar det om mjukvara för kommunikationen. Man kommer oavsett vara beroende av externa leverantörer för utrustning, routrar, fiberanslutningar etc om man bygger ett eget nät. Man kommer oavsett behöva kryptering etc.</div><div><br />Istället hamnar nu Sverige rejält på efterkälken vad gäller 5G och den allmänna teknik- och samhällsutvecklingen.<br /><br /><b>En lösning med virtuell operatör i samtliga kommersiella nät kommer vara billigare, gå snabbare och ha högre redundans och bättre täckning än att bara ha tillgång till ett eget nät. Gör inte om de dyrbara misstagen med Rakel.</b></div>http://cornucopia.cornubot.se/2017/02/patrik-falstrom-bygg-inte-ett-eget.htmlnoreply@blogger.com (Cornucopia?)59tag:blogger.com,1999:blog-8354057230547055221.post-3545665673284073678Mon, 27 Feb 2017 08:39:00 +00002017-02-27T11:34:13.198+01:00filmintervjulitteraturTVvinEmmaFörfattar- och vinintervju med migEmma Kreü på <a href="http://bykw.se/2017/02/27/bykw-intervjuar-lars-wilderang/">podden <i>Because You Know Wines</i>, inriktad på litteratur och vin</a>, har gjort en författarintervju med mig nu när jag var i Stockholm förra veckan. Ni hittar den nedan. Pratar bland annat om Höstsol och TV-serien av Stjärnklart. Tipsar också om vin.<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-BGqJPet6Ac0/WLQAbuwDaiI/AAAAAAAAqWM/w8Tf1K5rxhYMLrFht8s9nV7a3Kx5YVcvACLcB/s1600/17016349_10154886956080569_912489904_o.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://3.bp.blogspot.com/-BGqJPet6Ac0/WLQAbuwDaiI/AAAAAAAAqWM/w8Tf1K5rxhYMLrFht8s9nV7a3Kx5YVcvACLcB/s640/17016349_10154886956080569_912489904_o.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Selfie med Emma Kreü och Lars Wilderäng. Foto: Emma Kreü</td></tr></tbody></table><div class="separator" style="clear: both; text-align: center;"></div><div><div style="text-align: justify;"></div><div><a name='more'></a></div><div>Ljudet lämnar väl en del att önska, men dra upp volymen maximalt så bör ni höra vad jag säger utom när jag sluddrar.</div><div><iframe allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/JrPmuN8d_6A" width="640"></iframe></div></div>http://cornucopia.cornubot.se/2017/02/forfattar-och-vinintervju-med-mig.htmlnoreply@blogger.com (Cornucopia?)25
\ No newline at end of file
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_cowboy.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_cowboy.xml
new file mode 100644
index 000000000..7022b7e99
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_cowboy.xml
@@ -0,0 +1,1875 @@
+
+
+
+ Cowboy Programmer
+ https://cowboyprogrammer.org/index.xml
+ Recent content on Cowboy Programmer
+ Hugo -- gohugo.io
+ en-us
+ Powered by [Hugo](//gohugo.io) and [Icarus Theme](http://themes.gohugo.io/theme/hugo-icarus/).
+ Wed, 28 Sep 2016 22:57:21 +0200
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Rebooting on wrong password
+ https://cowboyprogrammer.org/2016/09/reboot_machine_on_wrong_password/
+ Wed, 28 Sep 2016 22:57:21 +0200
+
+ https://cowboyprogrammer.org/2016/09/reboot_machine_on_wrong_password/
+
+
+
+ <p>Having an encrypted hard drive is all well and good, but chances are
+ that if someone is gonna steal your laptop, it’s probably not going to
+ be turned off. Most likely, it will be stolen in a powered-on
+ state. And so your encrypted hard drive doesn’t increase your security
+ at all since it’s currently unlocked.</p>
+
+ <p>In my mind, it’s a slight improvement if the computer somehow can
+ shutdown if someone is trying to gain access to it. That way, the hard
+ drive is no longer accessible and the number of possible attack
+ vectors go down drastically. And so, if you type the wrong password 3
+ times on my laptop, it shuts down.</p>
+
+ <p>This is accomplished by using <code>PAM</code>, and its ability to invoke an
+ arbitrary script as part of the login flow via <code>pam_exec.so</code>. The
+ script itself looks like this:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span><span style="color: #60a0b0; font-style: italic">#!/bin/bash</span>
+ <span style="color: #60a0b0; font-style: italic"># Do not add -eu, you need to allow empty variables here!</span>
+
+ <span style="color: #60a0b0; font-style: italic"># To be used with PAM. Look in /etc/pam.d for the script that your</span>
+ <span style="color: #60a0b0; font-style: italic"># screensaver etc uses. Typically it references common-account and common-auth.</span>
+ <span style="color: #60a0b0; font-style: italic">#</span>
+ <span style="color: #60a0b0; font-style: italic"># In common-auth, add this as the first line</span>
+ <span style="color: #60a0b0; font-style: italic">#auth optional pam_exec.so debug /path/to/wrongpassword.sh</span>
+ <span style="color: #60a0b0; font-style: italic">#</span>
+ <span style="color: #60a0b0; font-style: italic"># In common-account, add this as the first line</span>
+ <span style="color: #60a0b0; font-style: italic">#account required pam_exec.so debug /path/to/wrongpassword.sh</span>
+ <span style="color: #60a0b0; font-style: italic">#</span>
+
+ <span style="color: #bb60d5">COUNTFILE</span><span style="color: #666666">=</span><span style="color: #4070a0">"/var/log/failed_login_count"</span>
+
+ <span style="color: #60a0b0; font-style: italic"># Make sure file exists</span>
+ <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">[</span> ! -f <span style="color: #4070a0">"</span><span style="color: #70a0d0; font-style: italic">${</span><span style="color: #bb60d5">COUNFILE</span><span style="color: #70a0d0; font-style: italic">}</span><span style="color: #4070a0">"</span> <span style="color: #666666">]</span>;<span style="color: #007020; font-weight: bold">then</span>
+ touch <span style="color: #4070a0">"</span><span style="color: #70a0d0; font-style: italic">${</span><span style="color: #bb60d5">COUNTFILE</span><span style="color: #70a0d0; font-style: italic">}</span><span style="color: #4070a0">"</span>
+ chmod <span style="color: #40a070">777</span> <span style="color: #4070a0">"</span><span style="color: #70a0d0; font-style: italic">${</span><span style="color: #bb60d5">COUNTFILE</span><span style="color: #70a0d0; font-style: italic">}</span><span style="color: #4070a0">"</span>
+ <span style="color: #007020; font-weight: bold">fi</span>
+
+ <span style="color: #60a0b0; font-style: italic"># Read value in it</span>
+ <span style="color: #bb60d5">COUNT</span><span style="color: #666666">=</span><span style="color: #007020; font-weight: bold">$(</span>cat <span style="color: #4070a0">"</span><span style="color: #70a0d0; font-style: italic">${</span><span style="color: #bb60d5">COUNTFILE</span><span style="color: #70a0d0; font-style: italic">}</span><span style="color: #4070a0">"</span><span style="color: #007020; font-weight: bold">)</span>
+ <span style="color: #60a0b0; font-style: italic"># Increment it</span>
+ <span style="color: #bb60d5">COUNT</span><span style="color: #666666">=</span><span style="color: #007020; font-weight: bold">$((</span>COUNT+1<span style="color: #007020; font-weight: bold">))</span>
+ <span style="color: #007020">echo</span> <span style="color: #4070a0">"</span><span style="color: #70a0d0; font-style: italic">${</span><span style="color: #bb60d5">COUNT</span><span style="color: #70a0d0; font-style: italic">}</span><span style="color: #4070a0">"</span> > <span style="color: #4070a0">"</span><span style="color: #70a0d0; font-style: italic">${</span><span style="color: #bb60d5">COUNTFILE</span><span style="color: #70a0d0; font-style: italic">}</span><span style="color: #4070a0">"</span>
+
+ <span style="color: #60a0b0; font-style: italic"># if authentication</span>
+ <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">[</span> <span style="color: #4070a0">"</span><span style="color: #70a0d0; font-style: italic">${</span><span style="color: #bb60d5">PAM_TYPE</span><span style="color: #70a0d0; font-style: italic">}</span><span style="color: #4070a0">"</span> <span style="color: #666666">==</span> <span style="color: #4070a0">"auth"</span> <span style="color: #666666">]</span>; <span style="color: #007020; font-weight: bold">then</span>
+ <span style="color: #60a0b0; font-style: italic"># The count will be at 4 after 3 wrong tries</span>
+ <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">[</span> <span style="color: #4070a0">"</span><span style="color: #70a0d0; font-style: italic">${</span><span style="color: #bb60d5">COUNT</span><span style="color: #70a0d0; font-style: italic">}</span><span style="color: #4070a0">"</span> -ge <span style="color: #40a070">4</span> <span style="color: #666666">]</span>; <span style="color: #007020; font-weight: bold">then</span>
+ <span style="color: #60a0b0; font-style: italic"># Shutdown in 1 min</span>
+ <span style="color: #60a0b0; font-style: italic">#/usr/bin/shutdown --no-wall -h +1</span>
+ <span style="color: #60a0b0; font-style: italic"># This is a hack because the line above gives a segfault in logind</span>
+ <span style="color: #007020">echo</span> <span style="color: #4070a0">"0"</span> > <span style="color: #4070a0">"</span><span style="color: #70a0d0; font-style: italic">${</span><span style="color: #bb60d5">COUNTFILE</span><span style="color: #70a0d0; font-style: italic">}</span><span style="color: #4070a0">"</span>
+ systemctl poweroff
+ <span style="color: #007020; font-weight: bold">fi</span>
+ <span style="color: #60a0b0; font-style: italic"># If authentication succeeded, and we are now in account phase</span>
+ <span style="color: #007020; font-weight: bold">elif</span> <span style="color: #666666">[</span> <span style="color: #4070a0">"</span><span style="color: #70a0d0; font-style: italic">${</span><span style="color: #bb60d5">PAM_TYPE</span><span style="color: #70a0d0; font-style: italic">}</span><span style="color: #4070a0">"</span> <span style="color: #666666">==</span> <span style="color: #4070a0">"account"</span> <span style="color: #666666">]</span>; <span style="color: #007020; font-weight: bold">then</span>
+ <span style="color: #007020">echo</span> <span style="color: #4070a0">"0"</span> > <span style="color: #4070a0">"</span><span style="color: #70a0d0; font-style: italic">${</span><span style="color: #bb60d5">COUNTFILE</span><span style="color: #70a0d0; font-style: italic">}</span><span style="color: #4070a0">"</span>
+ <span style="color: #60a0b0; font-style: italic"># Cancel shutdown which was just issued</span>
+ shutdown -c
+ <span style="color: #007020; font-weight: bold">fi</span>
+
+ <span style="color: #007020">exit</span> <span style="color: #40a070">0</span>
+ </code></pre></div>
+
+ <p>On my Debian system, PAM ends up looking at <code>/etc/pam.d/common-auth</code>
+ and <code>/etc/pam.d/common-account</code>. These are invoked in different parts
+ of the authentication flow. In <code>common-auth</code>, add this as the first
+ line:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span>auth optional pam_exec.so debug /path/to/wrongpassword.sh
+ </code></pre></div>
+
+ <p>And then in <code>common-account</code>, add this as the first line:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span>account required pam_exec.so debug /path/to/wrongpassword.sh
+ </code></pre></div>
+
+ <p>You can try it immediately if it works. Lock your screen, and type the
+ wrong password 4 times. If it works, your computer should shut down.</p>
+
+ <h2 id="warning-do-not-enable-on-servers">WARNING: DO NOT ENABLE ON SERVERS</h2>
+
+ <p>This is <strong>NOT</strong> something you want to do on any machine. Most notably,
+ it’s probably a huge mistake to copy this verbatim on a machine which
+ accepts remote connections. In that case, you essentially enable
+ anyone to DOS you by entering the wrong password via SSH or
+ similarly. So don’t do this if you allow remote connections to your
+ machine (which shouldn’t be a thing on a laptop).</p>
+
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Compress all the images!
+ https://cowboyprogrammer.org/2016/08/zopfli_all_the_things/
+ Fri, 26 Aug 2016 13:17:40 +0200
+
+ https://cowboyprogrammer.org/2016/08/zopfli_all_the_things/
+
+
+
+ <p><em>Update 2016-11-22: Made the Makefile compatible with BSD sed (MacOS)</em></p>
+
+ <p>One advantage that static sites, such as those built by <a href="https://gohugo.io">Hugo</a>,
+ provide is fast loading times. Because there is no processing to be
+ done, no server side rendering, no database lookups, loading times are
+ just as fast as you can serve the files that make up the page. This
+ means that bandwidth becomes the primary bottleneck, which
+ incidentally is
+ <a href="https://webmasters.googleblog.com/2010/04/using-site-speed-in-web-search-ranking.html">one of the factors used by Google to calculate your search ranking</a>. See
+ also
+ <a href="https://developers.google.com/speed/pagespeed/insights">Pagespeed Insights</a>.</p>
+
+ <h2 id="compressing-images">Compressing images</h2>
+
+ <p>Because the largest pieces of a page typically consist of images, it
+ stands to reason that if we can make the images smaller, we can make
+ the page load faster. Luckily there exists methods that can compress
+ images <em>losslessly</em>. That means that the quality stays exactly the
+ same, the page only loads faster. That seemed like a no-brainer to me
+ so I compressed all the images on the site using <a href="http://advsys.net/ken/utils.htm">PNGout</a> as
+ <a href="https://blog.codinghorror.com/getting-the-most-out-of-png/">advised by Jeff Atwood</a>. I mean, who doesn’t
+ like free bandwidth?</p>
+
+ <p>A new algorithm called <a href="https://github.com/google/zopfli">Zopfli</a> (open sourced by Google,
+ <a href="https://blog.codinghorror.com/zopfli-optimization-literally-free-bandwidth/">also mentioned by Jeff</a>) claims even better
+ results than PNGout though. Results on this site’s images confirm
+ those claims. Running the tool on images <em>already compressed by
+ PNGout</em> gives output such as this:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span>./zopflipng --prefix="zopfli_" static/images/2014/Dec/Screenshot-from-2014-12-29-13-28-29.png
+ Optimizing static/images/2014/Dec/Screenshot-from-2014-12-29-13-28-29.png
+ Input size: 89420 (87K)
+ Result size: 90361 (88K). Percentage of original: 101.052%
+ Preserving original PNG since it was smaller
+
+ ./zopflipng --prefix="zopfli_" static/images/2014/Jun/Jenkins_install_git.png
+ Optimizing static/images/2014/Jun/Jenkins_install_git.png
+ Input size: 189406 (184K)
+ Result size: 166362 (162K). Percentage of original: 87.834%
+ Result is smaller
+
+ ./zopflipng --prefix="zopfli_" static/images/2014/Jun/jenkins_batch.png
+ Optimizing static/images/2014/Jun/jenkins_batch.png
+ Input size: 21933 (21K)
+ Result size: 16255 (15K). Percentage of original: 74.112%
+ Result is smaller
+
+ ./zopflipng --prefix="zopfli_" static/images/2014/Jun/jenkins_build_step.png
+ Optimizing static/images/2014/Jun/jenkins_build_step.png
+ Input size: 8184 (7K)
+ Result size: 6809 (6K). Percentage of original: 83.199%
+ Result is smaller
+
+ ./zopflipng --prefix="zopfli_" static/images/2014/Jun/jenkins_config_git.png
+ Optimizing static/images/2014/Jun/jenkins_config_git.png
+ Input size: 57897 (56K)
+ Result size: 47164 (46K). Percentage of original: 81.462%
+ Result is smaller
+ </code></pre></div>
+
+ <p>The first result in the example output shows a case where Zopfli would
+ actually have made the file bigger (because it was already compressed
+ by PNGout, remember). This is nothing you have to worry about because
+ it’s actually smart enough that it simply copies the original file in
+ that case.</p>
+
+ <p>Comparing to both before any compression, and PNGout, yielded the
+ following results:</p>
+
+ <table>
+ <thead>
+ <tr>
+ <th></th>
+ <th>Mean relative size</th>
+ </tr>
+ </thead>
+ <tbody>
+
+ <tr>
+ <td>Before</td>
+ <td>1.00</td>
+ </tr>
+
+ <tr>
+ <td>PNGout</td>
+ <td>0.84</td>
+ </tr>
+
+ <tr>
+ <td>ZopfliPNG</td>
+ <td>0.77</td>
+ </tr>
+
+ </tbody>
+ </table>
+
+ <p><a href="https://en.wikipedia.org/wiki/Box_plot">Box plot</a> of results on all images:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/zopfli_boxplot.png" alt="Compression results" /></p>
+
+ <p>Source files: <a href="https://cowboyprogrammer.org/csv/before.csv">before.csv</a>,
+ <a href="https://cowboyprogrammer.org/csv/pngout.csv">pngout.csv</a>, <a href="https://cowboyprogrammer.org/csv/zopfli.csv">zopfli.csv</a></p>
+
+ <p>And this is with the default arguments. It is possible squeeze yet a
+ couple of more bytes out of this if you’re willing to wait longer.</p>
+
+ <h2 id="automate-it-with-make">Automate it with Make</h2>
+
+ <p>Another joy of using a simple static site is that it is possible to
+ compose regular tools to do useful things. Tools like
+ <a href="https://www.gnu.org/software/make/">Make</a>. And we can use Make to build the site, as well as
+ compressing images which have not already been compressed. You could
+ do it manually for each new image that you add of course but be
+ honest, you <em>know</em> that you’re gonna forget to do it at some point. So
+ let’s automate it instead!</p>
+
+ <p>This is the Makefile that I use to build this site with, note that
+ <code>public</code> depends on <code>$(PNG_SENTINELS)</code>, so I literally can’t forget to
+ compress any new images added:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span><span style="color: #06287e">.PHONY</span><span style="color: #666666">:</span> help build server server-with-drafts clean zopfli
+
+ <span style="color: #bb60d5">PNG_SENTINELS</span><span style="color: #666666">:=</span> <span style="color: #007020; font-weight: bold">$(</span>shell find . -path ./public -prune -o -name <span style="color: #4070a0">'*.png'</span> -print | sed <span style="color: #4070a0">'s|\(.\+/\)\(.\+.png\)|\1.\2.zopfli|g'</span><span style="color: #007020; font-weight: bold">)</span>
+
+ <span style="color: #06287e">help</span><span style="color: #666666">:</span> <span style="color: #60a0b0; font-style: italic">## Print this help text</span>
+ @grep -E <span style="color: #4070a0">'^[a-zA-Z_-]+:.*?## .*$$'</span> <span style="color: #007020; font-weight: bold">$(</span>MAKEFILE_LIST<span style="color: #007020; font-weight: bold">)</span> | awk <span style="color: #4070a0">'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'</span>
+
+ <span style="color: #06287e">server</span><span style="color: #666666">:</span> <span style="color: #60a0b0; font-style: italic">## Run hugo server</span>
+ hugo server
+
+ <span style="color: #06287e">server-with-drafts</span><span style="color: #666666">:</span> <span style="color: #60a0b0; font-style: italic">## Run hugo server and include drafts</span>
+ hugo server -D
+
+ <span style="color: #06287e">build</span><span style="color: #666666">:</span> public <span style="color: #60a0b0; font-style: italic">## Build site (will also compress images using zopfli)</span>
+
+ <span style="color: #06287e">zopfli</span><span style="color: #666666">:</span> <span style="color: #007020; font-weight: bold">$(</span><span style="color: #bb60d5">PNG_SENTINELS</span><span style="color: #007020; font-weight: bold">)</span> <span style="color: #60a0b0; font-style: italic">## Compress new images using zopfli</span>
+
+ <span style="color: #06287e">clean</span><span style="color: #666666">:</span> <span style="color: #60a0b0; font-style: italic">## Remove the built directory</span>
+ @rm -rf public
+
+ <span style="color: #06287e">public</span><span style="color: #666666">:</span> <span style="color: #007020; font-weight: bold">$(</span><span style="color: #bb60d5">PNG_SENTINELS</span><span style="color: #007020; font-weight: bold">)</span>
+ @rm -rf public
+ hugo
+
+ <span style="color: #60a0b0; font-style: italic"># Zopfli sentinel rule, assumes zopflipng binary is in the same folder</span>
+ <span style="color: #06287e">.%.png.zopfli</span><span style="color: #666666">:</span> %.png
+ ./zopflipng --prefix<span style="color: #666666">=</span><span style="color: #4070a0">"zopfli_"</span> $<
+ @mv <span style="color: #007020; font-weight: bold">$(</span>dir $<<span style="color: #007020; font-weight: bold">)</span>zopfli_<span style="color: #007020; font-weight: bold">$(</span>notdir $<<span style="color: #007020; font-weight: bold">)</span> $<
+ @touch <span style="color: #bb60d5">$@</span>
+ </code></pre></div>
+
+ <p>For best performance, run make with parallel jobs (change 4 to your
+ number CPUs): <code>make -j4 zopfli</code>.</p>
+
+ <p>To know which files have already been compressed without actually
+ running Zopfli on it again (which takes a while), sentinel files are
+ created with this pattern: <code>.<imgfilename>.zopfli</code>. Thus, the next
+ time around, zopfli is only invoked for files which have <em>not</em> already
+ been compressed, making it a one-time operation. And when everything
+ has already been compressed, you’ll just get this:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span>make: Nothing to be done for 'zopfli'.
+ </code></pre></div>
+
+
+
+
+ <hr/>
+ <p>Other posts in the <b>Migrating from Ghost to Hugo</b> series:</p>
+
+
+ <ul class="series">
+
+ <li>2016-08-26 —
+
+ Compress all the images!
+
+ </li>
+
+ <li>2016-07-25 —
+
+ <a href="https://cowboyprogrammer.org/2016/07/migrating_from_ghost_to_hugo/">Migrating from Ghost to Hugo</a>
+
+ </li>
+
+ </ul>
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Migrating from Ghost to Hugo
+ https://cowboyprogrammer.org/2016/07/migrating_from_ghost_to_hugo/
+ Mon, 25 Jul 2016 23:55:38 +0200
+
+ https://cowboyprogrammer.org/2016/07/migrating_from_ghost_to_hugo/
+
+
+
+ <p>So I recently migrated this site from <a href="https://ghost.org">Ghost</a> to <a href="https://gohugo.io">Hugo</a>
+ after reading a nice article about the Hugo in
+ <a href="https://www.linuxvoice.com/download-linux-voice-issue-20/">Linux Voice #20</a> (funnily enough, the same issue also
+ features an article about Ghost). I originally made the switch to
+ Ghost from <a href="https://jekyllrb.com/">Jekyll</a> back in 2014 or so mainly because I could
+ not find a good theme to use. Ghost also seemed to have a lot of cool
+ features and it’s fun to try new things.</p>
+
+ <p>I think it’s safe to say that I am hardly a prolific blogger. I mainly
+ write about stuff which I personally cannot find on the web which I
+ think should exist, because I will likely need it myself sometime in
+ the future. So it’s hardly a surprise that I am not in the target
+ audience for Ghost.</p>
+
+ <h2 id="things-about-ghost-which-annoy-me">Things about Ghost which annoy me</h2>
+
+ <ul>
+ <li>It’s written in NodeJS — people who think JS is a good server
+ language also tend to think that it’s a good idea to depend on just
+ about any package, and download it in every single build. Which
+ becomes really <a href="http://www.theregister.co.uk/2016/03/23/npm_left_pad_chaos/">funny sometimes</a>.</li>
+ <li>Poor selection of <a href="http://marketplace.ghost.org/">themes</a> — this is subjective of
+ course, but it seems to me that the free options don’t have much in
+ terms of diversity. Heck, they even call it a <em>marketplace</em> which
+ rubs me the wrong way.</li>
+ <li>Themes end up being quite reliant on JS if you want necessary
+ features like syntax highlighting on code snippets — I often
+ browse with JS disabled and should be able to view my own site.</li>
+ <li>Markdown parser treats newlines as significant — meaning you can’t
+ have properly aligned paragraphs in your editor.</li>
+ </ul>
+
+ <p>That last point irritates me deeply but it’s not as bad as the next point.</p>
+
+ <ul>
+ <li>You can effectively lock an account by entering the wrong password 3
+ times.</li>
+ </ul>
+
+ <p>This requires some explanation. So Ghost, targeting teams of bloggers
+ really, naturally have an account system much like Wordpress. Now, as
+ I was surveying the security status of other services I am running, I
+ was wondering how Ghost handled someone trying to brute force your
+ account and decided to simply try it out. Type the wrong password once
+ too many, and this happens:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/ghost_wrong_password.png" alt="Ghost: typing the wrong password too many times locks your account" /></p>
+
+ <p>It doesn’t lock it for a single IP address (I tried from several), it
+ locks the entire account. Effectively, someone can just set up a
+ script to try an account indefinitely simply with the intention to
+ block someone from logging in.</p>
+
+ <p>The log doesn’t even show login attempts, so there is no way to
+ implement sensible blocking strategies using something like <a href="http://www.fail2ban.org">fail2ban</a>.</p>
+
+ <p>The whole thing left a bad taste my mouth so it was a very suitable timing to read an article on <a href="https://gohugo.io">Hugo</a>.</p>
+
+ <h2 id="things-about-hugo-which-excite-me">Things about Hugo which excite me</h2>
+
+ <ul>
+ <li>Markdown parser treats newlines correctly</li>
+ <li>It’s a static site generator and not a service — this meant 100MB
+ (10%) of RAM became available on my server and there is no account
+ to hack (or block).</li>
+ <li>Supports everything of Ghost (that I am aware of).</li>
+ <li>The simplicity of Hugo makes it <a href="https://npf.io/2014/08/making-it-a-series/">quite painless</a> to
+ do useful things compared to
+ <a href="https://github.com/TryGhost/Ghost/issues/4818">ignored feature requests</a> for the same in Ghost.</li>
+ <li>Can do server side syntax highlighting using Pygments.</li>
+ <li>Some really nice <a href="http://themes.gohugo.io/">themes</a> are available, and they are
+ all free.</li>
+ </ul>
+
+ <h2 id="migrating-all-data-from-ghost">Migrating all data from Ghost</h2>
+
+ <p>Migrating from Ghost also turned about to be really painless. There
+ were several scripts around for exactly this but they all turned out
+ to be written in <a href="https://gist.github.com/vjeantet/d1f6cf824a2344dd6b4e">odd languages</a>, and did not actually
+ migrate all the metadata in Ghost. So I wrote my own in Python with
+ these <em>killer features</em>:</p>
+
+ <ul>
+ <li>Migrates tags.</li>
+ <li>Migrates dates.</li>
+ <li>Migrates drafts as drafts.</li>
+ <li>Creates aliases in your posts which makes sure that old permalinks
+ will still work!</li>
+ <li>Migrates cover pictures as banner images, just select a theme which
+ support them.</li>
+ <li>Rewrites all relative links so they all still work (this includes
+ images).</li>
+ <li>Code blocks with language definitions like <code>```language-java</code>
+ are changed to <code>```java</code>.</li>
+ </ul>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span><span style="color: #60a0b0; font-style: italic">#!/usr/bin/env python3</span>
+ <span style="color: #60a0b0; font-style: italic"># -*- coding: utf-8 -*-</span>
+ <span style="color: #4070a0; font-style: italic">'''</span>
+ <span style="color: #4070a0; font-style: italic">A simple program which migrates an exported Ghost blog to Hugo.</span>
+ <span style="color: #4070a0; font-style: italic">It assumes your blog is using the hugo-icarus theme, but should</span>
+ <span style="color: #4070a0; font-style: italic">work for any theme. The script will migrate your posts, including</span>
+ <span style="color: #4070a0; font-style: italic">tags and banner images. Furthermore, it will make sure that</span>
+ <span style="color: #4070a0; font-style: italic">all your old post urls will keep working by adding aliases to them.</span>
+
+ <span style="color: #4070a0; font-style: italic">The only thing you need to do yourself is copying the `images/`</span>
+ <span style="color: #4070a0; font-style: italic">directory in your ghost directory to `static/images/` in your hugo</span>
+ <span style="color: #4070a0; font-style: italic">directory. That way, all images will work. The script will rewrite</span>
+ <span style="color: #4070a0; font-style: italic">all urls linking to `/content/images` to just `/images`.</span>
+ <span style="color: #4070a0; font-style: italic">'''</span>
+
+ <span style="color: #007020; font-weight: bold">import</span> <span style="color: #0e84b5; font-weight: bold">argparse</span>
+ <span style="color: #007020; font-weight: bold">import</span> <span style="color: #0e84b5; font-weight: bold">json</span>
+ <span style="color: #007020; font-weight: bold">from</span> <span style="color: #0e84b5; font-weight: bold">datetime</span> <span style="color: #007020; font-weight: bold">import</span> date
+ <span style="color: #007020; font-weight: bold">from</span> <span style="color: #0e84b5; font-weight: bold">os</span> <span style="color: #007020; font-weight: bold">import</span> path
+ <span style="color: #007020; font-weight: bold">from</span> <span style="color: #0e84b5; font-weight: bold">collections</span> <span style="color: #007020; font-weight: bold">import</span> defaultdict
+ <span style="color: #007020; font-weight: bold">import</span> <span style="color: #0e84b5; font-weight: bold">re</span>
+
+ _post <span style="color: #666666">=</span> <span style="color: #4070a0">'''</span>
+ <span style="color: #4070a0">+++</span>
+ <span style="color: #4070a0">date = "{date}"</span>
+ <span style="color: #4070a0">draft = {draft}</span>
+ <span style="color: #4070a0">title = """{title}"""</span>
+ <span style="color: #4070a0">slug = "{slug}"</span>
+ <span style="color: #4070a0">tags = {tags}</span>
+ <span style="color: #4070a0">banner = "{banner}"</span>
+ <span style="color: #4070a0">aliases = {aliases}</span>
+ <span style="color: #4070a0">+++</span>
+
+ <span style="color: #4070a0">{markdown}</span>
+ <span style="color: #4070a0">'''</span>
+
+
+ <span style="color: #007020; font-weight: bold">def</span> <span style="color: #06287e">migrate</span>(filepath, hugodir):
+ <span style="color: #4070a0; font-style: italic">'''</span>
+ <span style="color: #4070a0; font-style: italic"> Parse the Ghost json file and write post files</span>
+ <span style="color: #4070a0; font-style: italic"> '''</span>
+ <span style="color: #007020; font-weight: bold">with</span> <span style="color: #007020">open</span>(filepath, <span style="color: #4070a0">"r"</span>) <span style="color: #007020; font-weight: bold">as</span> fp:
+ ghost <span style="color: #666666">=</span> json<span style="color: #666666">.</span>load(fp)
+
+ data <span style="color: #666666">=</span> ghost[<span style="color: #4070a0">'db'</span>][<span style="color: #40a070">0</span>][<span style="color: #4070a0">'data'</span>]
+
+ tags <span style="color: #666666">=</span> {}
+ <span style="color: #007020; font-weight: bold">for</span> tag <span style="color: #007020; font-weight: bold">in</span> data[<span style="color: #4070a0">"tags"</span>]:
+ tags[tag[<span style="color: #4070a0">"id"</span>]] <span style="color: #666666">=</span> tag[<span style="color: #4070a0">"name"</span>]
+
+ posttags <span style="color: #666666">=</span> defaultdict(<span style="color: #007020">list</span>)
+
+ <span style="color: #007020; font-weight: bold">for</span> posttag <span style="color: #007020; font-weight: bold">in</span> data[<span style="color: #4070a0">"posts_tags"</span>]:
+ posttags[posttag[<span style="color: #4070a0">"post_id"</span>]]<span style="color: #666666">.</span>append(tags[posttag[<span style="color: #4070a0">"tag_id"</span>]])
+
+ <span style="color: #007020; font-weight: bold">for</span> post <span style="color: #007020; font-weight: bold">in</span> data[<span style="color: #4070a0">'posts'</span>]:
+ draft <span style="color: #666666">=</span> <span style="color: #4070a0">"true"</span> <span style="color: #007020; font-weight: bold">if</span> post[<span style="color: #4070a0">"status"</span>] <span style="color: #666666">==</span> <span style="color: #4070a0">"draft"</span> <span style="color: #007020; font-weight: bold">else</span> <span style="color: #4070a0">"false"</span>
+ ts <span style="color: #666666">=</span> <span style="color: #007020">int</span>(post[<span style="color: #4070a0">"created_at"</span>]) <span style="color: #666666">/</span> <span style="color: #40a070">1000</span>
+
+ banner <span style="color: #666666">=</span> <span style="color: #4070a0">""</span> <span style="color: #007020; font-weight: bold">if</span> post[<span style="color: #4070a0">"image"</span>] <span style="color: #007020; font-weight: bold">is</span> <span style="color: #007020">None</span> <span style="color: #007020; font-weight: bold">else</span> post[<span style="color: #4070a0">"image"</span>]
+ <span style="color: #60a0b0; font-style: italic"># /content/ should not be part of uri anymore</span>
+ banner <span style="color: #666666">=</span> re<span style="color: #666666">.</span>sub(<span style="color: #4070a0">"^.*/content[s]?/"</span>, <span style="color: #4070a0">"/"</span>, banner)
+
+ target <span style="color: #666666">=</span> path<span style="color: #666666">.</span>join(hugodir, <span style="color: #4070a0">"content/post"</span>,
+ <span style="color: #4070a0">"{}.md"</span><span style="color: #666666">.</span>format(post[<span style="color: #4070a0">"slug"</span>]))
+
+ aliases <span style="color: #666666">=</span> [<span style="color: #4070a0">"/{}/"</span><span style="color: #666666">.</span>format(post[<span style="color: #4070a0">"slug"</span>])]
+
+ <span style="color: #007020; font-weight: bold">print</span>(<span style="color: #4070a0">"Migrating '{}' to {}"</span><span style="color: #666666">.</span>format(post[<span style="color: #4070a0">"title"</span>],
+ target))
+
+ hugopost <span style="color: #666666">=</span> _post<span style="color: #666666">.</span>format(markdown<span style="color: #666666">=</span>post[<span style="color: #4070a0">"markdown"</span>],
+ title<span style="color: #666666">=</span>post[<span style="color: #4070a0">"title"</span>],
+ draft<span style="color: #666666">=</span>draft,
+ slug<span style="color: #666666">=</span>post[<span style="color: #4070a0">"slug"</span>],
+ date<span style="color: #666666">=</span>date<span style="color: #666666">.</span>fromtimestamp(ts)<span style="color: #666666">.</span>isoformat(),
+ tags<span style="color: #666666">=</span>posttags[post[<span style="color: #4070a0">"id"</span>]],
+ banner<span style="color: #666666">=</span>banner,
+ aliases<span style="color: #666666">=</span>aliases)
+
+ <span style="color: #60a0b0; font-style: italic"># this is no longer relevant</span>
+ hugopost <span style="color: #666666">=</span> hugopost<span style="color: #666666">.</span>replace(<span style="color: #4070a0">"```language-"</span>, <span style="color: #4070a0">"```"</span>)
+ <span style="color: #60a0b0; font-style: italic"># /content/ should not be part of uri anymore</span>
+ hugopost <span style="color: #666666">=</span> hugopost<span style="color: #666666">.</span>replace(<span style="color: #4070a0">"/content/"</span>, <span style="color: #4070a0">"/"</span>)
+ hugopost <span style="color: #666666">=</span> re<span style="color: #666666">.</span>sub(<span style="color: #4070a0">"^.*/content[s]?/"</span>, <span style="color: #4070a0">"/"</span>, hugopost)
+
+ <span style="color: #007020; font-weight: bold">with</span> <span style="color: #007020">open</span>(target, <span style="color: #4070a0">'w'</span>) <span style="color: #007020; font-weight: bold">as</span> fp:
+ <span style="color: #007020; font-weight: bold">print</span>(hugopost, <span style="color: #007020">file</span><span style="color: #666666">=</span>fp)
+
+
+ <span style="color: #007020; font-weight: bold">def</span> <span style="color: #06287e">main</span>():
+ parser <span style="color: #666666">=</span> argparse<span style="color: #666666">.</span>ArgumentParser(
+ description<span style="color: #666666">=</span><span style="color: #4070a0">"Migrate an exported Ghost blog to Hugo"</span>)
+ req <span style="color: #666666">=</span> parser<span style="color: #666666">.</span>add_argument_group(title<span style="color: #666666">=</span><span style="color: #4070a0">"required arguments"</span>)
+ req<span style="color: #666666">.</span>add_argument(<span style="color: #4070a0">"-f"</span>, <span style="color: #4070a0">"--file"</span>, help<span style="color: #666666">=</span><span style="color: #4070a0">"JSON file exported from Ghost"</span>,
+ required<span style="color: #666666">=</span><span style="color: #007020">True</span>)
+ req<span style="color: #666666">.</span>add_argument(<span style="color: #4070a0">"-d"</span>, <span style="color: #4070a0">"--dir"</span>, help<span style="color: #666666">=</span><span style="color: #4070a0">"Directory (root) of Hugo site"</span>,
+ required<span style="color: #666666">=</span><span style="color: #007020">True</span>)
+
+ args <span style="color: #666666">=</span> parser<span style="color: #666666">.</span>parse_args()
+
+ migrate(args<span style="color: #666666">.</span>file, args<span style="color: #666666">.</span>dir)
+
+
+ <span style="color: #007020; font-weight: bold">if</span> <span style="color: #bb60d5">__name__</span> <span style="color: #666666">==</span> <span style="color: #4070a0">"__main__"</span>:
+ main()
+ </code></pre></div>
+
+ <p>Next post, I might write about what changes I made to the theme, and
+ some nifty Nginx tricks you can use to stay compatible with old links.</p>
+
+
+
+
+ <hr/>
+ <p>Other posts in the <b>Migrating from Ghost to Hugo</b> series:</p>
+
+
+ <ul class="series">
+
+ <li>2016-08-26 —
+
+ <a href="https://cowboyprogrammer.org/2016/08/zopfli_all_the_things/">Compress all the images!</a>
+
+ </li>
+
+ <li>2016-07-25 —
+
+ Migrating from Ghost to Hugo
+
+ </li>
+
+ </ul>
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Set refresh rate of screen from script
+ https://cowboyprogrammer.org/2016/05/set-refresh-rate-of-screen-from-script/
+ Wed, 18 May 2016 00:00:00 +0000
+
+ https://cowboyprogrammer.org/2016/05/set-refresh-rate-of-screen-from-script/
+
+ <p>Getting a great new 100 Hz Ultra Wide monitor does not come without its share of tweaking. So it turns out that the refresh you set on your monitor in Nvidia settings (as explained in a <a href="https://cowboyprogrammer.org/nvidia-gsync-on-linux/">previous post</a> does not apply to all the display ports. They apparently count as different screens with different settings or something.</p>
+
+ <p>So, here’s a handy script which you can add to your window manager’s autostart applications to set the refresh rate and resolution of your screen, regardless of which actual port you use:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span><span style="color: #60a0b0; font-style: italic">#!/bin/bash -eu</span>
+ <span style="color: #bb60d5">RES</span><span style="color: #666666">=</span><span style="color: #4070a0">"3440x1440"</span>
+ <span style="color: #bb60d5">RR</span><span style="color: #666666">=</span><span style="color: #4070a0">"100"</span>
+
+ <span style="color: #60a0b0; font-style: italic"># Do for every output, so that it doesn't matter where you plug in</span>
+ <span style="color: #60a0b0; font-style: italic"># your monitor.</span>
+ <span style="color: #007020; font-weight: bold">for</span> output in <span style="color: #007020; font-weight: bold">$(</span>xrandr | grep <span style="color: #4070a0">"DP-"</span> | sed -e <span style="color: #4070a0">"s/\(DP-.\).*/\1/"</span><span style="color: #007020; font-weight: bold">)</span>; <span style="color: #007020; font-weight: bold">do</span>
+ <span style="color: #007020">echo</span> <span style="color: #4070a0">"Trying to set mode on </span><span style="color: #bb60d5">$output</span><span style="color: #4070a0">"</span>
+ <span style="color: #007020; font-weight: bold">if</span> xrandr --output <span style="color: #4070a0">"</span><span style="color: #bb60d5">$output</span><span style="color: #4070a0">"</span> --mode <span style="color: #4070a0">"</span><span style="color: #bb60d5">$RES</span><span style="color: #4070a0">"</span> -r <span style="color: #4070a0">"</span><span style="color: #bb60d5">$RR</span><span style="color: #4070a0">"</span>; <span style="color: #007020; font-weight: bold">then</span>
+ <span style="color: #007020">echo</span> <span style="color: #4070a0">"Success: </span><span style="color: #bb60d5">$RES</span><span style="color: #4070a0"> </span><span style="color: #bb60d5">$RR</span><span style="color: #4070a0"> Hz set on </span><span style="color: #bb60d5">$output</span><span style="color: #4070a0">"</span>
+ <span style="color: #007020; font-weight: bold">fi</span>
+ <span style="color: #007020; font-weight: bold">done</span>
+ </code></pre></div>
+
+ <p>It iterates over all the display ports on your graphics card, so it doesn’t matter where you plug your monitor in.</p>
+
+ <p>In XFCE, you’d add this script to <em>Application Autostart</em>:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2016/05/Session-and-Startup_033.png" alt="XFCE Application Autostart" /></p>
+
+
+
+
+ <hr/>
+ <p>Other posts in the <b>Linux 100Hz gaming</b> series:</p>
+
+
+ <ul class="series">
+
+ <li>2016-05-18 —
+
+ Set refresh rate of screen from script
+
+ </li>
+
+ <li>2016-03-05 —
+
+ <a href="https://cowboyprogrammer.org/2016/03/nvidia-gsync-on-linux/">Nvidia G-Sync and Linux</a>
+
+ </li>
+
+ </ul>
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Fixing the up button in Python shell history
+ https://cowboyprogrammer.org/2016/04/fixing-the-up-button-in-python-shell-history/
+ Sat, 02 Apr 2016 00:00:00 +0000
+
+ https://cowboyprogrammer.org/2016/04/fixing-the-up-button-in-python-shell-history/
+
+ <p>In case your python/ipython shell doesn’t have a working history, e.g. pressing ↑ only prints some nonsensical <code>^[[A</code>, then you are missing either the <code>readline</code> or <code>ncurses</code> library.</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2016/04/Selection_021.png" alt="Python shell where up doesn't work" /></p>
+
+ <p>Ipython is more descriptive that something is wrong, but if you’re in the habit of mostly using python as a quick calculator, you might never notice:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2016/04/Selection_022.png" alt="iPython shell where up doesn't work" /></p>
+
+ <p>If you’re using <a href="http://conda.pydata.org/miniconda.html">Miniconda</a> then just do:</p>
+
+ <pre><code>conda install ncurses readline
+ </code></pre>
+
+ <p>And ↑ should work:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2016/04/Selection_023.png" alt="iPython with working up" /></p>
+
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Nvidia G-Sync and Linux
+ https://cowboyprogrammer.org/2016/03/nvidia-gsync-on-linux/
+ Sat, 05 Mar 2016 00:00:00 +0000
+
+ https://cowboyprogrammer.org/2016/03/nvidia-gsync-on-linux/
+
+
+
+ <p>After getting a fancy new monitor with G-Sync support, I was eager to try it out in my Linux gaming setup. While Nvidia fully supports G-Sync in their Linux drivers, it turns out that other components of the system can get in the way. As explained by a <a href="https://devtalk.nvidia.com/default/topic/854184/gsync-is-not-working/?offset=1">post on the Nvidia forums</a>:</p>
+
+ <blockquote>
+ <p>For G-SYNC to work, the application has to be able to flip and the symptoms you’re describing here sound like it’s not able to flip in your configuration. There are a variety of reasons why flipping might not be working, but the most likely culprits here are either the compositor getting in the way, or the game not being completely full-screen. The full-screen requirement includes the game being completely unoccluded, so if your window manager is drawing something on top of the game, even just by one pixel, it will prevent flipping. Full-screen also means that it has to cover the entire X screen, which includes both monitors if you have them both enabled.</p>
+
+ <p>Can you please try a different window manager / desktop environment to see if the behavior changes?</p>
+ </blockquote>
+
+ <p>Since only a minority of PC-gamers are actually on Linux, and only a minority of those actually have G-Sync capable monitors, Googling for assistance was… challenging. So, for any other Linux gamers out there, here is a short guide on how to enable G-Sync and verify that it works. Some of the steps are XFCE specific, as this is my window manager of choice on my gaming PC. If you are using a different window manager, you’ll have to look through your options to find the equivalent settings.</p>
+
+ <h2 id="nvidia-settings">Nvidia settings</h2>
+
+ <ul>
+ <li>Sync to VBlank: Optional</li>
+ <li>Allow Flipping: Required</li>
+ <li>Allow G-SYNC: Required</li>
+ <li>Enable G-SYNC Visual Indicator: Optional</li>
+ </ul>
+
+ <p>The only two required settings are <em>flipping</em> and <em>G-Sync</em>, the others are optional. Enabling <em>Sync to VBlank</em> (VSync) in combination with G-Sync only prevents the GPU from generating an FPS beyond your monitor’s max refresh rate (which you can’t see anyway). It is turned off below the max refresh rate when G-Sync is enabled.</p>
+
+ <p>The visual indicator is useful here to see that G-Sync is working. If all goes well, you should see a green “G-SYNC” text in the corner when running a game.</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2016/03/NVIDIA-X-Server-Settings_007.png" alt="Nvidia settings" /></p>
+
+ <h2 id="disable-compositor">Disable compositor</h2>
+
+ <p>As mentioned in the forum post, a compositor will prevent G-Sync from activating because essentially something is rendering above the game. The same reason prevents G-Sync from working in Window mode (unlike Windows, where G-Sync does not require fullscreen).</p>
+
+ <p>For XFCE, go to <em>Window Manager Tweaks</em> under <em>Settings</em>
+ <img src="https://cowboyprogrammer.org/images/2016/03/Selection_004.png" alt="XFCE Settings" /></p>
+
+ <p>Then under the <em>Compositor</em> tab, make sure the compositor is disabled
+ <img src="https://cowboyprogrammer.org/images/2016/03/Selection_005.png" alt="Window Manager Tweaks" /></p>
+
+ <p>In addition, depending on your setup, make sure you don’t have things like <a href="https://wiki.archlinux.org/index.php/Compton">Compton</a> or <a href="https://wiki.archlinux.org/index.php/Compiz">Compiz</a> enabled.</p>
+
+ <h2 id="start-a-game-in-fullscreen">Start a game in fullscreen</h2>
+
+ <p>As mentioned, you must run the game in fullscreen mode. G-Sync does not work with window mode in Linux.</p>
+
+ <p>I did notice that there are games which do not enable G-Sync. One example is “Cities: Skylines”. So make sure to try several games if you don’t see the G-Sync logo.</p>
+
+ <p>A good candidate here is Dota 2 since it is free to play. Dota 2 running in “Desktop-Friendly Fullscreen” does enable G-Sync. As does Portal 2 and XCOM 2.</p>
+
+
+
+
+ <hr/>
+ <p>Other posts in the <b>Linux 100Hz gaming</b> series:</p>
+
+
+ <ul class="series">
+
+ <li>2016-05-18 —
+
+ <a href="https://cowboyprogrammer.org/2016/05/set-refresh-rate-of-screen-from-script/">Set refresh rate of screen from script</a>
+
+ </li>
+
+ <li>2016-03-05 —
+
+ Nvidia G-Sync and Linux
+
+ </li>
+
+ </ul>
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Encrypt a BTRFS RAID5-array in-place
+ https://cowboyprogrammer.org/2014/12/encrypt-a-btrfs-raid5-array-in-place/
+ Sun, 28 Dec 2014 00:00:00 +0000
+
+ https://cowboyprogrammer.org/2014/12/encrypt-a-btrfs-raid5-array-in-place/
+
+
+
+ <p>When I decided I needed more disk space for media and virtual machine (VM) images, I decided to throw some more money at the problem and get three 3TB hard drives and run <a href="https://btrfs.wiki.kernel.org/index.php/Main_Page">BTRFS</a> in <a href="http://en.wikipedia.org/wiki/RAID#Standard_levels">RAID5</a>. It’s still somewhat experimental, but has proven very solid for me.</p>
+
+ <p>RAID5 means that one drive can completely fail, but all the data is still intact. All one has to do is insert a new drive and the drive will be reconstructed. While RAID5 protects against a complete drive failure, it does nothing to prevent a single bit to be flipped to due cosmic rays or electricity spikes.</p>
+
+ <p>BTRFS is a new filesystem for Linux which does what ZFS does for BSD. The two important features which it offers over previous systems is: copy-on-write (COW), and bitrot protection. See, when running RAID with BTRFS, if a single bit is flipped, BTRFS will detect it when you try to read the file and correct it (if running in RAID so there’s redundancy). COW means you can take snapshots of the entire drive instantly without using extra space. Space will only be required when stuff change and diverge from your snapshots.</p>
+
+ <p>See <a href="http://arstechnica.com/information-technology/2014/01/bitrot-and-atomic-cows-inside-next-gen-filesystems/">Arstechnica</a> for why <em>BTRFS</em> is da shit for your next drive or system.</p>
+
+ <p>What I did not do at the time was encrypt the drives. <a href="http://www.linuxvoice.com/">Linux Voice #11</a> had a very nice article on encryption so I thought I’d set it up. And because I’m using RAID5, it is actually possible for me to encrypt my drives using <a href="https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption">dm-crypt/LUKS</a> in-place, while the whole shebang is mounted, readable and usable :)</p>
+
+ <p>Some initial mistakes meant I had to actually reboot the system, so I thought I’d write down how to do it correctly. So to summarize, the goal is to convert three disks to three encrypted disks. BTRFS will be moved from using the drives directly, to using the LUKS-mapped.</p>
+
+ <h3 id="unmount-the-raid-system-time-1-second">Unmount the raid system (time 1 second)</h3>
+
+ <p>Sadly, we need to unmount the volume to be able to “remove” the drive. This needs to be done so the system can understand that the drive has “vanished”. It will only stay unmounted for about a minute though.</p>
+
+ <pre><code>sudo umount /path/to/vol
+ </code></pre>
+
+ <p>This is assuming you have configured your <strong>fstab</strong> with all the details. For example, with something like this (ALWAYS USE UUID!!)</p>
+
+ <pre><code># BTRFS Systems
+ UUID="ac21dd50-e6ee-4a9e-abcd-459cba0e6913" /mnt/btrfs btrfs defaults 0 0
+ </code></pre>
+
+ <p>Note that no modification of the <strong>fstab</strong> will be necessary if you have used UUID.</p>
+
+ <h3 id="encrypt-one-of-the-drives-time-10-seconds">Encrypt one of the drives (time 10 seconds)</h3>
+
+ <p>Pick one of the drives to encrypt. Here it’s <code>/dev/sdc</code>:</p>
+
+ <pre><code>sudo cryptsetup luksFormat -v /dev/sdc
+ </code></pre>
+
+ <h3 id="open-the-encrypted-drive-time-30-seconds">Open the encrypted drive (time 30 seconds)</h3>
+
+ <p>To use it, we have to open the drive. You can pick any name you want:</p>
+
+ <pre><code>sudo cryptsetup luksOpen /dev/sdc DRIVENAME
+ </code></pre>
+
+ <p>To make this happen on boot, find the new <em>UUID</em> of <code>/dev/sdc</code> with <code>blkid</code>:</p>
+
+ <pre><code>sudo blkid
+ </code></pre>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Dec/Screenshot-from-2014-12-29-13-28-29.png" alt="Output of blkid" /></p>
+
+ <p>So for me, the drive has a the following <em>UUID:</em> <code>f5d3974c-529e-4574-bbfa-7f3e6db05c65</code>. Add the following line to <code>/etc/crypttab</code> with your desired drive name and your <em>UUID</em> (without any quotes):</p>
+
+ <pre><code>DRIVENAME UUID=your-uuid-without-quotes none luks
+ </code></pre>
+
+ <p>Now the system will ask for your password on boot.</p>
+
+ <h3 id="add-the-encrypted-drive-to-the-raid-time-20-seconds">Add the encrypted drive to the raid (time 20 seconds)</h3>
+
+ <p>First we have to remount the raid system. This will fail because there is a missing drive, unless we add the option <em>degraded</em>.</p>
+
+ <pre><code>sudo mount -o degraded /path/to/vol
+ </code></pre>
+
+ <p>There will be some complaints about missing drives and such, which is exactly what we expect. Now, just add the new drive:</p>
+
+ <pre><code>sudo btrfs device add /dev/mapper/DRIVENAME /path/to/vol
+ </code></pre>
+
+ <h3 id="remove-the-missing-drive-time-14-hours">Remove the missing drive (time 14 hours)</h3>
+
+ <p>The final step is to remove the old drive. We can use the special name <em>missing</em> to remove it:</p>
+
+ <pre><code>sudo btrfs device delete missing /path/to/vol
+ </code></pre>
+
+ <p>This can take a really long time, and by long I mean ~15 hours if you have a terrabyte of data. But, you can still use the drive during this process so just be patient.</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Dec/Screenshot-from-2014-12-29-12-48-45.png" alt="Balance took 14 hours" /></p>
+
+ <p>For me it took 14 hours 34 minutes. The reason for the delay is because the <em>delete</em> command will force the system to rebuild the missing drive on your new encrypted volume.</p>
+
+ <h3 id="next-drive-rinse-and-repeat">Next drive, rinse and repeat</h3>
+
+ <p>Just unmount the raid, encrypt the drive, add it back and delete the missing. Repeat for all drives in your array. Once the last drive is done, unmount the array and remount it without the <code>-o degraded</code> option. Now you have an encrypted RAID array.</p>
+
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Making an RSS reader app
+ https://cowboyprogrammer.org/2014/08/making-an-rss-reader-app/
+ Thu, 28 Aug 2014 00:00:00 +0000
+
+ https://cowboyprogrammer.org/2014/08/making-an-rss-reader-app/
+
+
+
+ <p>So I’ve been busy building my own RSS reader for the last few weeks. My motivation to make this app is because I got angry at <em>gReader</em> for displaying fullscreen-ads. The source is available on <a href="https://github.com/spacecowboy/Feeder">GitHub</a>.</p>
+
+ <p>I started with an idea of targeting <em>Android-L</em>, but because it’s only in preview any app targeting <em>L</em> will be completely incompatible with earler versions. Hence I was forced to refrain from using the new RecyclerView which I really liked. In general I’ve been stealing as much code as possible from the <a href="https://github.com/google/iosched">Google-IO app</a>.</p>
+
+ <p>It’s early still, but here are two screenshots of current progress:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Aug/Screenshot_2014-08-28-15-02-40.png" alt="Feeds with tags" width=50% /></p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Aug/Screenshot_2014-08-28-15-03-21.png" alt="Reader activity" width=50% /></p>
+
+ <p>To parse RSS feeds I have <a href="https://github.com/spacecowboy/Simplistic-RSS">forked Simplistic-RSS</a> by <a href="https://github.com/ShirwaM/Simplistic-RSS">ShirwaM</a>. To display images I am using <a href="http://square.github.io/picasso/">Picasso by Square</a> (awesome library). I don’t have any intention of uploading this app to the Play store at this time, at least not until I feel that it is fairly stable and feature complete. I am building it all for myself as this is the only kind of app which I actually use everyday. I figure I can talk about the difficulties that I encounter and how to solve them. So today’s topic will be:</p>
+
+ <h2 id="displaying-formatted-text-with-images">Displaying formatted text with images</h2>
+
+ <p>RSS feeds generally have stories formatted in HTML. For example, see the <a href="http://cowboyprogrammer.org/rss/">RSS feed of this blog</a>. This is good because it means all we need to do is decode it and display it. You could use a WebView, but that would be unacceptably ugly and disgusting for an app of mine. A nicer solution is to use a normal TextView. You can actually format HTML easily and display it with:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span>textview<span style="color: #666666">.</span><span style="color: #4070a0">setText</span><span style="color: #666666">(</span>android<span style="color: #666666">.</span><span style="color: #4070a0">text</span><span style="color: #666666">.</span><span style="color: #4070a0">Html</span><span style="color: #666666">.</span><span style="color: #4070a0">fromHtml</span><span style="color: #666666">(</span>htmlString<span style="color: #666666">));</span>
+ </code></pre></div>
+
+ <p>This simple act gets you most of the way. Here’s what a story looks like with this:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Aug/Screenshot_2014-08-28-15-27-44_photo.png" alt="Using just fromHtml img" width=50% /></p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Aug/Screenshot_2014-08-28-15-28-08_code_bad.png" alt="Using just fromHtml code" width=50% /></p>
+
+ <p>Notice that in the first image, the image is missing and you don’t see that there is a list in the beginning. In the second image, the source code has no special formatting and it’s hard to tell when it starts or stops.</p>
+
+ <p><em>fromHtml</em> is great, but it is missing functionality to handle some tags. Lucky for us, it is possible to hand it some tagHandlers for those cases. Because I am downloading images, I do the formatting in a background thread using a Loader. To this end I created the <a href="https://github.com/spacecowboy/Feeder/blob/master/app/src/main/java/com/nononsenseapps/feeder/model/ImageTextLoader.java">ImageTextLoader</a>. What it does instead is:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span>android<span style="color: #666666">.</span><span style="color: #4070a0">text</span><span style="color: #666666">.</span><span style="color: #4070a0">Html</span><span style="color: #666666">.</span><span style="color: #4070a0">fromHtml</span><span style="color: #666666">(</span>text<span style="color: #666666">,</span> imageHandler<span style="color: #666666">,</span> TagHandler<span style="color: #666666">);</span>
+ </code></pre></div>
+
+ <p>Where the imageHandler is really simple (notice that I use Picasso to get the image from the network):</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span>imgThing <span style="color: #666666">=</span> <span style="color: #007020; font-weight: bold">new</span> Html<span style="color: #666666">.</span><span style="color: #4070a0">ImageGetter</span><span style="color: #666666">()</span> <span style="color: #666666">{</span>
+ <span style="color: #60a0b0; font-style: italic">/**</span>
+ <span style="color: #60a0b0; font-style: italic"> * This methos is called when the HTML parser encounters an</span>
+ <span style="color: #60a0b0; font-style: italic"> * <img> tag. The <code>source</code> argument is the</span>
+ <span style="color: #60a0b0; font-style: italic"> * string from the "src" attribute; the return value should be</span>
+ <span style="color: #60a0b0; font-style: italic"> * a Drawable representation of the image or <code>null</code></span>
+ <span style="color: #60a0b0; font-style: italic"> * for a generic replacement image. Make sure you call</span>
+ <span style="color: #60a0b0; font-style: italic"> * setBounds() on your Drawable if it doesn't already have</span>
+ <span style="color: #60a0b0; font-style: italic"> * its bounds set.</span>
+ <span style="color: #60a0b0; font-style: italic"> *</span>
+ <span style="color: #60a0b0; font-style: italic"> * @param source</span>
+ <span style="color: #60a0b0; font-style: italic"> */</span>
+ <span style="color: #555555; font-weight: bold">@Override</span>
+ <span style="color: #007020; font-weight: bold">public</span> Drawable <span style="color: #06287e">getDrawable</span><span style="color: #666666">(</span><span style="color: #007020; font-weight: bold">final</span> String source<span style="color: #666666">)</span> <span style="color: #666666">{</span>
+ Drawable d <span style="color: #666666">=</span> <span style="color: #007020; font-weight: bold">null</span><span style="color: #666666">;</span>
+ <span style="color: #007020; font-weight: bold">try</span> <span style="color: #666666">{</span>
+ <span style="color: #007020; font-weight: bold">final</span> Bitmap b <span style="color: #666666">=</span> Picasso<span style="color: #666666">.</span><span style="color: #4070a0">with</span><span style="color: #666666">(</span>appContext<span style="color: #666666">).</span><span style="color: #4070a0">load</span><span style="color: #666666">(</span>source<span style="color: #666666">).</span><span style="color: #4070a0">get</span><span style="color: #666666">();</span>
+ <span style="color: #60a0b0; font-style: italic">// Get original size</span>
+ <span style="color: #902000">int</span> w <span style="color: #666666">=</span> b<span style="color: #666666">.</span><span style="color: #4070a0">getWidth</span><span style="color: #666666">();</span>
+ <span style="color: #902000">int</span> h <span style="color: #666666">=</span> b<span style="color: #666666">.</span><span style="color: #4070a0">getHeight</span><span style="color: #666666">();</span>
+ <span style="color: #60a0b0; font-style: italic">// Shrink if big</span>
+ <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">(</span>w <span style="color: #666666">></span> maxSize<span style="color: #666666">.</span><span style="color: #4070a0">x</span> <span style="color: #666666">||</span> h <span style="color: #666666">></span> maxSize<span style="color: #666666">.</span><span style="color: #4070a0">y</span><span style="color: #666666">)</span> <span style="color: #666666">{</span>
+ Point newSize <span style="color: #666666">=</span> scaleImage<span style="color: #666666">(</span>w<span style="color: #666666">,</span> h<span style="color: #666666">);</span>
+ w <span style="color: #666666">=</span> newSize<span style="color: #666666">.</span><span style="color: #4070a0">x</span><span style="color: #666666">;</span>
+ h <span style="color: #666666">=</span> newSize<span style="color: #666666">.</span><span style="color: #4070a0">y</span><span style="color: #666666">;</span>
+ <span style="color: #666666">}</span>
+ <span style="color: #60a0b0; font-style: italic">// Need to return a drawable</span>
+ d <span style="color: #666666">=</span> <span style="color: #007020; font-weight: bold">new</span> BitmapDrawable<span style="color: #666666">(</span>appContext<span style="color: #666666">.</span><span style="color: #4070a0">getResources</span><span style="color: #666666">(),</span> b<span style="color: #666666">);</span>
+ d<span style="color: #666666">.</span><span style="color: #4070a0">setBounds</span><span style="color: #666666">(</span><span style="color: #40a070">0</span><span style="color: #666666">,</span> <span style="color: #40a070">0</span><span style="color: #666666">,</span> w<span style="color: #666666">,</span> h<span style="color: #666666">);</span>
+ <span style="color: #666666">}</span> <span style="color: #007020; font-weight: bold">catch</span> <span style="color: #666666">(</span>IOException e<span style="color: #666666">)</span> <span style="color: #666666">{</span>
+ Log<span style="color: #666666">.</span><span style="color: #4070a0">e</span><span style="color: #666666">(</span><span style="color: #4070a0">"JONAS"</span><span style="color: #666666">,</span> <span style="color: #4070a0">""</span> <span style="color: #666666">+</span> e<span style="color: #666666">.</span><span style="color: #4070a0">getMessage</span><span style="color: #666666">());</span>
+ <span style="color: #666666">}</span>
+ <span style="color: #007020; font-weight: bold">return</span> d<span style="color: #666666">;</span>
+ <span style="color: #666666">}</span>
+ <span style="color: #666666">};</span>
+ </code></pre></div>
+
+ <p>The tag handler contains a bit more code, and I won’t paste all of it here. The tags which are handled can be seen in <em>handleTag</em>:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span><span style="color: #007020; font-weight: bold">public</span> <span style="color: #902000">void</span> <span style="color: #06287e">handleTag</span><span style="color: #666666">(</span><span style="color: #007020; font-weight: bold">final</span> <span style="color: #902000">boolean</span> opening<span style="color: #666666">,</span> <span style="color: #007020; font-weight: bold">final</span> String tag<span style="color: #666666">,</span>
+ <span style="color: #007020; font-weight: bold">final</span> Editable output<span style="color: #666666">,</span> <span style="color: #007020; font-weight: bold">final</span> XMLReader xmlReader<span style="color: #666666">)</span> <span style="color: #666666">{</span>
+ <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">(</span>tag<span style="color: #666666">.</span><span style="color: #4070a0">equalsIgnoreCase</span><span style="color: #666666">(</span><span style="color: #4070a0">"ul"</span><span style="color: #666666">))</span> <span style="color: #666666">{</span>
+ handleUl<span style="color: #666666">(</span>output<span style="color: #666666">,</span> opening<span style="color: #666666">);</span>
+ <span style="color: #666666">}</span> <span style="color: #007020; font-weight: bold">else</span> <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">(</span>tag<span style="color: #666666">.</span><span style="color: #4070a0">equalsIgnoreCase</span><span style="color: #666666">(</span><span style="color: #4070a0">"ol"</span><span style="color: #666666">))</span> <span style="color: #666666">{</span>
+ handleOl<span style="color: #666666">(</span>output<span style="color: #666666">,</span> opening<span style="color: #666666">);</span>
+ <span style="color: #666666">}</span> <span style="color: #007020; font-weight: bold">else</span> <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">(</span>tag<span style="color: #666666">.</span><span style="color: #4070a0">equalsIgnoreCase</span><span style="color: #666666">(</span><span style="color: #4070a0">"li"</span><span style="color: #666666">))</span> <span style="color: #666666">{</span>
+ handleLi<span style="color: #666666">(</span>output<span style="color: #666666">,</span> opening<span style="color: #666666">);</span>
+ <span style="color: #666666">}</span> <span style="color: #007020; font-weight: bold">else</span> <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">(</span>tag<span style="color: #666666">.</span><span style="color: #4070a0">equalsIgnoreCase</span><span style="color: #666666">(</span><span style="color: #4070a0">"img"</span><span style="color: #666666">))</span> <span style="color: #666666">{</span>
+ handleImgEnd<span style="color: #666666">(</span>output<span style="color: #666666">);</span>
+ <span style="color: #666666">}</span> <span style="color: #007020; font-weight: bold">else</span> <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">(</span>tag<span style="color: #666666">.</span><span style="color: #4070a0">equalsIgnoreCase</span><span style="color: #666666">(</span><span style="color: #4070a0">"code"</span><span style="color: #666666">))</span> <span style="color: #666666">{</span>
+ handleCode<span style="color: #666666">(</span>output<span style="color: #666666">,</span> opening<span style="color: #666666">);</span>
+ <span style="color: #666666">}</span> <span style="color: #007020; font-weight: bold">else</span> <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">(</span>tag<span style="color: #666666">.</span><span style="color: #4070a0">equalsIgnoreCase</span><span style="color: #666666">(</span><span style="color: #4070a0">"pre"</span><span style="color: #666666">))</span> <span style="color: #666666">{</span>
+ handlePre<span style="color: #666666">(</span>output<span style="color: #666666">,</span> opening<span style="color: #666666">);</span>
+ <span style="color: #666666">}</span>
+ <span style="color: #666666">}</span>
+ </code></pre></div>
+
+ <p>Note that fromHtml only notifies your handler about img-tags when they have ended, so I use that to insert a newline after each image. I would have liked to use it to get the configured size of the image, but that will have to wait for another day. For code-tags, I reduce the size of the text and make it Monospace:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span><span style="color: #60a0b0; font-style: italic">// Source code</span>
+ <span style="color: #007020; font-weight: bold">private</span> <span style="color: #902000">void</span> <span style="color: #06287e">handleCode</span><span style="color: #666666">(</span><span style="color: #007020; font-weight: bold">final</span> Editable text<span style="color: #666666">,</span>
+ <span style="color: #007020; font-weight: bold">final</span> <span style="color: #902000">boolean</span> start<span style="color: #666666">)</span> <span style="color: #666666">{</span>
+ <span style="color: #60a0b0; font-style: italic">// Should be monospace</span>
+ <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">(</span>start<span style="color: #666666">)</span> <span style="color: #666666">{</span>
+ start<span style="color: #666666">(</span>text<span style="color: #666666">,</span> <span style="color: #007020; font-weight: bold">new</span> Monospace<span style="color: #666666">());</span>
+ start<span style="color: #666666">(</span>text<span style="color: #666666">,</span> <span style="color: #007020; font-weight: bold">new</span> RelativeSize<span style="color: #666666">());</span>
+ <span style="color: #666666">}</span> <span style="color: #007020; font-weight: bold">else</span> <span style="color: #666666">{</span>
+ end<span style="color: #666666">(</span>text<span style="color: #666666">,</span> Monospace<span style="color: #666666">.</span><span style="color: #4070a0">class</span><span style="color: #666666">,</span>
+ <span style="color: #007020; font-weight: bold">new</span> TypefaceSpan<span style="color: #666666">(</span><span style="color: #4070a0">"monospace"</span><span style="color: #666666">));</span>
+ end<span style="color: #666666">(</span>text<span style="color: #666666">,</span> RelativeSize<span style="color: #666666">.</span><span style="color: #4070a0">class</span><span style="color: #666666">,</span>
+ <span style="color: #007020; font-weight: bold">new</span> RelativeSizeSpan<span style="color: #666666">(</span><span style="color: #40a070">0.8f</span><span style="color: #666666">));</span>
+ <span style="color: #666666">}</span>
+ <span style="color: #666666">}</span>
+ </code></pre></div>
+
+ <p>The <em>start</em> and <em>end</em> methods were simply stolen straight from <em>android.Html</em>.</p>
+
+ <h3 id="result">Result</h3>
+
+ <p>Here’s the result using the added <em>tagHandlers</em>:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Aug/Screenshot_2014-08-28-15-03-21-1.png" alt="With image" width=50% /></p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Aug/Screenshot_2014-08-28-15-28-44_code_good.png" alt="With code" width=50% /></p>
+
+ <h3 id="handling-clicks-on-links">Handling clicks on links</h3>
+
+ <p>Thankfully I had already solved the issue of clickable spans in NoNonsense Notes. See [ReaderFragment]() for this:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span><span style="color: #60a0b0; font-style: italic">// Catch clicks on links</span>
+ mBodyTextView<span style="color: #666666">.</span><span style="color: #4070a0">setOnTouchListener</span><span style="color: #666666">(</span><span style="color: #007020; font-weight: bold">new</span> View<span style="color: #666666">.</span><span style="color: #4070a0">OnTouchListener</span><span style="color: #666666">()</span> <span style="color: #666666">{</span>
+ <span style="color: #555555; font-weight: bold">@Override</span>
+ <span style="color: #007020; font-weight: bold">public</span> <span style="color: #902000">boolean</span> <span style="color: #06287e">onTouch</span><span style="color: #666666">(</span><span style="color: #007020; font-weight: bold">final</span> View v<span style="color: #666666">,</span>
+ <span style="color: #007020; font-weight: bold">final</span> MotionEvent event<span style="color: #666666">)</span> <span style="color: #666666">{</span>
+ TextView widget <span style="color: #666666">=</span> <span style="color: #666666">(</span>TextView<span style="color: #666666">)</span> v<span style="color: #666666">;</span>
+ Object text <span style="color: #666666">=</span> widget<span style="color: #666666">.</span><span style="color: #4070a0">getText</span><span style="color: #666666">();</span>
+ <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">(</span>text <span style="color: #007020; font-weight: bold">instanceof</span> Spanned<span style="color: #666666">)</span> <span style="color: #666666">{</span>
+ Spanned buffer <span style="color: #666666">=</span> <span style="color: #666666">(</span>Spanned<span style="color: #666666">)</span> text<span style="color: #666666">;</span>
+
+ <span style="color: #902000">int</span> action <span style="color: #666666">=</span> event<span style="color: #666666">.</span><span style="color: #4070a0">getAction</span><span style="color: #666666">();</span>
+
+ <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">(</span>action <span style="color: #666666">==</span> MotionEvent<span style="color: #666666">.</span><span style="color: #4070a0">ACTION_UP</span> <span style="color: #666666">||</span>
+ action <span style="color: #666666">==</span> MotionEvent<span style="color: #666666">.</span><span style="color: #4070a0">ACTION_DOWN</span><span style="color: #666666">)</span> <span style="color: #666666">{</span>
+ <span style="color: #902000">int</span> x <span style="color: #666666">=</span> <span style="color: #666666">(</span><span style="color: #902000">int</span><span style="color: #666666">)</span> event<span style="color: #666666">.</span><span style="color: #4070a0">getX</span><span style="color: #666666">();</span>
+ <span style="color: #902000">int</span> y <span style="color: #666666">=</span> <span style="color: #666666">(</span><span style="color: #902000">int</span><span style="color: #666666">)</span> event<span style="color: #666666">.</span><span style="color: #4070a0">getY</span><span style="color: #666666">();</span>
+
+ x <span style="color: #666666">-=</span> widget<span style="color: #666666">.</span><span style="color: #4070a0">getTotalPaddingLeft</span><span style="color: #666666">();</span>
+ y <span style="color: #666666">-=</span> widget<span style="color: #666666">.</span><span style="color: #4070a0">getTotalPaddingTop</span><span style="color: #666666">();</span>
+
+ x <span style="color: #666666">+=</span> widget<span style="color: #666666">.</span><span style="color: #4070a0">getScrollX</span><span style="color: #666666">();</span>
+ y <span style="color: #666666">+=</span> widget<span style="color: #666666">.</span><span style="color: #4070a0">getScrollY</span><span style="color: #666666">();</span>
+
+ Layout layout <span style="color: #666666">=</span> widget<span style="color: #666666">.</span><span style="color: #4070a0">getLayout</span><span style="color: #666666">();</span>
+ <span style="color: #902000">int</span> line <span style="color: #666666">=</span> layout<span style="color: #666666">.</span><span style="color: #4070a0">getLineForVertical</span><span style="color: #666666">(</span>y<span style="color: #666666">);</span>
+ <span style="color: #902000">int</span> off <span style="color: #666666">=</span> layout<span style="color: #666666">.</span><span style="color: #4070a0">getOffsetForHorizontal</span><span style="color: #666666">(</span>line<span style="color: #666666">,</span> x<span style="color: #666666">);</span>
+
+ ClickableSpan<span style="color: #666666">[]</span> link <span style="color: #666666">=</span>
+ buffer<span style="color: #666666">.</span><span style="color: #4070a0">getSpans</span><span style="color: #666666">(</span>off<span style="color: #666666">,</span> off<span style="color: #666666">,</span> ClickableSpan<span style="color: #666666">.</span><span style="color: #4070a0">class</span><span style="color: #666666">);</span>
+
+ <span style="color: #60a0b0; font-style: italic">// Cant click to the right of a span,</span>
+ <span style="color: #60a0b0; font-style: italic">// if the line ends with the span!</span>
+ <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">(</span>x <span style="color: #666666">></span> layout<span style="color: #666666">.</span><span style="color: #4070a0">getLineRight</span><span style="color: #666666">(</span>line<span style="color: #666666">))</span> <span style="color: #666666">{</span>
+ <span style="color: #60a0b0; font-style: italic">// Don't call the span</span>
+ <span style="color: #666666">}</span> <span style="color: #007020; font-weight: bold">else</span> <span style="color: #007020; font-weight: bold">if</span> <span style="color: #666666">(</span>link<span style="color: #666666">.</span><span style="color: #4070a0">length</span> <span style="color: #666666">!=</span> <span style="color: #40a070">0</span><span style="color: #666666">)</span> <span style="color: #666666">{</span>
+ link<span style="color: #666666">[</span><span style="color: #40a070">0</span><span style="color: #666666">].</span><span style="color: #4070a0">onClick</span><span style="color: #666666">(</span>widget<span style="color: #666666">);</span>
+ <span style="color: #007020; font-weight: bold">return</span> <span style="color: #007020; font-weight: bold">true</span><span style="color: #666666">;</span>
+ <span style="color: #666666">}</span>
+ <span style="color: #666666">}</span>
+ <span style="color: #666666">}</span>
+ <span style="color: #007020; font-weight: bold">return</span> <span style="color: #007020; font-weight: bold">false</span><span style="color: #666666">;</span>
+ <span style="color: #666666">}</span>
+ <span style="color: #666666">});</span>
+ </code></pre></div>
+
+ <p>Thus clicking on links in the <em>TextView</em> will open them in the browser. You could do whatever you want instead of calling <em>link[0].onClick()</em> however.</p>
+
+ <p>That’s it for today. I’ll write more about other pieces of the app soon. Things like how the database is structured or how to use ExpandableListView.</p>
+
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Building Python wheels for Windows
+ https://cowboyprogrammer.org/2014/06/building-python-wheels-for-windows/
+ Wed, 04 Jun 2014 00:00:00 +0000
+
+ https://cowboyprogrammer.org/2014/06/building-python-wheels-for-windows/
+
+
+
+ <p>One group in particular suffers from lack of package management in Windows (<a href="http://cowboyprogrammer.org/people-have-been-trained-to-install-malware/">as I griped about here</a>): developers. This post will largely be a big howto on how to build Python packages with Fortran/C-extensions (especially Fortran extensions seem problematic on Windows). You’d think that something like that would be clearly explained somewhere. So did I, and I was wrong. So here is my guide to building Python packages with native extensions (both C and Fortran) on Windows.</p>
+
+ <h4 id="installing-python-packages">Installing Python packages</h4>
+
+ <p>The lack of a compiler means most Windows users can’t do what *nix users do when faced with a package containing some c or fortran extensions:</p>
+
+ <pre><code>python setup.py install
+ </code></pre>
+
+ <p>Or if it’s publicly available on <a href="https://pypi.python.org/">PyPi</a> for example:</p>
+
+ <pre><code>pip install package
+ </code></pre>
+
+ <p><em>pip</em> will download the source, and on any system with a compiler, compile it, then install it. So it becomes necessary to provide pre-built binaries for Windows users who don’t have a compiler. Something which no one offers a concise explanation of… until now that is. If you upload your package to <a href="https://pypi.python.org/">PyPi</a>, once you have followed this guide, even Windows users will be able to do <em>pip install package</em>.</p>
+
+ <h2 id="1-set-up-a-windows-machine">1. Set up a Windows machine</h2>
+
+ <p>To build Windows binaries you will need access to a Windows machine. If you don’t have a copy of Windows lying around to install in a virtual machine, you can create a <em>free virtual machine</em> on <a href="http://aws.amazon.com/">Amazon</a> with Windows Server 2012. Selecting the most basic options will be fine and the machine will be free for atleast a year, at which point you can pay the few dollars per year or register for another free account.</p>
+
+ <p>Another note: make sure to use <strong>64-bit Windows</strong> (Server 2012 only comes in 64-bit versions).</p>
+
+ <h2 id="2-install-32-bit-compilers">2. Install 32-bit compilers</h2>
+
+ <p>Don’t ask me why Microsoft didn’t want to ship the 64-bit compiler together with the 32-bit one… The versions here are final. You <strong>cannot use newer compilers</strong>. In other words, don’t get Visual Studio 2012 and expect it to work… It’s a simple fact that you need to compile your packages with the same compiler as was used to build Python itself.</p>
+
+ <h3 id="install-visual-c-2010-express-for-python3">Install Visual C++ 2010 Express (for Python3)</h3>
+
+ <p>Python3.<sup>3</sup>⁄<sub>3</sub>.4 is built with 2010 and hence all extensions must be as well.</p>
+
+ <p>Google for it, <a href="http://www.visualstudio.com/downloads/download-visual-studio-vs#DownloadFamilies_4">or try this link</a></p>
+
+ <h3 id="install-visual-c-2008-express-for-python2-7">Install Visual C++ 2008 Express (for Python2.7)</h3>
+
+ <p>For building Python2.7, 2008 version is required. Google for “Visual C++ 2008 Express” or <a href="http://go.microsoft.com/?linkid=7729279">try this link</a></p>
+
+ <h2 id="3-install-64-bit-compilers">3. Install 64-bit compilers</h2>
+
+ <p>Why did you do this Microsoft, why?!</p>
+
+ <h3 id="install-the-windows-sdk-for-visual-studio-2010-for-python-3">Install the Windows SDK for Visual Studio 2010 (for Python 3)</h3>
+
+ <p>The free Visual C++ 2010 Express compiler does not include 64-bit support. That is what we need the SDK to provide. Google for <strong>“Microsoft Windows SDK for Windows 7 and .NET Framework 4”</strong> or <a href="http://www.microsoft.com/en-us/download/details.aspx?id=8279">try this link</a>. You need the Windows 7 SDK even if you are running Windows 8. And make sure it is the version with <em>.NET Framework 4</em>, the one with <em>.NET Framework 3</em> is for Visual Studio 2008.</p>
+
+ <p>Note: if you have <em>C++ 2010 Redistributables</em> installed, you might have
+ to uninstall them first or this install might fail. It might work even if some parts of the installer fails since you only need the compiler bits.</p>
+
+ <h3 id="install-the-windows-sdk-for-visual-studio-2008-for-python-2-7">Install the Windows SDK for Visual Studio 2008 for (Python 2.7)</h3>
+
+ <p>Same story for Visual C++ 2008 Express which is used for Python2.7. Find <strong>“Microsoft Windows SDK for Windows 7 and .NET Framework 3.5”</strong> or <a href="http://www.microsoft.com/en-us/download/details.aspx?id=3138">try this link</a></p>
+
+ <h2 id="4-install-miniconda-anaconda">4. Install Miniconda/Anaconda</h2>
+
+ <p><a href="http://continuum.io/downloads">Download page</a></p>
+
+ <p>Download both the 32-bit and 64 bit versions. Python2 or Python3 versions do not matter as we will be using conda environments, but you do need both 32-bit and 64-bit versions! During the installation procedure, I recommend you select the following:</p>
+
+ <ul>
+ <li>Install for current user only (this is the default)</li>
+ <li>Install into: <em>Users\YOURNAME\Anaconda</em> and <em>Users\YOURNAME\Anaconda-64</em> respectively</li>
+ <li>Do <strong>NOT modify the PATH</strong>, this will be done explicitly in the build script</li>
+ <li>Do <strong>NOT make it the default Python</strong>, we need to be able to switch easily</li>
+ </ul>
+
+ <h2 id="5-create-the-environments">5. Create the environments</h2>
+
+ <p><strong>Do this for both the 32-bit and 64-bit versions.</strong></p>
+
+ <p>Open a command line window and navigate to <em>Users\YOURNAME\Anaconda\Scripts</em> (and same for <em>Anaconda-64</em> later) (Protip: use the file browser to get to the directory then shift-click
+ somewhere and select ‘open command line here’).</p>
+
+ <p>Type the following commands:</p>
+
+ <pre><code>conda create -n py3.4 python=3.4 numpy pip mingw
+
+ conda create -n py3.3 python=3.3 numpy pip mingw
+
+ conda create -n py2.7 python=2.7 numpy pip mingw
+ </code></pre>
+
+ <p>Remember to repeat that process for the 64-bit/32-bit version as well!</p>
+
+ <h2 id="6-install-git">6. Install git</h2>
+
+ <p>This has nothing to do with the build process, but I will assume that you want to do <em>git clone</em> at some point. <a href="http://git-scm.com/download/win]">Download it here</a>. In this case you absolutely DO want it to modify your PATH.</p>
+
+ <h1 id="actually-building-stuff">Actually building stuff</h1>
+
+ <p>Believe it or not, but you are actually ready to compile your package. Due to multiple compilers and all that, I have made a bat-file which builds wheels for Python 2.7, 3.3 and 3.4, both for 32-bit and 64-bit:</p>
+
+ <script src="https://gist.github.com/spacecowboy/23fcd4d40cfd1c1cd88a.js"></script>
+
+ <p>Edit the information at the top. Now assuming everything was installed in the right place, you should just have to double click the bat-file and have built the wheel files which you can then upload to PyPi.</p>
+
+ <h2 id="building-wheels-automatically-on-commits">Building wheels automatically on commits</h2>
+
+ <p>Having to do this manually is a drag and so I have also come up with a fully automated solution using <a href="jenkins-ci.org">Jenkins</a>, a continuous integration system which monitors your git-repo and clones, builds new files as changes are committed.</p>
+
+ <h3 id="install-jenkins">Install Jenkins</h3>
+
+ <p>Just download the native package from [jenkins-ci.org]().</p>
+
+ <h3 id="configure-jenkins">Configure Jenkins</h3>
+
+ <p>Once Jenkins is installed, it will start itself as a Windows service. Open you web browser and head to <em>[<a href="http://localhost:8080](">http://localhost:8080](</a>)</em>. You then want to go to <em>Manage Jenkins</em>, followed by <em>Manage Plugins</em>:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Jun/jenkins_manage.png" alt="Manage Jenkins" /></p>
+
+ <p>Go to the <em>available</em> tab, and filter on “GIT plugin” (already installed in the screenshot):</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Jun/jenkins_git.png" alt="Install the GIT Plugin" /></p>
+
+ <p>OK, now go back to the top (click Jenkins in upper left) and create a <em>New Item</em>. You want to select “free-style software project” and give it a name:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Jun/jenkins_newitem.png" alt="Create a new free-style project" /></p>
+
+ <p>First thing you need to configure is the git source. Scroll down to <em>Source Code Management</em>, select <em>git</em>, and fill in the repo-address. If you input a public GitHub address you don’t need any credentials:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Jun/jenkins_config_git.png" alt="Configure Git address" /></p>
+
+ <p>I also recommend you add one <em>Additional behaviour</em>: <em>Clean before checkout</em> to guarantee that builds do not affect each other:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Jun/jenkins_git_clean.png" alt="Clean before checkout" /></p>
+
+ <p>Next you can setup the automatic behaviour. The easiest way is to have Jenkins poll GitHub every X minutes and check if there’s a change. Here I have configured Jenkins to check every 15 minutes:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Jun/jenkins_scm_poll.png" alt="SCM Polling" /></p>
+
+ <p>So Jenkins knows what to do when it detects a change, you want to add a <em>Build step</em>, specifically <em>Execute a Windows batch file</em>:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Jun/jenkins_build_step.png" alt="Build step" /></p>
+
+ <p>In the box, just copy paste the batch file I <a href="https://gist.github.com/spacecowboy/23fcd4d40cfd1c1cd88a">included above</a>. Fill in the paths to your Anaconda installs and set the repo to:</p>
+
+ <pre><code>set PKG_REPO=.
+ </code></pre>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Jun/jenkins_batch.png" alt="Pasted batch file" /></p>
+
+ <p>Jenkins will handle the cloning and simply execute the script in the correct directory. As a final configuration step, tell Jenkins to archive build artifacts under <em>Post-Build Actions</em> since you want to be able to download the wheel files:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Jun/jenkins_post_build.png" alt="Archive wheelfiles" /></p>
+
+ <p>If you don’t upload wheels to PyPi, then you can install wheels with pip from anywhere with:</p>
+
+ <pre><code>pip install --no-index -f http://your.site/wheeldir/ yourpackage
+ </code></pre>
+
+ <h3 id="enjoy-your-build-machine">Enjoy your build machine</h3>
+
+ <p>Now you’re all done. You can manually trigger builds in the left menu. Each build will have links for you to download the wheelfiles and the job’s main page will always display the links to the latest artifacts.</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Jun/jenkins_result.png" alt="Job result" /></p>
+
+ <p>There are so many plugins and options available for Jenkins so play around if you want even more stuff. Some things you can do include:</p>
+
+ <ul>
+ <li>Automatically uploading artifacts to an FTP/SSH-server.</li>
+ <li>Sending E-mail notifications on success/failures.</li>
+ <li>Build only specific branches/tags.</li>
+ <li>Make the server public and tie login to GitHub accounts.</li>
+ <li><a href="https://wiki.jenkins-ci.org/display/JENKINS/ChuckNorris+Plugin">Add Chuck Norris jokes to your builds</a></li>
+ </ul>
+
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ People have been trained to install malware
+ https://cowboyprogrammer.org/2014/05/people-have-been-trained-to-install-malware/
+ Sun, 11 May 2014 00:00:00 +0000
+
+ https://cowboyprogrammer.org/2014/05/people-have-been-trained-to-install-malware/
+
+
+
+ <p><em>disclaimer: I get angry when I have to fix Windows. Expect explicit content. You have been warned.</em></p>
+
+ <p>Being computer literate can be something of a curse. Anyone with even the most rudimentary skill set has probably sometime gotten asked if they could help someone with their computer. The other day I got asked if I could help, let’s call him Roger, as he was having some problems with Windows Update. The initial symptoms could be clearly relayed by Roger:</p>
+
+ <blockquote>
+ <p>The update gets to 30% then it just stops and reboots.</p>
+ </blockquote>
+
+ <p>First step is always to recreate the problem and see it in action. No problem there. Telling Windows Update to proceed resulted in precisely the described result, after a fair bit of time waiting for a frigging restore point to be created. I’d read about the <a href="http://techreport.com/news/26306/windows-8-1-update-failing-for-many-users">failing 8.1 upgrade</a> so I half expected it to be Microsoft’s fault, even though this machine was running Windows 7. Roger didn’t need anything from the update so worst case I thought, I’ll just disable Windows Update entirely.</p>
+
+ <h2 id="first-things-first">First things first</h2>
+
+ <p>Once I had confirmed that there was a problem, I begun by clearing out various <em>crapware</em> that was installed, mainly different kinds of toolbars and some video player that seemed to be a repackaging of VLC mainly. It’s hard to see why this software is installed or where it came from. Roger uses only Word and the browser. I figure he’s the sort that clicks on various malicious ads for some reason. At least Roger has been coerced into using Chrome instead of IE…</p>
+
+ <p>So I uninstall everything I don’t recognize and reboot, because rebooting is something you do a lot in Windows land… OK, maybe the update will work now without all the crap installed. It’s worth a try at least.</p>
+
+ <blockquote>
+ <p>Initiate the update… It creates a restore point… wait… wait… wait…. Reboot. Update still fails at 30%.</p>
+ </blockquote>
+
+ <h2 id="trial-and-error">Trial and error</h2>
+
+ <p>Now the real work begins. Maybe Microsoft screwed up their patches or something? There were 5 security patches waiting to be installed so let’s try them one by one.</p>
+
+ <ul>
+ <li>First one fails.</li>
+ <li>Second one fails.</li>
+ <li>Everyone but the first and second one fails.</li>
+ </ul>
+
+ <p>OK… Let’s just do the damn IE patches first. They also fail. And for every try, I’m forced to wait for Windows to create another damn restore point which takes several minutes. This on an almost brand new Intel NUC with an SSD.</p>
+
+ <h2 id="bored">Bored…</h2>
+
+ <p>While waiting for the damn restore points, I am seriously considering if I can just wipe the machine and force Roger to use Linux instead. All he needs is Word. So I decide to download LibreOffice and see how their docx support is these days. Downloading 200MB takes a while on the effectively 2MBit connection. Still quicker than the now <strong>cancelled</strong> restore point. So I click through the installer, get to the progress bar, and wait. And wait. And wait.</p>
+
+ <blockquote>
+ <p>Why the fuck isn’t the progress bar moving?</p>
+ </blockquote>
+
+ <p>Instinctively, I open the task manager to see what the hold up is. Apparently nothing. No CPU is being used. No memory is consumed. It’s an SSD so disk speed is not an issue. Change to the services tab and same thing, nothing obvious. I try disabling the antivirus (Microsoft’s own so should be compatible right?). Good try chump, still no difference.</p>
+
+ <p>Second time in the task manager, I notice something though. A service which doesn’t really sound very official: <em>safetynut</em>. I find out where <em>safetynut.exe</em> lives and sure enough, it lives in something like:</p>
+
+ <blockquote>
+ <p>C:\Program Files (x86)\Movie Toolbar\Safetynut</p>
+ </blockquote>
+
+ <p>But I uninstalled that! Fine.. End process. To which Windows replies:</p>
+
+ <blockquote>
+ <p>You don’t have permission to end this process</p>
+ </blockquote>
+
+ <p><strong>W T F</strong></p>
+
+ <p>OK computer, I’m going to stop you right there. I am the administrator. I am your <em>GOD</em>. And as said deity, I command you to end that process!</p>
+
+ <blockquote>
+ <p>God or no god, you still don’t have permission to do that</p>
+ </blockquote>
+
+ <p>OK, fine, be that way. Delete <em>C:\Program Files (x86)\Movie Toolbar\Safetynut</em>.</p>
+
+ <blockquote>
+ <p>Could not delete safetynut.dll as it is in use</p>
+ </blockquote>
+
+ <p><em>Shaka, when the walls fell…</em></p>
+
+ <p>It’s an amazing <em>“feature”</em> in Windows that a program can lock a file and thus prevent you from deleting it. It’s also an amazing <em>“feature”</em> that the administrator can be refused the permission to do something. No recourse left but to reboot into safe mode.</p>
+
+ <h2 id="to-safe-mode-we-go">To safe mode we go!</h2>
+
+ <p>First, I go into the normal safe mode with a desktop. Still can’t delete the dll file though as it is “in use”. Time to open <em>regedit</em> and delete all references to safetynut from the registry. Search, delete. Rince, repeat…</p>
+
+ <p>Next reboot to safe mode with only a command line window. Navigate to the folder and delete the file and the folder, then reboot.</p>
+
+ <h2 id="success">Success!</h2>
+
+ <p>No more safetynut. Let’s try Windows Update again. Ooh, that’s a mighty fast restore point creation! And the update succeeds!</p>
+
+ <p>So apparently, safetynut was actively preventing Windows Update from proceeding. Roger promptly got a stern talking to about installing <strong>any</strong> software or clicking on ads/popups (I also installed adblock plus in Chrome). But it got me thinking about malware in general..</p>
+
+ <h2 id="most-people-are-trained-to-install-malware">Most people are trained to install malware</h2>
+
+ <p>In my view, none of this is the user’s fault. The fact is that Microsoft has trained everyone to install shitty software from untrusted sources. Let’s go back a few years, to the days of yore, in the time of Windows 98 and Windows 2000. If you reinstalled Windows back then, and I did a lot, then you very quickly got a routine for downloading the software you needed once Windows was installed.</p>
+
+ <p>First obvious things to install were the drivers for your network card, sound card and graphics card. You even possibly needed to install SATA-drivers during the actual install or the installer wouldn’t find your disk. If you did not have that on a <strong>floppy</strong>, you were screwed. But OK, you had your floppy, and you had your drivers on CD. Next you needed:</p>
+
+ <ul>
+ <li>A browser, because Internet Explorer is still a gaping security hole</li>
+ <li>A firewall, because even up to XP, being exposed to the internet directly meant instant infection</li>
+ <li>Antivirus, anything that wasn’t Norton would do…</li>
+ <li>PDF-reader</li>
+ <li>zip/rar-extractor</li>
+ </ul>
+
+ <p>I’d like to draw your attention to the last item. Something so mundane as a zip-extractor was not built in to Windows. XP was the first version (if I remember correctly) to include a built in zip-extractor. This specific flaw trained everyone to download Winzip or Winrar. Quite possibly, they would resort to getting a pirated serial key as well. The problem? Now users are trained to go to any website their 10-year old neighborhood tech support kid tells them to and click <em>Download</em>.</p>
+
+ <p>Here’s a screenshot of the pirate bay to illustrate (to clarify, do NOT download your software from torrent sites. It’s just an example of this behavior). The big download buttons will lead to ads, online poker or who knows. We can be quite sure that they will lead to endless evil. On the internet, never <strong>FUCKING EVER</strong> press a big styled button with the text “Download”. The link you want is the smaller green text: “get this torrent”.</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/May/piratebay-downloadlinks.png" alt="Never press Download!" /></p>
+
+ <p>Now, assuming you managed to avoid the big download buttons to download your program, you have your completely unverified <em>.exe</em> file or <em>.msi</em> file, you double click on it, and what do you get? More <em>fucking bullshit</em>. Here’s a screenshot of the Winzip (totally unnecessary program today) installer. Right after you agree to the Winzip Terms of Service, you get another license agreement.</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/May/winzip-malware.png" alt="Toolbars!" /></p>
+
+ <p>How the screaming fuck are ordinary users supposed to understand that pressing Next will lead to untold horrors and pressing Decline is the way to install the software they want? They won’t of course. <em>That’s the whole point!</em></p>
+
+ <p>I bet this is the source of 99% of all malware on Windows. And the problem is that this is a perfectly acceptable way of getting software. Macs have the same problem to some minor extent. They are also being trained to download strange files from various pages. It is NOT accepted on Linux. The reason you don’t need antivirus on Linux is not because the system is more secure. All software is brittle and insecure. The vital difference is in how Linux users get their software.</p>
+
+ <h2 id="the-way-it-should-be">The way it should be</h2>
+
+ <p>Here’s a screenshot of the package manager in Debian:</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/May/synaptic.png" alt="Synaptic" /></p>
+
+ <p>Now let’s say I need a c++ compiler and one was not installed already. I search for “c++ compiler” and there’s clang. To this day, I have no idea how I can get a compiler on Windows.</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/May/synaptic_clang.png" alt="Searching for a compiler" /></p>
+
+ <p>Installing 99% of all software is super easy and reliable on Linux. All of these packages have been checked by the people working on the distro. If any package were to install a toolbar or other malware, you can bet your ass that it would be removed from the official sources. And because this is how Linux users are trained to install their software, they will have some degree of suspicion against download links on unknown websites. Installing malware becomes notably harder than installing good software.</p>
+
+ <h2 id="the-coming-app-stores">The coming app stores</h2>
+
+ <p>Both OS X and Windows are trying to push their users to use their “app stores”. While I have many negative things to say about them, they should hopefully reduce the included malware problem and train users to only install garbage from trusted sources.</p>
+
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Are iPads actually a step back?
+ https://cowboyprogrammer.org/2014/04/are-ipads-retarding-us/
+ Sat, 26 Apr 2014 00:00:00 +0000
+
+ https://cowboyprogrammer.org/2014/04/are-ipads-retarding-us/
+
+
+
+ <p>Think what you will of the iPad, but it has been a huge success for Apple and people love it. It’s one of the few products that appealed (past-tense) to both the geeks and _<a href="http://en.wikipedia.org/wiki/Hoi_polloi">hoi polloi</a>_.</p>
+
+ <p>I remember watching the keynote where the iPhone was introduced and immediately I thought <em>that’s the pad from Star-Trek TNG!</em> I <strong>had</strong> to have it.
+ Apple’s initial carrier exclusivity deals meant I had to wait for the iPhone 3g. Not only that, but because they partnered with a company I am sworned to destroy, I payed a guy in Italy to buy one unlocked and ship it to me for 7500SEK. Funny thing is that at the time I was a developer at Sony Ericsson, who did not think kindly of Apple entering their mobile domain. I got a lot of weird looks a work…</p>
+
+ <p>Then came the iPad. Again I’m thinking <em>holy shit that’s awesome.</em> At this point I had upgraded to an Android device (an HTC Legend) and had come to the conclusion that Android was far more interesting as a platform because of Apple’s restrictions on what apps can do. The customizability and capabilities on Android were far greater and as a developer, you appreciate that. However, <em>there were no Android tablets.</em> And there wouldn’t be for a long time.</p>
+
+ <p>I kept my cool though and managed to hold on to my money until the iPad 2 was released. I left early from work and lined up with other enthusiasts at the electronics store. At the time most people had no idea what they were going to do with it, me included, but I <strong>had</strong> to have it. I think my extended family clearly demonstrates how successful a product the iPad was. That same year I saw 3 iPads being gifted away (3 in a group of around 9 people!). By the next year, 3 more iPads were acquired. Everyone had to have one. It was one of those cases where you don’t get it until you see it for yourself.</p>
+
+ <h2 id="from-revolutionary-to-evolutionary">From revolutionary to evolutionary</h2>
+
+ <p>It is both a sign of how good the original product was and how little has changed that I never felt a reason to upgrade from the iPad 2.</p>
+
+ <ul>
+ <li>The battery life was fantastic.</li>
+ <li>The screen size just right.</li>
+ <li>The resolution was good enough.</li>
+ <li>The speed was fine (until recently).</li>
+ </ul>
+
+ <p>Hardware-wise, it was feature complete. The rest could be fixed in software. They never did though. The problem is iOS. Just as I abandoned the iPhone for Android, I now abandoned the iPad for a Nexus 7. There was so much potential being held back by the limitations of iOS.
+ <a href="http://stratechery.com/2014/dont-give-ipad/">Stratechery</a> explains some of my frustrations well. He means it as a defense in iOS’s favor though. But there is actually more to it than the limitations of iOS. Something inherent in the touch screen and the current mobile paradigm.</p>
+
+ <h2 id="limitations-of-the-touch-screen">Limitations of the touch screen</h2>
+
+ <p>I was playing <a href="https://play.google.com/store/apps/details?id=com.dotemu.rtype2">R-Type 2</a> on my Nexus 10 and kept dying on the boss in the second level. And I realized that while I might get lucky and finish the level, I would never be able to play the game well due to the touch screen.</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Apr/rtype2-boss.png" alt="R-Type 2 second level boss" /></p>
+
+ <p>See, R-Type is a classic side-scrolling <em>shoot-em-up</em>. You pilot a spaceship and have to avoid enemy fire, hordes of enemies, and not crash into the roof or ceiling. It is a game based entirely on mastering the controls. You can see a good example of what I mean in this clip of a similar game called <em>Gradius</em> for the NES.</p>
+
+ <iframe width="420" height="315" src="//www.youtube.com/embed/3PMpbPYB0iY" frameborder="0" allowfullscreen></iframe>
+
+ <p>The problem I was having was that I kept crashing into the floor as I tried to manouever around the boss. Having played for and hour or two (and still being stuck on level 2!) I came to realize that it wasn’t I that sucked, it was the controls. I had reached the limit of what was possible (precision-wise) with a touch screen.</p>
+
+ <h3 id="noobs-forever">Noobs forever</h3>
+
+ <p>And this is where the back-stepping begins. Growing up with NES, SNES, and a PC, I remember many older relatives noting the dexterity and precision in the thumbs of kids due to all the gaming. Video games required:</p>
+
+ <ul>
+ <li>hand-eye-coordination</li>
+ <li>hand dexterity</li>
+ <li>concentration</li>
+ </ul>
+
+ <p>To beat these games you needed <em>mastery</em> and <em>focus</em>. Not only was mastery required, it was the <em>reward</em>. The games suitable for touch screens can require neither. So tablet games will remain at a level no more advanced than snake or scrabble. (As a side note, what really can work is turn-based strategy games.)</p>
+
+ <h3 id="no-such-thing-as-a-touch-typist">No such thing as a touch typist</h3>
+
+ <p>Just as serious gaming becomes impossible due to the touch interface, serious productivity suffers from the same limitations. It’s funny to see things like Microsoft Office being released for the iPad because it’s impossible to work with. Serious productivity requires the efficient inputting of language, be it English or Python. The touch keyboard is unable to let you do that. There is no such thing as a touch typist. On a tablet, everyone goes back to tapping with two fingers. There is nothing to master here (due to the lack of feedback) and so everyone will remain as noobs forever.</p>
+
+ <h2 id="the-dark-age-begins">The dark age begins</h2>
+
+ <p>Maybe you’re thinking to yourself:</p>
+
+ <blockquote>
+ <p><em>so what if a touch screen isn’t ideal for everything, no input device is!</em></p>
+ </blockquote>
+
+ <p>If you are, then I agree. Nothing can be great at everything. You use the right tool for the right job. The problem is the tremendous success of the tablet. This is where I think the geeks have a different view of where we are headed.</p>
+
+ <p>Geeks see the benefits of the touch screen. Its strengths, but also its weaknesses. They use it when it’s convenient. For more serious work, they move to their workstation, with keyboard and screen.</p>
+
+ <p>Non-geeks see the tablet as <em>“the future”</em>. They never liked their PC to begin with. It was just something they were forced to acquire to be able to pay their bills. They see the tablet as liberating. Geeks see the tablet as confining.</p>
+
+ <p>The success of the tablet amongst geeks and non-geeks combined means companies are scrambling to push everything into tablet interfaces. Apple is clearly moving towards iOS as OSX is evolving. Microsoft has already gone too far:</p>
+
+ <iframe width="560" height="315" src="//www.youtube.com/embed/WTYet-qf1jo" frameborder="0" allowfullscreen></iframe>
+
+
+ <p>But it’s not just the tablet interface. It’s the whole mobile paradigm that is spreading. With it comes the <em>app stores</em>, where every app is pre-approved by the benevolent corporation that owns your <del>soul</del> apps and music. The corporation reserves the right to remove any app or in-app purchase it deems unworthy of your attention. <a href="http://www.nytimes.com/2009/07/18/technology/companies/18amazon.html?_r=0">Amazon did it</a>, <a href="http://www.pcworld.com/article/2095060/apple-removes-blockchain-last-bitcoin-wallet-app-from-mobile-store.html">Apple does it all the time</a>, <a href="http://www.wired.co.uk/news/archive/2014-01/20/microsoft-removes-tor">and same for Microsoft</a>.</p>
+
+ <p>I would say that Linux is the only alternative going forward, but then again, <a href="https://www.gnu.org/philosophy/ubuntu-spyware.html">Canonical is showing that not even Linux is safe</a>.</p>
+
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Advertising, that's not intrusive. Orly?
+ https://cowboyprogrammer.org/2014/04/advertising-thats-not-intrusive-orly/
+ Mon, 07 Apr 2014 00:00:00 +0000
+
+ https://cowboyprogrammer.org/2014/04/advertising-thats-not-intrusive-orly/
+
+
+
+ <p>When you have apps in Google Play (and I imagine, other App stores as well), the amount of spam you receive instantly goes up by a factor of 10. Google’s spam filters are pretty well trained but every now and again something gets through.</p>
+
+ <h2 id="advertising-opportunity">Advertising opportunity</h2>
+
+ <p>Today’s piece of bullshyt (I really meant to spell it like that) reads as follows (my emphasis):</p>
+
+ <blockquote>
+ <p>Our premium advertisers are currently looking to buy android traffic at a very high price in apps like Nononsense Notes.</p>
+
+ <p>We think you can generate up to $10 CPM with their <strong>full screen ads</strong>, which are <strong>very clean</strong>. Indeed, most of our advertisers are willing to pay, on average, between $1 and $3 per installation. You’re free to display these ads whenever you want in your app so that it’s <strong>not intrusive</strong>.</p>
+ </blockquote>
+
+ <p>Ads are by definition <em>intrusive</em>. That’s how they nag you into buying their stupid stuff. And it doesn’t matter how clean your ads are. Displaying them fullscreen is <em>beyond</em> intrusive. It is down right <strong>offensive</strong>.</p>
+
+ <p>I uninstall anything that displays obnoxious ads, be they fullscreen or notifications, and promptly give the app a one star review. I sincerely hope others afford me the same “courtesy” for my apps.</p>
+
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Convert to Android Studio and Gradle today!
+ https://cowboyprogrammer.org/2014/04/convert-to-android-studio-and-gradle-today/
+ Mon, 07 Apr 2014 00:00:00 +0000
+
+ https://cowboyprogrammer.org/2014/04/convert-to-android-studio-and-gradle-today/
+
+ <p>Took the plunge and converted NoNonsense Notes from Ant and Eclipse to Gradle and Android Studio. It took some googling and a fair bit of frustration but in the end it was very much worth it.</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Apr/android_studio_shot1.png" alt="Android Studio screenshot" /></p>
+
+ <p>Eclipse has been broken for me for about 6 months or so. So very little of it’s powerful features were available during development. The ant build worked fine but Eclipse uses its own which is mysterious and requires constant refreshes and cleaning. Often in a particular order on each library project which was a dependency.</p>
+
+ <p>With gradle on the other hand, if it builds in the console then it will build in Android Studio. Once again I am able to use a debugger!</p>
+
+ <p>I can warmly recommend people to take a day and setup some <em>build.gradle</em> files.</p>
+
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Dark themes everywhere
+ https://cowboyprogrammer.org/2014/04/dark-themes-everywhere/
+ Mon, 07 Apr 2014 00:00:00 +0000
+
+ https://cowboyprogrammer.org/2014/04/dark-themes-everywhere/
+
+
+
+ <p>I have come to really appreciate dark themes in the programs that I
+ use. Be it any of my Android devices or my <em>real</em> computers, I prefer
+ dark themes. In Emacs, it’s as easy as <code>M-x load-theme wombat</code>. And
+ wombat is probably my current favourite dark theme. Dark greys
+ combined with nice shades of blue, green and red. This entire web site
+ is (at the time of this post) presented in the wombat colors.</p>
+
+ <p>Of course, a lot of time is spent in the web browser and I have come
+ to understand that most web designers don’t share my love for the
+ darkness. Long have I suffered in the depressing and blinding white
+ backgrounds of the “Web 2.0”.</p>
+
+ <p><strong>N O - M O R E</strong></p>
+
+ <p>I have just come into the possession of some writings that magically
+ destroys the light infestation in my life. Now I can enjoy the dark
+ majestic background that is <code>#202020</code> everywhere.</p>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Apr/dark-conkeror-google.png" alt="Dark conkeror in Google" /></p>
+
+ <p>This is naturally possible to do in most browsers but I’ll talk about
+ conkeror specifically. What’s most interesting is probably the CSS
+ so you don’t have to write that yourself.</p>
+
+ <p>Great thanks to <a href="http://jaderholm.com/blog/programothesis-18-conkeror-color-theme">Scott Jaderholm</a> for doing all the work.</p>
+
+ <h2 id="conkeror">Conkeror</h2>
+
+ <p><a href="http://conkeror.org">Conkeror</a> is a web browser based on the same
+ underlying tech as Firefox. What makes it unique is its Emacs-like interface. It is essentially what you imagine a good browser in Emacs would be like. Like Emacs, tweaks can be made by adding code (javascript) to its configuration files.</p>
+
+ <p>By default, it loads all <code>.js</code> files in <code>~/.conkerorrc/</code>. So what you want to do is download the <code>color-theme.js</code> and <code>site-css</code>
+ files/folders from <a href="https://github.com/scottjad/dotfiles/tree/master/.conkerorrc">Scott’s repo</a> and put that in your <code>.conkerorrc</code> dir. That’s basically it, but a few additional tweaks can be done.</p>
+
+ <h2 id="fixing-github-diff-colors">Fixing GitHub diff colors</h2>
+
+ <p>GitHub must have updated their styles since Scott’s post. To fix the diff colors, the following works (replace the existing GitHub entry with this):</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span> make_css_data_uri(
+ [<span style="color: #4070a0">'.k { font-weight: bold !important; }'</span>, <span style="color: #60a0b0; font-style: italic">// keyword</span>
+ <span style="color: #4070a0">'a, h1, code, pre {text-shadow: 0px 0px 0px black !important; }'</span>,
+ <span style="color: #4070a0">'.nv { color: #aaa !important; } '</span>, <span style="color: #60a0b0; font-style: italic">// function name/variable name</span>
+ <span style="color: #4070a0">'.s { color: #95e454 !important; } '</span>, <span style="color: #60a0b0; font-style: italic">// string</span>
+ <span style="color: #4070a0">'.c1 { color: #99968b !important; '</span><span style="color: #666666">+</span>
+ <span style="color: #4070a0">'font-style: normal !important; }'</span>, <span style="color: #60a0b0; font-style: italic">// comment</span>
+ <span style="color: #4070a0">'.gi, .gi * { color: #1AFF84 !important; }'</span>, <span style="color: #60a0b0; font-style: italic">// inserted line</span>
+ <span style="color: #4070a0">'.gd, .gd * { color: #ff0080 !important; }'</span> <span style="color: #60a0b0; font-style: italic">// deleted line</span>
+ ], $domains <span style="color: #666666">=</span> <span style="color: #4070a0">"github.com"</span>)
+ </code></pre></div>
+
+ <p><img src="https://cowboyprogrammer.org/images/2014/Apr/dark-conkeror-github.png" alt="Dark conkeror GitHub" /></p>
+
+ <h2 id="enabling-dark-theme-by-default">Enabling dark theme by default</h2>
+
+ <p>I always want the dark theme enabled by default. This is the main theme function (I removed all themes but the dark one as well):</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span> <span style="color: #007020; font-weight: bold">function</span> global_color_theme(name, key, styles) {
+ interactive_cmd <span style="color: #666666">=</span> <span style="color: #4070a0">"toggle-"</span> <span style="color: #666666">+</span> name <span style="color: #666666">+</span> <span style="color: #4070a0">"-mode"</span>;
+ <span style="color: #60a0b0; font-style: italic">// Enable by default here</span>
+ <span style="color: #007020; font-weight: bold">for</span>(x <span style="color: #007020; font-weight: bold">in</span> styles) {
+ register_user_stylesheet(styles[x]);
+ }
+ color_theme_toggle[name] <span style="color: #666666">=</span> <span style="color: #007020; font-weight: bold">true</span>;
+ <span style="color: #60a0b0; font-style: italic">// Add toggle function</span>
+ interactive(interactive_cmd, <span style="color: #4070a0">""</span>,
+ <span style="color: #007020; font-weight: bold">function</span> (I) {
+ <span style="color: #007020; font-weight: bold">if</span> (color_theme_toggle[name]) {
+ <span style="color: #007020; font-weight: bold">for</span>(x <span style="color: #007020; font-weight: bold">in</span> styles) {
+ unregister_user_stylesheet(styles[x]);
+ }
+
+ color_theme_toggle[name] <span style="color: #666666">=</span> <span style="color: #007020; font-weight: bold">false</span>;
+ } <span style="color: #007020; font-weight: bold">else</span> {
+ <span style="color: #007020; font-weight: bold">for</span>(x <span style="color: #007020; font-weight: bold">in</span> styles) {
+ register_user_stylesheet(styles[x]);
+ }
+ color_theme_toggle[name] <span style="color: #666666">=</span> <span style="color: #007020; font-weight: bold">true</span>;
+ }
+ });
+ <span style="color: #60a0b0; font-style: italic">// Add a disable function</span>
+ interactive(<span style="color: #4070a0">"disable-"</span><span style="color: #666666">+</span>name<span style="color: #666666">+</span><span style="color: #4070a0">"-theme"</span>,<span style="color: #4070a0">""</span>, <span style="color: #007020; font-weight: bold">function</span>() {
+ <span style="color: #007020; font-weight: bold">for</span>(x <span style="color: #007020; font-weight: bold">in</span> styles) {
+ unregister_user_stylesheet(styles[x]);
+ }
+ color_theme_toggle[name] <span style="color: #666666">=</span> <span style="color: #007020; font-weight: bold">false</span>;
+ });
+ <span style="color: #60a0b0; font-style: italic">// Add an enable function</span>
+ interactive(<span style="color: #4070a0">"enable-"</span><span style="color: #666666">+</span>name<span style="color: #666666">+</span><span style="color: #4070a0">"-theme"</span>,<span style="color: #4070a0">""</span>, <span style="color: #007020; font-weight: bold">function</span>() {
+ <span style="color: #007020; font-weight: bold">for</span>(x <span style="color: #007020; font-weight: bold">in</span> styles) {
+ register_user_stylesheet(styles[x]);
+ }
+ color_theme_toggle[name] <span style="color: #666666">=</span> <span style="color: #007020; font-weight: bold">true</span>;
+ });
+ <span style="color: #60a0b0; font-style: italic">// I don't care for a keybinding for this</span>
+ <span style="color: #60a0b0; font-style: italic">//define_key(default_global_keymap, key, interactive_cmd);</span>
+ }
+ </code></pre></div>
+
+ <h2 id="make-the-wombat-theme-even-darker">Make the Wombat theme even darker</h2>
+
+ <p>I prefer an even darker background than the one provided. I have also learned the importance of the <code>!important</code> tag and semicolons in css (damn you!!!). This is incidentally the wombat css that I’m using for syntax highlighting here on the site. If you change anything don’t forget to make sure the line ends with <code>!important</code> (and semicolon in case of multiple attributes) or the css won’t take.</p>
+
+ <p>The changes are pretty much in the upper section but I re-formatted the file to make it more readable:</p>
+ <div class="highlight" style="background: #f0f0f0"><pre style="line-height: 125%"><code><span></span> <span style="color: #062873; font-weight: bold">code</span><span style="color: #666666">,</span> <span style="color: #062873; font-weight: bold">pre</span><span style="color: #666666">,</span> <span style="color: #062873; font-weight: bold">code</span> <span style="color: #666666">*,</span> <span style="color: #062873; font-weight: bold">pre</span> <span style="color: #666666">*</span> {
+ <span style="color: #60a0b0; font-style: italic">/* Code should always be in monospace */</span>
+ <span style="color: #007020; font-weight: bold">font-family</span>: DejaVu Sans Mono <span style="color: #007020">!important</span>;
+ <span style="color: #60a0b0; font-style: italic">/*color: #f6f3e8 !important;*/</span>
+ <span style="color: #60a0b0; font-style: italic">/*background-color: #202020 !important;*/</span>
+ <span style="color: #60a0b0; font-style: italic">/*font-size: 10pt !important;*/</span>
+ }
+
+ .<span style="color: #0e84b5; font-weight: bold">linenos</span> <span style="color: #666666">*</span> {
+ <span style="color: #007020; font-weight: bold">margin-right</span>: <span style="color: #40a070">0.5</span><span style="color: #902000">em</span> <span style="color: #007020">!important</span>;
+ }
+
+ .<span style="color: #0e84b5; font-weight: bold">highlight</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlighttable</span> {
+ <span style="color: #007020; font-weight: bold">background</span>: <span style="color: #40a070">#303030</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ }
+ .<span style="color: #0e84b5; font-weight: bold">hll</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">hll</span> {
+ <span style="color: #007020; font-weight: bold">background-color</span>: <span style="color: #40a070">#ffffcc</span> <span style="color: #007020">!important</span>;
+ }
+ .<span style="color: #0e84b5; font-weight: bold">c</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">c</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#99968b</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Comment */</span>
+ .<span style="color: #0e84b5; font-weight: bold">err</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">err</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Error */</span>
+ .<span style="color: #0e84b5; font-weight: bold">g</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">g</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Generic */</span>
+ .<span style="color: #0e84b5; font-weight: bold">k</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">k</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#8ac6f2</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Keyword */</span>
+ .<span style="color: #0e84b5; font-weight: bold">l</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">l</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal */</span>
+ .<span style="color: #0e84b5; font-weight: bold">n</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">n</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name */</span>
+ .<span style="color: #0e84b5; font-weight: bold">o</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">o</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Operator */</span>
+ .<span style="color: #0e84b5; font-weight: bold">x</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">x</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Other */</span>
+ .<span style="color: #0e84b5; font-weight: bold">p</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">p</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Punctuation */</span>
+ .<span style="color: #0e84b5; font-weight: bold">cm</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">cm</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#99968b</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Comment.Multiline */</span>
+ .<span style="color: #0e84b5; font-weight: bold">cp</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">cp</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#e5786d</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Comment.Preproc */</span>
+ .<span style="color: #0e84b5; font-weight: bold">c1</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">c1</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#99968b</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Comment.Single */</span>
+ .<span style="color: #0e84b5; font-weight: bold">cs</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">cs</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#99968b</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Comment.Special */</span>
+ .<span style="color: #0e84b5; font-weight: bold">gd</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">gd</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Generic.Deleted */</span>
+ .<span style="color: #0e84b5; font-weight: bold">ge</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">ge</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Generic.Emph */</span>
+ .<span style="color: #0e84b5; font-weight: bold">gr</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">gr</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Generic.Error */</span>
+ .<span style="color: #0e84b5; font-weight: bold">gh</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">gh</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-weight</span>: <span style="color: #007020; font-weight: bold">bold</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Generic.Heading */</span>
+ .<span style="color: #0e84b5; font-weight: bold">gi</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">gi</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Generic.Inserted */</span>
+ .<span style="color: #0e84b5; font-weight: bold">go</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">go</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#808080</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">background-color</span>: <span style="color: #40a070">#202020</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Generic.Output */</span>
+ .<span style="color: #0e84b5; font-weight: bold">gp</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">gp</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Generic.Prompt */</span>
+ .<span style="color: #0e84b5; font-weight: bold">gs</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">gs</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Generic.Strong */</span>
+ .<span style="color: #0e84b5; font-weight: bold">gu</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">gu</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-weight</span>: <span style="color: #007020; font-weight: bold">bold</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Generic.Subheading */</span>
+ .<span style="color: #0e84b5; font-weight: bold">gt</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">gt</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Generic.Traceback */</span>
+ .<span style="color: #0e84b5; font-weight: bold">kc</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">kc</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#8ac6f2</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Keyword.Constant */</span>
+ .<span style="color: #0e84b5; font-weight: bold">kd</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">kd</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#8ac6f2</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Keyword.Declaration */</span>
+ .<span style="color: #0e84b5; font-weight: bold">kn</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">kn</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#8ac6f2</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Keyword.Namespace */</span>
+ .<span style="color: #0e84b5; font-weight: bold">kp</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">kp</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#8ac6f2</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Keyword.Pseudo */</span>
+ .<span style="color: #0e84b5; font-weight: bold">kr</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">kr</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#8ac6f2</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Keyword.Reserved */</span>
+ .<span style="color: #0e84b5; font-weight: bold">kt</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">kt</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#cae682</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Keyword.Type */</span>
+ .<span style="color: #0e84b5; font-weight: bold">ld</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">ld</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.Date */</span>
+ .<span style="color: #0e84b5; font-weight: bold">m</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">m</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#e5786d</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.Number */</span>
+ .<span style="color: #0e84b5; font-weight: bold">s</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">s</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#95e454</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.String */</span>
+ .<span style="color: #0e84b5; font-weight: bold">na</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">na</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#cae682</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Attribute */</span>
+ .<span style="color: #0e84b5; font-weight: bold">nb</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">nb</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Builtin */</span>
+ .<span style="color: #0e84b5; font-weight: bold">nc</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">nc</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Class */</span>
+ .<span style="color: #0e84b5; font-weight: bold">no</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">no</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#e5786d</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Constant */</span>
+ .<span style="color: #0e84b5; font-weight: bold">nd</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">nd</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#ff0080</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Decorator */</span>
+ .<span style="color: #0e84b5; font-weight: bold">ni</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">ni</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#e7f6da</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Entity */</span>
+ .<span style="color: #0e84b5; font-weight: bold">ne</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">ne</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Exception */</span>
+ .<span style="color: #0e84b5; font-weight: bold">nf</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">nf</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#cae682</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Function */</span>
+ .<span style="color: #0e84b5; font-weight: bold">nl</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">nl</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Label */</span>
+ .<span style="color: #0e84b5; font-weight: bold">nn</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">nn</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Namespace */</span>
+ .<span style="color: #0e84b5; font-weight: bold">nx</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">nx</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Other */</span>
+ .<span style="color: #0e84b5; font-weight: bold">py</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">py</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Property */</span>
+ .<span style="color: #0e84b5; font-weight: bold">nt</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">nt</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#8ac6f2</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Tag */</span>
+ .<span style="color: #0e84b5; font-weight: bold">nv</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">nv</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#cae682</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Variable */</span>
+ .<span style="color: #0e84b5; font-weight: bold">ow</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">ow</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Operator.Word */</span>
+ .<span style="color: #0e84b5; font-weight: bold">w</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">w</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Text.Whitespace */</span>
+ .<span style="color: #0e84b5; font-weight: bold">mf</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">mf</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#e5786d</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.Number.Float */</span>
+ .<span style="color: #0e84b5; font-weight: bold">mh</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">mh</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#e5786d</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.Number.Hex */</span>
+ .<span style="color: #0e84b5; font-weight: bold">mi</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">mi</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#e5786d</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.Number.Integer */</span>
+ .<span style="color: #0e84b5; font-weight: bold">mo</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">mo</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#e5786d</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.Number.Oct */</span>
+ .<span style="color: #0e84b5; font-weight: bold">sb</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">sb</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#95e454</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.String.Backtick */</span>
+ .<span style="color: #0e84b5; font-weight: bold">sc</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">sc</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#95e454</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.String.Char */</span>
+ .<span style="color: #0e84b5; font-weight: bold">sd</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">sd</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#95e454</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.String.Doc */</span>
+ .<span style="color: #0e84b5; font-weight: bold">s2</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">s2</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#95e454</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.String.Double */</span>
+ .<span style="color: #0e84b5; font-weight: bold">se</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">se</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#95e454</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.String.Escape */</span>
+ .<span style="color: #0e84b5; font-weight: bold">sh</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">sh</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#95e454</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.String.Heredoc */</span>
+ .<span style="color: #0e84b5; font-weight: bold">si</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">si</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#95e454</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.String.Interpol */</span>
+ .<span style="color: #0e84b5; font-weight: bold">sx</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">sx</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#95e454</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.String.Other */</span>
+ .<span style="color: #0e84b5; font-weight: bold">sr</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">sr</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#95e454</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.String.Regex */</span>
+ .<span style="color: #0e84b5; font-weight: bold">s1</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">s1</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#95e454</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.String.Single */</span>
+ .<span style="color: #0e84b5; font-weight: bold">ss</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">ss</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#95e454</span> <span style="color: #007020">!important</span>;
+ <span style="color: #007020; font-weight: bold">font-style</span>: <span style="color: #007020; font-weight: bold">italic</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.String.Symbol */</span>
+ .<span style="color: #0e84b5; font-weight: bold">bp</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">bp</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#f6f3e8</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Builtin.Pseudo */</span>
+ .<span style="color: #0e84b5; font-weight: bold">vc</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">vc</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#cae682</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Variable.Class */</span>
+ .<span style="color: #0e84b5; font-weight: bold">vg</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">vg</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#cae682</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Variable.Global */</span>
+ .<span style="color: #0e84b5; font-weight: bold">vi</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">vi</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#cae682</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Name.Variable.Instance */</span>
+ .<span style="color: #0e84b5; font-weight: bold">il</span><span style="color: #666666">,</span> .<span style="color: #0e84b5; font-weight: bold">highlight</span> .<span style="color: #0e84b5; font-weight: bold">il</span> {
+ <span style="color: #007020; font-weight: bold">color</span>: <span style="color: #40a070">#e5786d</span> <span style="color: #007020">!important</span>;
+ } <span style="color: #60a0b0; font-style: italic">/* Literal.Number.Integer.Long */</span>
+ </code></pre></div>
+
+
+
+
+
+
+
+ https://cowboyprogrammer.org/css/images/logo.png
+
+ Getting Adblock to work in Conkeror
+ https://cowboyprogrammer.org/2014/04/getting-adblock-to-work-in-conkeror/
+ Mon, 07 Apr 2014 00:00:00 +0000
+
+ https://cowboyprogrammer.org/2014/04/getting-adblock-to-work-in-conkeror/
+
+ <p>Conkeror supports firefox addons to varying degrees. I found that a good indicator is if the addon has support for Firefox 3. This means you can use Adblock 2.0. But, the GUI for selecting a filter subscription will not show. Hence the need to install Adblock 1.3 <strong>first</strong>. To get Adblock up and running in Conkeror, do the following:</p>
+
+ <ol>
+ <li>In your rc-file, set:
+ <code>javascript
+ session_pref("xpinstall.whitelist.required", false);
+ </code></li>
+ <li>Go to <a href="https://addons.mozilla.org/en-US/firefox/addon/adblock-plus/versions/">Adblock versions</a>.</li>
+ <li>Install <strong>1.3.10</strong>.</li>
+ <li>Open extensions: <code>M-x extensions</code>.</li>
+ <li>Go into preferences for Adblock and subscribe to a list, like
+ <em>Easylist</em>. The list might complain about requiring Adblock 2 for
+ some filters, which is fine since we will fix that next.</li>
+ <li>Now go back and download/install version <strong>2.0.1</strong>.</li>
+ <li>Enjoy the web again.</li>
+ </ol>
+
+
+
+
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_cyklistbloggen.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_cyklistbloggen.xml
new file mode 100644
index 000000000..b2a39616c
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_cyklistbloggen.xml
@@ -0,0 +1,557 @@
+
+
+
+ Cyklistbloggen
+
+ http://www.cyklistbloggen.se
+ Två Stockholmscyklister om vardagscyklande, utrustning och politik
+ Thu, 27 Apr 2017 13:16:30 +0000
+ sv-SE
+ hourly
+ 1
+ https://wordpress.org/?v=4.7.4
+
+
+ http://www.cyklistbloggen.se/wp-content/uploads/2016/10/cropped-WP-ikon_512x_512-1-32x32.png
+ Cyklistbloggen
+ http://www.cyklistbloggen.se
+ 32
+ 32
+
+
+ Ingen ombyggning av Danvikstull
+ http://www.cyklistbloggen.se/2017/04/ingen-ombyggning-av-danvikstull/
+ http://www.cyklistbloggen.se/2017/04/ingen-ombyggning-av-danvikstull/#comments
+ Thu, 27 Apr 2017 13:00:11 +0000
+
+
+
+
+
+
+ http://www.cyklistbloggen.se/?p=26187
+ Läs vidare →]]>
+
+
+
För mer än tre år sedan aviserade dåvarande Allians-styrda Stockholms Stad att man äntligen skulle bredda den extremt smala passagen på pendlingsstråket vid Danvikstull:
+
+
I smalaste passagen är gångdelen bara något tiotal centimeter brett och det är är en väg som används av trafikanter från flera kommuner och stadsdelar, från Nacka, Värmdö, Söderort och de över 30000 i Hammarby Sjöstad.
”Ambitionen är fortfarande att öka framkomligheten för cykeltrafiken längs det aktuella stråket. På sikt kommer Hästholmsviadukten, bron även Värmdöleden, behöva ersättas. Om detta görs med en ny konstruktion utan bropelare skulle plats kunna frigöras så att gång- och cykelbanan kan breddas. I dagsläget pågår dock inget aktivt arbete med detta.”
+
+I dagsläget pågår dock inget aktivt arbete med detta.
+
Hästholmsviadukten är alltså bron som går över pendlingsstråket. Här är platsen på Google Maps. Bilvägen brevid, Värmdöleden, är sexfilig in till Södermalm och innerstaden.
+
2014 var tanken att vägen skulle breddas genom att berget sågades bort. Men det gick inte. Så här sa Trafikkontoret då:
+
– Arbetet visade sig ta mycket längre tid än beräknat och skulle ha medfört trafikstörningar på Värmdöleden under tre-fyra månader, vilket skulle ha inneburit stora påfrestningar för resandet.
+
Tre-fyra månader alltså av meck för dem som vill köra in i innerstaden, på vägen som 2017 leder till Stadsgårdsleden och den i princip avstängda Slussen.
+
För er som följt bloggen över tid så vet ni att det tar tid att planera vägarbeten. Ett ärende där det faktiskt pågår aktivt arbete kan ta fyra-fem år att genomföra. Att bygga ny bro förmodligen ännu längre.
+
Så ni som cyklar över Danvikstull, förvänta er ingen förändring alls de närmaste tio åren.
SvD fortsätter sin serie ”Det är vår, vi drar ihop något om cyklister” och slår fast att:
+
+
”Antalet cyklister som dör i trafiken ökar”. Jösses, det har vi inte hört sedan 2014.
+
Skälet till det är att man måste vara lite selektiv för att få till den där rubriken. 2014 dog enligt VTI 32 (33 enligt Trafa) cyklister i trafiken, mot 16 (14 enligt Trafa) 2013. En dramatisk ökning – som avspeglade sig i rubriker om massdöd bland cyklister i tidningarna under 2015. Under 2016 däremot var det tystare. Skälet var att under 2015 dog ”bara” 16 cyklister igen. Så hepp, det minskade alltså. Och det är inte lika roligt att skriva rubriken ”Antalet döda cyklister i trafiken minskade drastiskt!” av någon anledning.
+
Så, 2016 hamnade siffran enligt Trafikanalys rapport som släpptes idag på 22 döda cyklister. Cue alltså ”Antalet döda ökar”. Nu ser den vakne lite ett mönster här. 16, 32, 16, 22. Vi plottar det i ett diagram istället:
+
+
Vi meckade in de två senaste åren där. Som ni ser ökar inte antalet dödade cyklister, annat än i den snäva betydelsen ”sedan förra året”. Tittar man tillbaks hela vägen till 1988 så minskar antalet. Rejält. Man skulle kunna börja tala om att minskningen planat ut sedan 2009-2010 – och det trots att antalet cyklister ökat senaste åren.
+
Men ökar gör det inte. Men det är det knepigare att skapa rubriker av.
Till exempel ska NTF’s generalsekreterare Marie Nordén ha all cred för att hon inte nämner hjälm utan:
+
– Trafikmiljön är i mångt och mycket byggd för bilismen, sen har man ofta klämt in cyklister och fotgängare på samma område, säger hon.
+
och
+
– Ett sätt att försöka minska olyckorna vore också att införa enhetliga lagar så att samma regler gäller vid både cykelpassage och cykelöverfart, tycker Marie Nordén.
+
Nu börjar det likna något.
+
+]]>
+ http://www.cyklistbloggen.se/2017/04/nej-svd-antalet-dodade-cyklister-okar-inte/feed/
+ 3
+
+
+ ”Vilka är de värsta cyklisterna tycker du?” – Svenska Dagbladet skriver om cykling idag.
+ http://www.cyklistbloggen.se/2017/04/vilka-ar-de-varsta-cyklisterna-tycker-du-svenska-dagbladet-skriver-om-cykling-idag/
+ http://www.cyklistbloggen.se/2017/04/vilka-ar-de-varsta-cyklisterna-tycker-du-svenska-dagbladet-skriver-om-cykling-idag/#comments
+ Sun, 23 Apr 2017 10:05:26 +0000
+
+
+
+
+
+ http://www.cyklistbloggen.se/?p=26162
+ Läs vidare →]]>
+
+
Det tydligaste cykelvårtecknet är inte fler cyklister utan att sånt här plötsligt dyker upp i ens Facebookflöde:
+
+
”Vilka är de värsta cyklisterna, tycker du?” – sug på den frågan (vill man svara, går det att klicka på bilden för att hamna på inlägget).
+
Ja vilka är de värsta cyklisterna? Och varför kör cyklisterna på alla fotgängare hela tiden? Ska vi ha det så här! VA??!!
+
Och varför skulle man inte göra en Facebookuppdatering polariserad och se till att piska upp lite ilska mellan olika grupper? Vad kan vara fel med det? Det är väl det sociala medier är till för. Fast vem ska vi peka finger åt?
+
Ja vi tar väl det vi brukar, cyklisterna. De är ju fan i vägen överallt.
+
Vi kan såklart inte låta bli att klicka och hey, vi blir besvikna. Större delen av SvDs artikel är något så märkligt som en rätt nyanserad och problematiserande bild av det faktum att cyklister i Stockholm i princip alltid cyklar i någon annans vägbana. Antingen avskydda bland bilar, eller avskydda på kombinerade gång- och cykelbanor där de enligt till exempel polisen har att anpassa sig efter fotgängarna.
Det negativa möjligtvis att man som vanligt buntar ihop två helt olika saker, a) skyldighet att följa trafikregler och b) att antalet skadade i cykelolyckor ökar, det sista paradoxalt nog ifrågasatt nästan direkt i texten:
+
Till stor del beror ökningen på att fler akutsjukhus nu anslutit sig till att rapportera till Transportstyrelsen, framhåller Tomas Fredlund, trafiksäkerhetsanalytiker vid Transportstyrelsen.
+
Det här är något vi varit inne på förut, nämligen att det kanske är så att antalet olyckor inte ökar, utan att statistiken förbättrats:
– Man bör i alla lägen separera trafikslag och ska helst inte blanda cyklister och gående, säger han.
+
– Medan man i Nederländerna och Danmark i högre grad ser på cykeln som ett eget trafikslag, har man i Sverige buntat ihop fotgängare och cyklister på olyckligt sätt.
+
Vi håller som sagt med – Stockholms vanföreställning att cyklister bara är ett slags fotgängare är vansinnig.
+
Men rimligt hela vägen ner tills man avslutar med ytterligare en formular 1A – random polisman som tycker till:
+
– Bilister följer vanligtvis regelverk, vilket jag har en känsla av att många cyklister inte gör. När vi genomför våra spontana kontroller riktade mot cyklister ser vi i regel väldigt många regelbrott.
+
Eller hur. En känsla av att ”många” cyklister inte gör. Vi har ju dragit den här diskussionen en miljard varv vid det här laget, så vi sammanfattar kort: Ja, det finns cyklister som bryter mot lagen, ja det är dumt – när det gäller övergångsställen har vi tex skrivit:
Men random polisman den här gången, Hans Nilsson, kommissarie vid trafiksektorn vid Polisen i Stockholm väljer att ta det ett steg till:
+
– Bilister följer vanligtvis regelverk,
+
Eller hur. Bilister följer lagen och cyklister kör som tokar. Nu tänker vi inte fasta i den här ”Vem är värst”-diskussionen, den ståndpunkt vi tycker vi har stöd för är att det finns bra och det finns dåliga trafikanter och det styrs inte av hur de tar sig fram. Cyklister är inte värre än någon annan, eller bättre för den delen.
Men. Det här med att bilister ”vanligtvis” följer regelverk, alltså här i betydelsen ”till skillnad från cyklister”? We beg to differ.
+
+
+
+
+
+
+
+
+
Och minns när kommunen tvingades installera spårviddshinder på Skeppsbron eftersom ingen brydde sig om att det var förbjudet att köra där. Så här såg det ut:
+
+
Och så här skriver polisen nu 2017, mer än ett år senare:
+
+
Och vi avslutar med att utifrån det konstatera att förståelsen och toleransen för lagbrott beror på vilket trafikslag man tillhör.
+
+]]>
+ http://www.cyklistbloggen.se/2017/04/vilka-ar-de-varsta-cyklisterna-tycker-du-svenska-dagbladet-skriver-om-cykling-idag/feed/
+ 10
+
+
+ Så här skulle vi gjort Skanstull-Hammarby Allé
+ http://www.cyklistbloggen.se/2017/04/sa-har-skulle-vi-gjort-skanstull-hammarby-alle/
+ http://www.cyklistbloggen.se/2017/04/sa-har-skulle-vi-gjort-skanstull-hammarby-alle/#comments
+ Thu, 20 Apr 2017 10:25:09 +0000
+
+
+
+
+
+
+ http://www.cyklistbloggen.se/?p=26128
+ Läs vidare →]]>
+
+
Nu har vi i två inlägg tittat på nya Skansbron-Hammarby Allé, pendlingsväg för dem av de 35000 sjöstadsborna som väljer att cykla in till city. Vi är inte jätteimponerade. Vi tänkte därför lite konstruktivt visa hur vi, som amatörer på trafikplanering, men rätt vana pendlingscyklister, hade gjort. Och nu är vi rädda att det förmodligen mer blir en post för de närmast sörjande, alltså sjöstadsbor och kanske boende i Hammarbyhöjden.
+
För det första hade vi utgått från premisserna att Hammarby Sjöstad är a) en stadsdel med extremt höga miljöambitioner b) Hem för alltså 35000 personer och c) bara har en alternativ annan cykelväg till city, som ser ut så här:
+
Alltså vägen över Danvikstull. Dubbelriktad cykelväg. Dubbelriktad gångväg. Som förövrigt skulle breddas 2014, men det blev inte av.
+
+
I korthet, vi hade utgått från att det är en rätt viktig väg att få fart på cykling på. Och som av en slump hittade vi häromdagen cykelappen Stravas ”heatmap”, där man kan se hur de som använder appen cyklar. Nu ska sägas att många av dem som använder Strava är motionscyklister och som sådana kanske inte helt representativa för oss vardagscyklister. Men det ger ändå en indikation. Här är vägen 2014:
+
+
Ni ser att den höga Skansbron är knallröd av intensiv cykeltrafik. Ni ser också att Hammarby Allé och sträckan mellan de två cirkulationsplatserna (markerat med pedagogiska gröna pilar) är ljus till mörkblå. Notera att 2014-2015 var cykeltrafiken omledd till den mörkblå södra sidan av Hammarby Allé.
+
+
2015 är ena sträckan, den in mot sjöstan också den röd. Trafiken från Hammarbyhöjden ner till Skansbron har också den ökat rejält. Det här är två år sedan. Jag har inte sett aktuella heatmaps, men jag tror inte de minskat.
+
Det här är en viktig väg för flera stadsdelar och den blir alltså allt viktigare.
+
Så här går cykelvägen idag (grönt södergående, blått norrgående):
+
+
Vi hade också blivit glada över att det finns gott om utrymme att ta av hela vägen. Av någon anledning är det dubbelriktade cykelvägar på bägge sidor av bron, liksom förövrigt dito gångvägar. Som dubbelriktade är de smala, men som enkelriktade blir de plötsligt helt rimliga. Det är alltså rätt lätt att snabbt göra det mycket rymligare.
+
När vi alltså ändå skulle bygga ett helt nytt bostadsområde längs Hammarby Allé, hade vi passat på att göra justeringar ända ifrån Bohusgatan. Så här:
+
+
Vi hade alltså lagt en ny cykelväg på ”rätt” sida av vägen och byggt om korsningen, förmodligen med cykelöverfarter. Kom ihåg att det här är en väg viktig främst för cykeltrafiken och buss 74 – som här inte påverkas alls, eller positivt eftersom den här korsningen blir tydligare.
+
Det gör att cykeltrafiken nu påbörjar överfarten av Skansbron på ”rätt” sida, vilket gör det lättare när vi sedan kommer bort till cirkulationsplatserna. Dessutom skulle det betyda att cyklisterna slipper sånt här meck:
+
+Med ”vår” väg cyklar man bara rakt fram, iakttar väjningsplikten vid övergångsstället och fortsätter sedan rakt fram. Så här ser det ut från andra hållet:
+
+
Nu behövs alltså egentligen ingenting göras förrän man kommer till cirkulationsplatsen på andra sidan bron – möjligtvis kan man passa på att göra cykelöverfarter förbi de två utfarterna, den ena till Eriksdalsbadets parkering, den andra ner till varvet. Cykelvägarna finns där redan.
+
Väl framme vid cirkulationsplatsen hade vi gjort cykelvägen till en mer integrerad del, helst efter nederländsk modell. Cyklister fortsätter alltså in i cirkulationsplatsen på egen väg med samma väjningsplikter som övrig trafik (ursäkta för suddig bild, den är tagen genom ett fönster):
+
+
och:
+
+
Här kan cyklister som kommer från Hammarbyhöjden, ner för backen in, invända att de plötsligt måste byta sida. Men det skulle vi fixa när nu Hammarbybacken också den ska få nya bostäder. Vi hade alltså gjort samma lösning längs den och då kommer cyklister in rätt. Röda kryss är de nya husen, grön linje den cykelväg vi skulle bygga:
+
+
Som en parentes ska det bli intressant hur kommunen väljer att göra här. Om de behåller den nuvarande dubbelriktade cykelvägen, eller gör som vi tänker ovan. Någon som sett ritningarna på ”nya” Hammarbybacken-vägen?
+
Därefter ner mot sjöstan, igen nu på ”rätt sida”:
+
+
Nere i cirkulationsplatsen under tvärbanebron gör vi på samma sätt, leder cykeltrafiken runt in i cykelfälten på Hammarby Allé. Samma enkla lösning som för biltrafiken.
+
I andra riktningen behövs inte så mycket göras alls, annat än utanför bussgaragen. Där hade vi rätat upp den nu enkelriktade cykelvägen och anslutit den direkt till cykelfälten. Först bort med svängen mot tvärgatan:
+
+
Istället anpassar vi den lägre prioriterade tvärgatan till den nu raka cykelvägen. Samtidigt hamnar cykelvägen inne i cirkulationsplatsen, så att cyklisterna får samma enkla lösning som biltrafiken. Och cykeltrafiken hamnar längre från bussgaraget, vilket gör det säkrare och lättare också för dem.
+
+
Så skulle vi gjort om vi hade planerat. Nu är det ju redan färdigbyggt, men tittar man på det är den ändå i princip bara tre ställen som behöver ändras, korsningen vid Bohusgatan och de två cirkulationsplatserna. Samtidigt så löser man breddfrågan, gör det lättare och tydligare att cykla, tar bort allt zigzaggande och ger dessutom mindre trängsel för fotgängarna när cykeltrafiken plötsligt inte längre är dubbelriktad. Samtidigt funkar det plötsligt med sjöstans cykelfält, utan en massa extra korsande av vägarna.
+
Hela den nya sträckan ner mot sjöstan,
+
Och, man följer kommunens framkomlighetspolicy, genom att prioritera cyklister och fotgängare framför bilar på en väg som framförallt är kritisk för just cyklister och fotgängare. Och buss 74, som i det här fallet inte påverkas alls.
+
Så hade vi gjort. Så tycker vi det borde ha gjorts i en stad som säger sig prioritera cyklister framför bilar och som säger sig värna om framkomligheten.
+
Men av någon anledning så görs det inte så. Vi undrar varför.
+
Här är första och andra delen av inläggen om Hammarby Allé:
+
+]]>
+ http://www.cyklistbloggen.se/2017/04/sa-har-skulle-vi-gjort-skanstull-hammarby-alle/feed/
+ 15
+
+
+ Framkomlighet – inte på topplistan över prio för nya cykelvägar
+ http://www.cyklistbloggen.se/2017/04/framkomlighet-inte-pa-topplistan-over-prio-for-nya-cykelvagar/
+ http://www.cyklistbloggen.se/2017/04/framkomlighet-inte-pa-topplistan-over-prio-for-nya-cykelvagar/#comments
+ Thu, 20 Apr 2017 04:00:18 +0000
+
+
+
+
+
+ http://www.cyklistbloggen.se/?p=26062
+ Läs vidare →]]>
+
+
I förra inlägget tittade vi på hur kommunen utformat den nya cykelvägen för dem av de 35000 sjöstadsborna som cyklar in till stan ur ett trafiksäkerhetsperspektiv. Nu tänkte vi istället titta lite på framkomligheten – alltså hur lätt eller svårt det är att cykla här överhuvudtaget. Framkomlighet tror vi är en av de viktigaste faktorerna för att få folk att vardagscykla. Känns det lätt och säkert att cykla så kommer folk göra det. Känns det osäkert och otydligt så låter man bli.
+
Vi konstaterade ju, precis som kommunen, att stadsdelen växer. Vi tänker också att helt nyanlagda cykelvägar visar lite hur kommunen tänker och prioriterar överlag för cyklister.
+
Växer alltså.
+
Framkomlighet alltså
+
I Cykelplanen från 2012 är sträckan ”bara” huvudstråk, vilket är lite sämre än om det vore ett pendlingsstråk. Och det märks att den här vägen inte är något som har fått särskilt hög prioritet när området gjordes om. Vi tar det från början uppe på Skansbron. Här dök i höstas plötsligt ett mittlinje upp i den befintliga dubbelriktade cykelvägen:
+
Wut? Toksmalt.
+
Och det stod ju rätt omedelbart klart att det inte är tillräckligt för en växande stadsdel. Faktum är att det som smalast är bara 40 centimeter brett till kanten (min sko som skala):
+
+Det går ju inte att få plats här. Det handlar alltså om en passage runt cirkulationsplatsen med både dubbelriktade gång- och cykelvägar. I en skymd kurva dessutom. Enligt cykelplanen ska en dubbelriktad cykelbana på huvudstråk vara minst 2,5 meter bred, vilket betyder att varje körfält ska vara minst 1,25 meter brett. Det är det inte här. Det är i snitt sextiofem-sjuttio centimeter brett.
+
Och skymd kurva
+
Det är inte så att man omedelbart tänker ”Huvudväg för en medelstor kommun” när man tittar på bilden ovan. Ännu mindre för ”medelstor kommun med stark miljöprofil”, som ju Hammarby Sjöstad är.
+
Sedan lyckades man glömma bort att affärer tar emot varor. För det behövs en lastplats och eftersom det saknas uppe vid cirkulationsplatsen så har det plötsligt improviserats hop en:
+
+
Rullar man sedan ner mot SL:s bussgarage så fungerar det helt okej, bortsett från de där stolparna vi skrev om i förra inlägget.
+
Minskar känslan av framkomlighet en del
+
Men körfälten är i princip uppåt 1,20 hela vägen, vilket är nästan 1,25, men inte riktigt. 1,25 är alltså minimåttet för ett körfält på ett dubbelriktad huvudstråk (1,25×2):
+
+
+
+
Nästan 1,25
+
Sedan kommer vi ner till cirkulationsplatsen. Där kör man som bilist in, med väjningsplikt, svänger runt och fortsätter på Hammarby Allé. Enkelt och extremt framkomligt.
+
Jättenkelt. Väjningsplikt och sedan bara ut ur rondellen.
+
Fullt så okomplicerat är det inte som cyklist.
+
Först ska man svänga in framför en tvärgata. Vi har redan skrivit om säkerhetsaspekten av den här passagen, så nu tittar vi bara på framkomlighet. Såvitt vi kan bedöma finns i princip allt på plats för att det här ska vara en cykelöverfart, det vill säga med väjningsplikt för korsande trafik. Det är upphöjt med fartgupp. Det råder 30km/h. Det är målat i gatan. Det enda som saknas är en Cykelöverfartsskylt.
+
Men, istället har kommunen valt att låta det vara en cykelpassage och dessutom lagt väjningspliktslinjen efter passagen (röd pil):
+
+
Cyklister har alltså väjningsplikt. En cykelöverfart hade såklart gjort det mer framkomligt för cyklister. Men mindre för trafik från tvärgatan.
+
Vad säger framkomlighetsstrategin?
+
Vi stannar och funderar lite på vad det här betyder. Det här är en plats där ett huvudcykelstråk korsar en liten tvärgata. Det är en av bara två huvudsakliga cykelvägar för snart 35000 sjöstadsbor in till city. Det är en rätt viktig väg i en växande stadsdel med tydligt miljöfokus. Så här ser det ut i Stockholms Stads ”Framkomlighetsstrategi”:
+
+
Gång/Cykel ska alltså prioriteras långt över ”bil”. I teorin. I praktiken är dock alltså framkomligheten från minsta tvärgata viktigare än för cyklister på ett huvudstråk.
+
Fortsätter man sedan vidare blir lite zig-zagande. Efter tvärgatan ska man först passera två utfarter för buss (något bussförarna är oroliga för), det vill säga först svänga vänster, över cykelpassagen, sedan höger…
+
Se upp för mötande cykeltrafik, banan är alltså dubbelriktad. Se upp för fotgängare. Se upp för bussar. Därefter ska man svänga 45 grader höger, lämna företräde vid ytterligare en cykelpassage (till höger i bild):
+
+
Cykla under bron, lämna företräde igen för ytterligare en cykelpassage och därefter svänga 90 grader in i cykelfältet:
+
+
Nu blev det mycket stillbilder. Vi klippte därför ihop en jämförelse från Skansbron ner i sjöstan. Den väg som är ett huvudstråk för cyklister. Så här skiljer det sig åt om man tar vanliga vägen, i jämförelse med om man tar den sprillans nya cykelvägen:
+
+
Jämför bredden, underlaget, avståndet till sidhinder, behovet av att läsa av konfliktpunkter, alltså platser där man möter andra trafikanter, överskådlighet och begriplighet.
+
Notera att det här inte är en viktig väg för biltrafiken. De har redan Skanstullsbron, Johanneshovsbron, Danvikstullsbron och för all del Söderleden. De enda den här vägen är viktig för är buss 74 och för cyklister och fotgängare.
+
Samma sak i Hjorthagen
+
Vi skrev i gårdagens inlägg att det här visserligen är en väg till och från Hammarby Sjöstad, men att den ändå kan vara intressant för andra – eftersom den visar hur kommunen tänker och planerar när de gör nya cykelvägar 2017l.
+
Jämför videon ovan, med den här från andra sidan stan – Hjorthagen (och vi ökade hastigheten på cykelsträckan med 400% för att det skulle bli rimligt kort):
+
+Det är samma lika där, först gjorde man infrastruktur för bil och sedan målade man dit cykelvägen. Samma sak i sjöstan, först ritade man det som i praktiken är bilvägen, därefter hus och parkeringar, bussgarage och sist av allt cykelvägen. Som konsekvens går den kors och tvärs över vägen, zigzaggar och är betydligt svårare att begripa. Och stolparna får inte plats, utan hamnar någon centimeter från trafiken. Med usel framkomlighet som följd.
+
Och i och med att kommunen i sjöstan valt att använda två olika sätt att bygga cykelvägar – det enda cykelfält, det andra som dubbelriktade cykelbanor, så måste de också hitta ett sätt att ansluta dem. Och då blir det ytterligare korsningar. Samma sak förövrigt som på den andra av vägarna in till stan – Danvikstull och Kanalvägen:
+
Också ett jäkla meck.
+
Det här är ju inte byggt med framkomlighet på priolistan överhuvudtaget. Åtminstone inte för cyklisterna. I ett tredje och sista inlägg funderar vi över hur vi skulle gjort – om vi fick bestämma.
+
+]]>
+ http://www.cyklistbloggen.se/2017/04/framkomlighet-inte-pa-topplistan-over-prio-for-nya-cykelvagar/feed/
+ 5
+
+
+ När kommunen bygger nya vägar på gammalt sätt
+ http://www.cyklistbloggen.se/2017/04/nar-kommunen-bygger-nya-vagar-pa-gammalt-satt/
+ http://www.cyklistbloggen.se/2017/04/nar-kommunen-bygger-nya-vagar-pa-gammalt-satt/#comments
+ Wed, 19 Apr 2017 11:18:10 +0000
+
+
+
+
+
+ http://www.cyklistbloggen.se/?p=26036
+ Läs vidare →]]>
+
+
+
Under våren 2017 öppnades äntligen nya cykelvägen från Skanstull ner till Hammarby Sjöstad för cykeltrafik. Det kan låta som en affär för de närmast sörjande, men för att sätta det i perspektiv är stadsdelen fullt utbyggd hem för 35000 personer. Det är som en hyggligt stor kommun, som jämförelse är det fler än i till exempel Vaxholm (11 621), Danderyd (32 653) eller Vallentuna (32 785).
+
Blir större och större
+
Det här är dessutom den ena av bara två huvudsakliga vägar in till Stockholm – den andra är den via Kanalvägen/Danvikstull. Kanalvägen har vi skrivit om tidigare här.
Det är såklart också intressant att se hur nyutformade cykelvägar ser ut – senaste sju-åtta åren har cykling lyfts som en framtidsfråga för kommunen av två politiskt olika styren, dåvarande Alliansen och nuvarande S/MP/FI-styret. Sedan 2012 finns en cykelplan och där är sträckan visserligen av någon anledning inte utpekad för pendlingsstandard, men väl som huvudstråk.
+
Som det ser ut här kan man alltså förmoda att det kommer se ut på andra platser där nya cykelvägar anläggs.
+
Sprillans ny cykelväg
+
Vi börjar med det positiva.
+
Det positiva
+
Den nybyggda sträckan är i grunden helt okej. Visserligen dubbelriktad, men hyggligt bred.
+
De har valt att lägga cykelvägen innanför bilparkeringarna. Miljöstadsdelen Hammarby Sjöstad är ju annars känd för att ha cykelfält utanför parkeringarna, vilket leder till att de nästan alltid används som ”skabara”-parkering för folk som ska in och hämta pizza, springa in till Konsum eller bara promenera en sväng.
+
Skullebara in på Lidl.
+
Det leder också på vintrarna till att cykelvägarna försvinner helt.
+
+
Genom att lägga dem innanför minskar risken för ”skabara”-parkeringar och snöröjningen kan skötas. Grymt bra och ett rejält lyft i jämförelse med resten av stadsdelen.
+
Cyklar man norrgående – från stadsdelen in mot stan, så har separationen mot fotgängarna ökat och vägen ansluter till cykelfält-systemet utan problem. Det är i huvudsak betydligt mer plats. Så här ser det ut i jämförelse med innan ombyggnaden:
+
+
Jag upplever också att avstånden till portarna känns rimlig och gångvägen är väl tilltagen så att folk inte kliver rätt ut i cykelvägen. Det verkar också som att större delen av svängen uppfyller cykelplanens breddmått för huvudstråk.
+
Här har man kanske lärt sig efter byggandet av Hägerstensvägen.
+
Och det var det positiva.
+
Nu till de mer knepiga grejorna. För att inte göra det hela till ett större inlägg än det måste, delar vi in det i två delar, trafiksäkerhet och framkomlighet. Säkerheten först:
+
Trafiksäkerhet
+
Först det uppenbara. Av någon anledning valde kommunen att placera trafikstolpar bara någon centimeter från vägbanan:
+
Stolpe nära, nära
+
Just nu är de helt ouppmärkta, men jag utgår från att de åtminstone utrustas med reflexer framöver. Det syns inte på bilden, men cykelvägen ligger i en hyggligt brant nerförsbacke så farten kan blir rätt hög. Ännu otäckare just nu eftersom hela sträckan har tjockt med grus på sig. De två värsta stolparna är svåra att upptäcka ens i dagsljus. Så här kan det kännas:
+
+
Hur det känns en mörk höstkväll med regn och motljus från mötande biltrafik kan man väl gissa. Och med fotgängare och mötande cyklister – särskilt nu när tvärbanan är avstängd och många väljer att gå och cykla till Skanstull – alltså precis den här vägen.
+
Vi frågade kommunen om det verkligen skulle se ut så här, och ja, det ska det:
+
”Tack för din synpunkt!
+Har med gatuingenjören xx tittat på den bild som du inkommit med och han svarade att det är så det ska se ut enligt dom riktlinjer som Trafikkontoret följer.
+Med vänlig hälsning””
+
Vilket känns lite märkligt. När jag tittar i kommunens handbok ”Cykel i staden 2009” (PDF) så står det att avståndet ska vara minst 0,4 meter:
+
+
Men det är väl rekommendationer gissar jag. Det vill säga till skillnad från när det gäller andra vägar finns inga tvingande regler. Stolparna kan stå hur nära som helst.
+
Det är också fullständigt värdelöst för ett huvudstråk till och från city för en stadsdel med över 30,000 innevånare.
+
Vi fortsätter ner för backen. Och för att göra det lite tydligare än bara med stillbilder, så ser hela svängen ner mot sjöstan ut så här:
+
+
Där motortrafiken på ”vanliga vägen” leds in i en cirkulationsplats, med egentligen bara en, tydlig, väjningsplikt, så leds cyklisterna in framför utfarten till SL:s nya bussgarage.
+
Här finns först en tvärgata, därefter in- och utfart till bussgaraget och därefter en ramp. Det är både dubbelriktad cykeltrafik och dubbelriktad gångtrafik. Nu blir det knepigt. Cykelvägen har anpassats efter tvärgatan istället för tvärtom, vilket gör att den rätas upp i en sväng istället för att fortsätta rakt fram. Jag gissar att anledningen är att man ville få till en 90-gradig vinkel mot tvärgatan. Det ser ut så här:
+
+
+
Här är man alltså i slutet av en lång backe. Man har ett övergångsställe rakt fram, ett till höger och man ska korsa vägen efter en sväng 45 grader åt vänster. Vi lämnar framkomligheten åt sidan ett tag och koncentrerar oss på hur mycket som händer på en gång. Framförallt är sikten in till tvärgatan helt skymd av huset. Här förväntas man som cyklist titta snett bakåt efter anslutande trafik 135 grader åt vänster. Så här ser det ut från sidan:
+
+
+
Ni ser cyklisten till vänster i bild – han har ingen chans att se om det kommer någon bil nerifrån tvärgatan, förrän sista metern när huset är ur vägen. Och eftersom väjningspliktslinjen ligger efter cykelpassagen, så blir det till att stanna för cyklister:
+
+
Vi återkommer till det här senare, men det här är alltså en plats där cyklister bör stanna för säkerhets skull. Samma sak gäller som av en händelse även åt andra hållet.
+
När man kommer från cykelfältet och svänger upp på plattan framför bussgaragen så har man även där en 135 graders koll att göra över axeln. Så här ser det ut:
+
+
Ni ser precis där personen i rock går. Upp till höger är det en utfart som överhuvudtaget inte går att se – eftersom den ligger *inuti* byggnaden. Så här ser det ut från andra hållet:
+
+
Jag har såklart ingen aning om den där tunnelvägen kommer användas ofta eller sällan, men det vet man ju inte heller när man kommer cyklandes. Här är ingen väjningspliktslinje utmålad alls, så det är oklart hur det är tänkt att utfartstrafiken ska bete sig. Så ska man cykla säkert gäller i princip att stanna även här.
+
Sedan en sista fundering. Det här övergångsstället:
+
+
+
Här leder man alltså in en dubbelriktad cykelväg rakt in i ett övergångsställe. Vi utgår från att det bara är felritat. Annars är det såklart vansinnigt.
+
Det här är alltså en av huvudsakligen två vägar in till stan för de av 35000 boende i miljöstadsdelen Hammarby Sjöstad som väljer att cykla. Och sammanfattningsvis känns det som att man använt samma sätt att bygga här, som man alltid gjort – det vill säga rita in cykelvägen när allt annat är färdigt och anpassa den efter det.
+
Det var det om säkerheten. I nästa inlägg tittar vi istället närmare på hur det här huvudstråket ser ut när det gäller framkomlighet.
SOMMARN KOMMER! OCH DET HÄR KAN VARA TIDIGASTE SOMMARINLÄGGET VI GJORT!
+
Vi har nog aldrig sett så många cyklister ute på vägarna så tidigt. I eftermiddags var det kö runt spårviddshindren i Gamla Stan.
+
Idel ryggar
+
Det här gillar vi. Men med många cyklister ställs lite högre krav än när man hojjar i småklungor i januari. Det krävs samspel när tusentals cyklister ska fram i en infrastruktur som byggdes för kanske maximalt tio ensamma entusiaster. Och här är därför Cyklistbloggens surt erövrade tips för hur man bäst klarar av att ta sig fram hänsynsfullt och vänligt i cykeltrafiken!
+
+Vi har i några års tid publicerat varianter på denna lista som lite kontrast till pekpinnar, hot om böter och annat ovett som media och ordningsmakten ganska frekvent riktar mot cyklister.
+
Med följande råd vill vi underlätta så mycket som möjligt för alla cykelpendlare att ta sig fram. Då kör vi:
+
+
Håll till höger. Vill någon stressa förbi dig till vänster, låt dem göra det.
+
+
+
Stanna för fotgängare vid övergångsställen. När tjugo cyklister kör i klunga och ingen av dem stannar vid övergångsstället kan man undra. Don’t be that person. Stanna vid övergångsställen, visa hänsyn. Och ser du att någon framför dig stannat och lämnat företräde, kör inte om! Inte nog med att det är förbjudet, det är också farligt.
+
+
+
Tänk på var du kör om. När du kör om långsammare cyklister, tänk på att inte göra det vid fel tillfälle. Fel tillfälle är innan backkrön, innan eller på övergångsställen, eller där det råder väjningsplikt och där det är för smalt. Och kommer du i god fart vid ett trafikljus som precis slår om till grönt – tänk på att de som stått och väntat kommer vingla till i starten. Utgå från att stadens cykelbanor och -fält alltid är för smala för att köra om utan att plinga. Och glöm inte kasta en blick över axeln – det kan mycket väl komma en annan omkörande cyklist.
+
+
+
Stanna vid rött ljus. Det är bara irriterande med folk som tråcklar sig förbi ett rött ljus. Om du ändå har så bråttom att du absolut måste köra mot rött ljus, fortsätt då ha bråttom även när du passerat trafikljuset. De som väntat på grönt kommer annars med utvilade ben att hinna i fatt dig på några sekunder och bli irriterade över att tvingas köra om. Eftersom Stockholms cyklister (förutom på Götgatan) i praktiken har ”röd våg” och måste stanna vid precis varenda trafikljus så kan det bli en del omkörningar. Det blir heller inte lagligare för att du rullar jäättelångsamt förbi rödljuset.
+
+
+
Tänk på att göra tecken. Tecken när man ska svänga och stanna gör att både bilister och cyklister ser vart du ska. En bra grej.
+
+
+
Plinga! Är du osäker på om någon sett dig, flyttar sig inte den framför när du vill om, traskar någon i cykelbanan? Använd ringklockan! Gör det gärna en bit i förväg, så du får tid att planera hur du ska ta dig runt den förskräckta reaktion som inte är ovanlig när man plingar.
+
+
+
Utgå från att de som planerade cykelfälten inte visste vad de skulle användas till. Det här är en viktig regel. Cykelvägarna ligger där de ligger för att det fanns yta över, inte för att det är bästa platsen för cyklar att befinna sig på. Räkna med att du kommer behöva improvisera ibland, till exempel genom att inte cykla upp till höger om en lastbil. Eller genom att lämna cykelfältet för att undvika en taxikö, ett vägarbete, en container, eller som vid Nybroplan, ett stort träd.
+
+
+
Lastbilar och högersväng = död. Utgå från att lastbilschaufförer aldrig ser dig. Undvik att stå till höger om lastbilar vid rödljus, även om det finns ett cykelfält där.
+
+
+
Laxa inte. Håll koll på de enkelriktade cykelbanorna, som t. ex. på Skanstullsbron Låt bli att cykla mot strömmen som en parningssugen lax. Du riskerar en frontalkrock med andra cyklistkollegor i värsta fall, och i bästa fall arga tillrop. Låt bli.
+
+
+
Kliv av = lämna. Om du kliver av och leder cykeln är du inte längre cyklist utan fotgängare. Traska in på gångbanan för allas bästa.
+
+
+
Var försiktig med att cykla i par. Cykelfälten är sällan breda nog för det, tyvärr. Ifall du vill cykla bredvid, håll bra koll bakåt efter snabbare cyklister som vill om – och framåt efter fotgängare. Eller containrar, taxibilar, frontlastare eller annat som också ofta befinner sig i fältet.
+
Håll avstånden! I biltrafiken brukar man prata om tresekunders-regeln. Du ska helt enkelt ha tre sekunder till trafikanten framför dig. Samma gäller i cykeltrafiken – du vet aldrig när cyklisten framför dig måste tvärnita för plötsligt uppdykande big-bag, stolpe, träd, hus eller annat som har en förmåga att hamna mitt i vägen.
+
+
+
Utbilda dig! Trafikreglerna för cyklister är inte utformade för cyklister så de kan vara knepigt att förstå vad som gäller. Vi har gjort vårt bästa för att reda ut begreppen och samlat allt under taggen Trafikskola. De vanligaste frågorna brukar gälla väjningsplikt, så de finns i en stor megapost.
+
+
+
Le och vinka. Du kommer att råka ut för medtrafikanter som bryter mot alla dessa råd, men försök att inte bli arg. Lyft blicken se till att du är del av en stor trafikapparat. Ta det lugnt, var tydlig, lämna företräde med ett leende och du ska se att folk är hyggliga tillbaka.
+
+
Välkommen till en friskare vardag och ett roligare sätt att ta dig till jobbet. Sprid gärna dessa tips till andra som du vet cyklar, så ses vi ute på stan! (och har ni fler tips? Lämna i kommentarsfältet nedan!)
+]]>
+ http://www.cyklistbloggen.se/2017/04/nu-ar-det-sommarcyklister-igen-woohoo/feed/
+ 4
+
+
+ En stolpe placerad enligt konstens alla regler
+ http://www.cyklistbloggen.se/2017/04/en-stolpe-placerad-enligt-konstens-alla-regler/
+ http://www.cyklistbloggen.se/2017/04/en-stolpe-placerad-enligt-konstens-alla-regler/#comments
+ Mon, 10 Apr 2017 18:26:45 +0000
+
+
+
+
+
+ http://www.cyklistbloggen.se/?p=26016
+ Läs vidare →]]>
+
+
Den här stolpen är helt ny. Cykelvägen blev precis klar, den öppnade härom veckan.
+
+Såg ni den?
+
Så här ser den ut i stillbild:
+
+Formellt sett är det 50 km/h här, fram till 30-skylten. Den är knapp urskiljbar i dagsljus när jag passerade i lågtrafik. Fundera över hur lätt den är att uppfatta i nerförsbacke i ett annat trafikläge, med mötande cykeltrafik och fullt med fotgängare.
”Har med gatuingenjören Mikael tittat på den bild som du inkommit med och han svarade att det är så det ska se ut enligt dom riktlinjer som Trafikkontoret följer.”
I de genomförda studierna framkommer med all tydlighet vilket stort ansvar väghållaren har för cyklisternas säkerhet. Nästan hälften av alla singelolyckor med svår skada som följd, kan relateras till vägutformning eller drift och underhåll. Det behöver skapas en mer förlåtande trafikmiljö där cyklister tillåts begå misstag (i nollvisionens anda).
+
(Och som en liten extragrej, noterar ni kanske den rätt stora mängden grus på vägen. I nerförsbacke. Det står en del om det i VTI:s rapport också, för den som vill fördjupa sig)
+
Det här är bara en stolpe på en väg i Stockholm. Det finns flera. Och alla följer samma tillåtande riktlinjer. Till exempel den andra stolpe som står en bit upp i samma backe:
+
+
Glöm inte hjälmen.
+
+]]>
+ http://www.cyklistbloggen.se/2017/04/en-stolpe-placerad-enligt-konstens-alla-regler/feed/
+ 11
+
+
+ Cyklist körde in i bildörr. Igen.
+ http://www.cyklistbloggen.se/2017/04/cyklist-korde-in-i-bildorr-igen/
+ http://www.cyklistbloggen.se/2017/04/cyklist-korde-in-i-bildorr-igen/#comments
+ Thu, 06 Apr 2017 08:10:19 +0000
+
+
+
+
+
+ http://www.cyklistbloggen.se/?p=26003
+ Läs vidare →]]>
+
+
”Cyklisten såg inte när personen i bilen slog upp ena dörren på Hantverkargatan i centrala Stockholm.
+Kraschen var oundviklig.”
+
Ja, det var ju klantigt att missa att en bilist öppnade sin bildörr.
+
Ett alternativt sätt att beskriva det hade varit:
+
”Bilisten öppnade sin bildörr utan att titta efter först samtidigt som en cyklist kom. Kraschen var oundviklig. Personen på cykel är förd till sjukhus med smärtor i rygg och nacke”.
+
Hur vi beskriver verkligheten med ord formar hur vi förstår den. Tittar man i lagtexten är ansvaret tydligt. Trafikförordningen, 3 kap 50 §:
+
Ett fordons dörrar eller andra anordningar får inte öppnas på sådant sätt att fara eller onödig olägenhet uppstår.
+
Vi tänker på en tidigare text vi skrivit här på bloggen:
”Jag vill bara skriva och tacka. För ca en månad sen skrev jag till er och frågade vad som gäller när man blir ”dörrad” i cykelbanan. Av polisen fick jag ett dumt svar att felet var helt mitt.”
+
Och det är vad det verkar en vanligt förekommande åsikt, att en plötsligt öppnad dörr är något man får räkna med. Men det är det alltså inte. Kanske särskilt inte med tanke på hur Stockholms cykelvägar ser ut, där dörrzoner ofta saknas.
+
Ingen dörrzon här
+
Just nu, några timmar efter att bildörren öppnades, står det på polisens hemsida:
+
Olyckan har inträffat på Hantverkargatan och enligt initiala uppgifter ligger cyklisten kvar på marken.
+
Patrullen berättar att olyckan har inträffat då bilisten öppnade bildörren och cyklisten körde in i den.
+
Cyklisten är förd till sjukhus med smärtor i rygg och nacke. Ingen är i nuläget delgiven brottsmisstanke.
+
Det står också att texten kan komma att ändras. Till exempel undrar vi lite om sista meningen. Om det fortsätter vara så att ingen brottsmisstanke finns, till vilken nytta är då Trafikförordningen?
+]]>
+ http://www.cyklistbloggen.se/2017/04/cyklist-korde-in-i-bildorr-igen/feed/
+ 17
+
+
+ Aftonbladet: Myror smartare än cyklister
+ http://www.cyklistbloggen.se/2017/03/aftonbladet-myror-smartare-an-cyklister/
+ http://www.cyklistbloggen.se/2017/03/aftonbladet-myror-smartare-an-cyklister/#comments
+ Mon, 27 Mar 2017 11:44:08 +0000
+
+
+
+
+
+
+ http://www.cyklistbloggen.se/?p=25995
+ Läs vidare →]]>
+
+
Aftonbladet ledare: ”Myror är smartare än cyklister”
+
+
Myror? Jo:
+
”I ett laboratorium på universitetet i Toulouse i Frankrike har myrforskaren Audrey Dussutour studerat varför myror aldrig krockar med varandra eller hamnar i trafikstockningar.”
+
För det stora problemet i cykeltrafiken är alla trafikstockningar och cykelkrockar som inträffar.
+
Hej Aftonbladet: Tror det är ett annat trafikantslag som avses. Men låt inte det stå i vägen för lite ryggradsmässigt cyklistgnäll.
12 月 14-17 日,2020 中国(广州)国际纪录节在广州举行。12 月 15 日,哔哩哔哩(以下简称「B 站」)公布了最新的纪录片出品计划,2021 年 B 站将上线超 30 部新片,其中包括大受好评的《但是还有书籍》第二季以及与 BBC 联合出品的历史题材纪录片《Ancients》。今年 12 月 B 站纪录片频道的观看用户数已突破 9 千万。(来源:36kr)
首只规模超万亿美元的股票基金诞生
Vanguard Group 旗下一支股票基金成为同类基金中首支资产超过 1 万亿美元的基金,这反映过去三十年来基于指数投资的兴起。公司数据显示,基金 Vanguard Total Stock Market Index Fund 截至 11 月 30 日的资产规模为 1.04 万亿美元。该基金包括共同基金和交易所交易基金。(来源:彭博社)
据外媒 macrumors 报道,根据两份新公布的专利申请显示,苹果正在考虑为 Apple Watch 增加 Touch ID 和屏下隐藏式摄像头。外媒 Patently Apple 发现了一项由美国专利和商标局授予的专利,专利名称为「具有密封按钮生物识别传感系统的电子设备」。这个专利申请解释了如何将 Touch ID 集成到 Apple Watch 的侧边按钮中,以及它可以达到什么实际目的。(来源:新浪数码)
大疆在 2020 年明显加快了自己的产品节奏,无人机更是年内一下子发布了两款,已经两年多没有更新的 Mavic Air 系列终于迎来了继任者——大疆 Mavic Air 2。因为有了 Mavic Mini 的关系,Air 系列无人机不再一味的追求迷你尺寸,摆脱束缚后 Mavic Air 2 更有了「以下犯上」的资本。
+
+
大疆 Mavic Air 2 相比前代机型在外观设计方面做出了很大的变动,不再使用圆润的机身设计和明快的色彩风格,机身变得更加有棱角,机身表面的质感处理也跟 Mavic 系列其他产品统一起来。另外,大疆 Mavic Air 2 机翼的收纳方式也由前代产品的对向折叠,改为了旋转式折叠,这样的变化让大疆 Mavic Air 2 拥有紧凑小巧的收纳尺寸的同时,又增加了打开状态下的机翼长度,提升了飞行性能和稳定性。
除了性能外,MagicBook Pro 锐龙版也有很多值得称道的地方,最大的亮点就是 16.1 英寸的高色域大屏幕以及相对紧凑的机身,如果不考虑便携性,大屏有很多好处,比如剪辑视频可以显示更长的时间轴,不用老拖来拖去,就算是单纯的文字办公,也会有更高的效率。另外,标配「一线一头」的便携适配器也是荣耀的基本操作了。
最后,我们预计双十二的价格为 4699 元,这在大屏锐龙标压本中应该是价格最低的存在。如果你没有游戏需求,还喜欢大屏幕的话,MagicBook Pro 非常推荐入手。
联想 小新 Pro 13 2020 锐龙 4999 元
+
+
优点:四边窄全面屏、16:10 屏幕比例、高分辨率、35W 超强性能释放
缺点:仅有一个 USB-A 接口,键盘手感一般
备注:支持 PD 充电,但适配器非「一线一头」
简评:小新 Pro 13 是联想小新家族里销量最好的一款产品,进入我们的推荐榜单中自然是毫无疑问的。
小新 Pro 13 最突出的一点就是屏幕,在这块屏幕上,高色域只是基础,难得的是它拥有和苹果 MacBook Pro 13 一样的 2.5K 高分辨率,观感比 1080P 细腻很多,另外在性能方面也十分强悍,虽然它机身小,但散热规格非常强,所以性能释放自然也很出色。除此之外,小机身也带来了不错的便携性,很适合每天上下班带电脑通勤的人。
当然了,小新 Pro 13 也有不足的地方,有很多用户吐槽键盘手感一般,另外就是仅有一个 USB 接口,不方便接驳外设,比如外接显示器的话可能得买个扩展坞了。
AquaFarms Africa 的解决办法就是让本地养殖、种植系统成为可能,让城市年轻人在都市参与到农业中。Jayna 介绍,他们研发出的 APP 可以为用户提供一种简化的方式来管理他们的水产养殖场,「并允许我们有一个仪表盘,让我们深入了解每个农场,使我们能够以更低的成本提供支持服务,并更容易地管理我们的供应链。」从而,解决粮食短缺和青年就业的问题。
+
+
Vertical Green 设计的模块化集装箱农业解决方案
+
来自西班牙的 Vertical Green 队伍的解决方案,同样令人印象深刻。Vertical Green 创始人 Carlos Repiso 介绍说,他们正在为西班牙主要的草莓产区提供基于模块化和可扩展性的新农业解决方案。「比如在草莓园区进行垂直种植,通过远程数字系统进行遥控,也可在集装箱内种植,解决了农产品丰收时期大量农产品集中运输的问题。」
Carlos Repiso 表示,这样做的一大便利是,实现了「开箱即用」。以上提及的这些数字农业方案与传统农业留给人们的印象大相径庭。可见,年轻的「外行人」们正在用科技的方式,让这个古老的行业重新变得「性感」。
]]>
+
+
+ Fri, 11 Dec 2020 12:00:04 +0800
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_golem_2.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_golem_2.xml
new file mode 100644
index 000000000..2c81ec512
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_golem_2.xml
@@ -0,0 +1,422 @@
+
+
+
+
+ Golem.de
+ IT-News fuer Profis
+ https://www.golem.de/
+
+ Mon, 17 Dec 2018 10:26:02 +0100
+ FeedCreator 1.6
+
+ https://www.golem.de/staticrl/images/golem-rss.png
+ Golem.de
+ https://www.golem.de/
+ Golem.de News Feed
+
+ de
+
+
+ Datenbank: Fehler in SQLite ermglichte Codeausfhrung
+ https://www.golem.de/news/datenbank-fehler-in-sqlite-ermoeglichte-codeausfuehrung-1812-138280-rss.html
+ Anwendungen, die SQLite einsetzen und von auen SQL-Zugriff darauf bieten, sind offenbar von einem Fehler betroffen, der eine beliebige Codeausfhrung ermglicht. Dazu gehren unter anderem Browser auf Chromium-Basis, fr die inzwischen Updates bereitstehen. (<a href="https://www.golem.de/specials/security/">Security</a>, <a href="https://www.golem.de/specials/browser/">Browser</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138280&page=1&ts=1545038700" alt="" width="1" height="1" />
+ Mon, 17 Dec 2018 10:25:00 +0100
+ https://www.golem.de/1812/138280-rss.html
+ Anwendungen, die SQLite einsetzen und von auen SQL-Zugriff darauf bieten, sind offenbar von einem Fehler betroffen, der eine beliebige Codeausfhrung ermglicht. Dazu gehren unter anderem Browser auf Chromium-Basis, fr die inzwischen Updates bereitstehen. (Security, Browser) ]]>
+
+
+
+ Windows 10: Datensammeln geht nach Deaktivieren weiter, meinen Nutzer
+ https://www.golem.de/news/windows-10-datensammeln-geht-nach-deaktivieren-weiter-meinen-nutzer-1812-138281-rss.html
+ Aktuell sind viele Nutzer darber emprt, dass Windows 10 wohl weiterhin Aktivittsdaten im Dashboard anzeigt, obwohl diese Funktion ausgeschaltet ist. Sie bieten daher Lsungen in Form von Gruppenrichtlinien an. Microsoft meint, dass es sich dabei nur um eine verwirrende Namensgebung handelt. (<a href="https://www.golem.de/specials/microsoft/">Microsoft</a>, <a href="https://www.golem.de/specials/datenschutz/">Datenschutz</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138281&page=1&ts=1545037800" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/windows-10-datensammeln-geht-nach-deaktivieren-weiter-meinen-nutzer/122728,list.html
+ Mon, 17 Dec 2018 10:10:00 +0100
+ https://www.golem.de/1812/138281-rss.html
+ Aktuell sind viele Nutzer darber emprt, dass Windows 10 wohl weiterhin Aktivittsdaten im Dashboard anzeigt, obwohl diese Funktion ausgeschaltet ist. Sie bieten daher Lsungen in Form von Gruppenrichtlinien an. Microsoft meint, dass es sich dabei nur um eine verwirrende Namensgebung handelt. (Microsoft, Datenschutz) ]]>
+ 2
+
+
+ Indiegames-Rundschau: berflieger mit Tiefe und Abenteuer im Low-Poly-Land
+ https://www.golem.de/news/indiegames-rundschau-ueberflieger-mit-tiefe-und-abenteuer-im-low-poly-land-1812-138263-rss.html
+ Below und Ashen locken mit toller Atmosphre, Insurgency Sandstorm sorgt fr Multiplayer-Spannung und Gris betrt mit besonderer Schnheit: Kurz vor Jahresende 2018 sind mehrere wunderbare Indiegames fertig geworden! Von Rainer Sigl (<a href="https://www.golem.de/specials/indiegames-rundschau/">Indiegames Rundschau</a>, <a href="https://www.golem.de/specials/spieletest/">Spieletest</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138263&page=1&ts=1545035040" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/games/indiegames-rundschau-ueberflieger-mit-tiefe-und-abenteuer-im-low-poly-land/122727,list.html
+ Mon, 17 Dec 2018 09:24:00 +0100
+ https://www.golem.de/1812/138263-rss.html
+ Below und Ashen locken mit toller Atmosphre, Insurgency Sandstorm sorgt fr Multiplayer-Spannung und Gris betrt mit besonderer Schnheit: Kurz vor Jahresende 2018 sind mehrere wunderbare Indiegames fertig geworden! Von Rainer Sigl (Indiegames Rundschau, Spieletest) ]]>
+ 4
+
+
+ Elektro-Lkw: Tesla-Truck wird an fnf Superchargern geladen
+ https://www.golem.de/news/elektro-lkw-tesla-truck-wird-an-fuenf-superchargern-geladen-1812-138278-rss.html
+ Als Tesla seine elektrischen Sattelschlepper vor mehr als einem Jahr erstmals gezeigt hat, hie es, dass spezielle Ladestationen fr diese erforderlich seien. Nun ist entdeckt worden, dass der Lkw an fnf Superchargern parallel geladen werden kann. (<a href="https://www.golem.de/specials/tesla/">Tesla</a>, <a href="https://www.golem.de/specials/technologie/">Technologie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138278&page=1&ts=1545029400" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/automobil/elektro-lkw-tesla-truck-wird-an-fuenf-superchargern-geladen/122726,list.html
+ Mon, 17 Dec 2018 07:50:00 +0100
+ https://www.golem.de/1812/138278-rss.html
+ Als Tesla seine elektrischen Sattelschlepper vor mehr als einem Jahr erstmals gezeigt hat, hie es, dass spezielle Ladestationen fr diese erforderlich seien. Nun ist entdeckt worden, dass der Lkw an fnf Superchargern parallel geladen werden kann. (Tesla, Technologie) ]]>
+ 17
+
+
+ Smart Home: AVM stellt Funktaster Fritzdect 400 vor
+ https://www.golem.de/news/smart-home-avm-stellt-funktaster-fritzdect-400-vor-1812-138276-rss.html
+ Mit dem Fritzdect 400 hat AVM ein Smart-Home-Produkt vorgestellt, das es ermglicht, die Steckdosen Fritzdect 200 und 210 per Knopfdruck, aber kabellos ein- und auszuschalten. Eine blinkende LED besttigt den Tastendruck. (<a href="https://www.golem.de/specials/smarthome/">Smart Home</a>, <a href="https://www.golem.de/specials/fritz-box/">Fritzbox</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138276&page=1&ts=1545028200" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/sonstiges/smart-home-avm-stellt-funktaster-fritzdect-400-vor/122725,list.html
+ Mon, 17 Dec 2018 07:30:00 +0100
+ https://www.golem.de/1812/138276-rss.html
+ Mit dem Fritzdect 400 hat AVM ein Smart-Home-Produkt vorgestellt, das es ermglicht, die Steckdosen Fritzdect 200 und 210 per Knopfdruck, aber kabellos ein- und auszuschalten. Eine blinkende LED besttigt den Tastendruck. (Smart Home, Fritzbox) ]]>
+ 6
+
+
+ Chinesischer Anbieter: Kleiner Elektro-SUV Nio ES6 soll 480 km weit kommen
+ https://www.golem.de/news/chinesischer-anbieter-kleiner-elektro-suv-nio-es6-soll-480-km-weit-kommen-1812-138277-rss.html
+ Der chinesische Anbieter Nio hat ein Elektroauto vorgestellt, das eine Reichweite von bis zu 480 km bei einem Preis vonumgerechnet 46.000 Euro haben soll. (<a href="https://www.golem.de/specials/elektroauto/">Elektroauto</a>, <a href="https://www.golem.de/specials/technologie/">Technologie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138277&page=1&ts=1545027600" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/automobil/chinesischer-anbieter-kleiner-elektro-suv-nio-es6-soll-480-km-weit-kommen/122724,list.html
+ Mon, 17 Dec 2018 07:20:00 +0100
+ https://www.golem.de/1812/138277-rss.html
+ Der chinesische Anbieter Nio hat ein Elektroauto vorgestellt, das eine Reichweite von bis zu 480 km bei einem Preis vonumgerechnet 46.000 Euro haben soll. (Elektroauto, Technologie) ]]>
+ 11
+
+
+ Nissan: Luxusmarke Infiniti plant Elektro-Crossover
+ https://www.golem.de/news/nissan-luxusmarke-infiniti-plant-elektro-crossover-1812-138275-rss.html
+ Die Luxusmarke Infiniti baut Verbrennerfahrzeuge, ein vollelektrisches Auto gibt es von diesem Hersteller noch nicht. Angesichts der Pionierarbeit der Muttergesellschaft Nissan ist das verwunderlich. Nun wurden erste Bilder eines Elektro-Infinitis verffentlicht. (<a href="https://www.golem.de/specials/elektroauto/">Elektroauto</a>, <a href="https://www.golem.de/specials/technologie/">Technologie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138275&page=1&ts=1544968800" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/automobil/nissan-luxusmarke-infiniti-plant-elektro-crossover/122716,list.html
+ Sun, 16 Dec 2018 15:00:00 +0100
+ https://www.golem.de/1812/138275-rss.html
+ Die Luxusmarke Infiniti baut Verbrennerfahrzeuge, ein vollelektrisches Auto gibt es von diesem Hersteller noch nicht. Angesichts der Pionierarbeit der Muttergesellschaft Nissan ist das verwunderlich. Nun wurden erste Bilder eines Elektro-Infinitis verffentlicht. (Elektroauto, Technologie) ]]>
+ 16
+
+
+ Kalifornien: Ab 2029 mssen Stadtbusse elektrisch fahren
+ https://www.golem.de/news/kalifornien-ab-2029-muessen-stadtbusse-elektrisch-fahren-1812-138274-rss.html
+ Im US-Bundesstaat Kalifornien ist eine der hrtesten Regelung des Westens im Hinblick auf Elektromobilitt verabschiedet worden. Ab 2029 muss jeder neu zugelassene Stadtbus elektrisch fahren. (<a href="https://www.golem.de/specials/elektromobilitaet/">Elektromobilitt</a>, <a href="https://www.golem.de/specials/technologie/">Technologie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138274&page=1&ts=1544961600" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/automobil/kalifornien-ab-2029-muessen-stadtbusse-elektrisch-fahren/122715,list.html
+ Sun, 16 Dec 2018 13:00:00 +0100
+ https://www.golem.de/1812/138274-rss.html
+ Im US-Bundesstaat Kalifornien ist eine der hrtesten Regelung des Westens im Hinblick auf Elektromobilitt verabschiedet worden. Ab 2029 muss jeder neu zugelassene Stadtbus elektrisch fahren. (Elektromobilitt, Technologie) ]]>
+ 32
+
+
+ Mainboard: Intels B365-Chip ist ein alter 22-nm-Bekannter
+ https://www.golem.de/news/mainboard-intels-b365-chip-ist-ein-alter-22-nm-bekannter-1812-138270-rss.html
+ Mit dem B365 hat Intel einen weiteren Chipsatz fr Sockel-LGA-1151-v2-Mainboards aufgelegt. Auch wenn der Name suggeriert, es sei der B360-Nachfolger, ist der Chip ein lteres 22-nm-Modell. So kann Intel seine 14-nm-Fabs fr CPUs entlasten, denn 10 nm lsst weiter auf sich warten. (<a href="https://www.golem.de/specials/intelcoffeelake/">Intel Coffee Lake</a>, <a href="https://www.golem.de/specials/cpu/">Prozessor</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138270&page=1&ts=1544956200" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/sonstiges/mainboard-intels-b365-chip-ist-ein-alter-22-nm-bekannter/122714,list.html
+ Sun, 16 Dec 2018 11:30:00 +0100
+ https://www.golem.de/1812/138270-rss.html
+ Mit dem B365 hat Intel einen weiteren Chipsatz fr Sockel-LGA-1151-v2-Mainboards aufgelegt. Auch wenn der Name suggeriert, es sei der B360-Nachfolger, ist der Chip ein lteres 22-nm-Modell. So kann Intel seine 14-nm-Fabs fr CPUs entlasten, denn 10 nm lsst weiter auf sich warten. (Intel Coffee Lake, Prozessor) ]]>
+ 9
+
+
+ Helio P90: Mediatek bleibt PowerVR treu
+ https://www.golem.de/news/helio-p90-mediatek-bleibt-powervr-treu-1812-138271-rss.html
+ Der Helio P90 von Mediatek ist ein neues SoC fr Mittelklasse-Smartphones. Der Chip hat eine berraschende CPU-Konfiguration und tatschlich wieder eine PowerVR-Grafikeinheit. Zudem steigt die AI-Leistung. (<a href="https://www.golem.de/specials/mediatek/">Mediatek</a>, <a href="https://www.golem.de/specials/smartphone/">Smartphone</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138271&page=1&ts=1544954400" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wissenschaft/helio-p90-mediatek-bleibt-powervr-treu/122713,list.html
+ Sun, 16 Dec 2018 11:00:00 +0100
+ https://www.golem.de/1812/138271-rss.html
+ Der Helio P90 von Mediatek ist ein neues SoC fr Mittelklasse-Smartphones. Der Chip hat eine berraschende CPU-Konfiguration und tatschlich wieder eine PowerVR-Grafikeinheit. Zudem steigt die AI-Leistung. (Mediatek, Smartphone) ]]>
+ 2
+
+
+ Adrenalin 2019 Edition: Radeon Software erhlt umfangreiche Verbesserungen
+ https://www.golem.de/news/adrenalin-2019-edition-radeon-software-erhaelt-umfangreiche-verbesserungen-1812-138273-rss.html
+ Kurz vor dem Jahreswechsel erneuert AMD die Radeon Software: Die Adrenalin 2019 Edition fr Radeon-Grafikkarten macht diese schneller, sparsamer und verbessert Overclocking sowie Streaming und fgt neue Funktionen wie eine Sprachsteuerung hinzu. (<a href="https://www.golem.de/specials/radeon-software/">Radeon Software</a>, <a href="https://www.golem.de/specials/amd/">AMD</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138273&page=1&ts=1544952600" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/applikationen/adrenalin-2019-edition-radeon-software-erhaelt-umfangreiche-verbesserungen/122712,list.html
+ Sun, 16 Dec 2018 10:30:00 +0100
+ https://www.golem.de/1812/138273-rss.html
+ Kurz vor dem Jahreswechsel erneuert AMD die Radeon Software: Die Adrenalin 2019 Edition fr Radeon-Grafikkarten macht diese schneller, sparsamer und verbessert Overclocking sowie Streaming und fgt neue Funktionen wie eine Sprachsteuerung hinzu. (Radeon Software, AMD) ]]>
+ 5
+
+
+ Command & Conquer (1995): Trash und Trendsetter
+ https://www.golem.de/news/command-conquer-1995-trash-und-trendsetter-1812-138001-rss.html
+ Grnes Gold, Kane und - jedenfalls in Deutschland - Cyborgs statt Soldaten stehen im Mittelpunkt aller Nostalgie fr Command & Conquer. Von Oliver Nickel (<a href="https://www.golem.de/specials/golemretro/">golem retro_</a>, <a href="https://www.golem.de/specials/command-conquer/">Command & Conquer</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138001&page=1&ts=1544950920" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/games/command-conquer-1995-trash-und-trendsetter/122709,list.html
+ Sun, 16 Dec 2018 10:02:00 +0100
+ https://www.golem.de/1812/138001-rss.html
+ Grnes Gold, Kane und - jedenfalls in Deutschland - Cyborgs statt Soldaten stehen im Mittelpunkt aller Nostalgie fr Command & Conquer. Von Oliver Nickel (golem retro_, Command & Conquer) ]]>
+ 32
+
+
+ NES und SNES: Keine weitere Produktion von Nintendo-Classic-Konsolen
+ https://www.golem.de/news/nes-und-snes-keine-weitere-produktion-von-nintendo-classic-konsolen-1812-138269-rss.html
+ Wer noch eine der Classic-Konsolen von Nintendo haben will, muss sich mglicherweise beeilen: Wie der USA-Chef des japanischen Herstellers angekndigt hat, soll die Produktion nicht wieder aufgenommen werden. Auch soll es keine weiteren Modelle in der Reihe geben. (<a href="https://www.golem.de/specials/nintendo-classic-mini/">Nintendo Classic Mini</a>, <a href="https://www.golem.de/specials/nintendo/">Nintendo</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138269&page=1&ts=1544943600" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/games/nes-und-snes-keine-weitere-produktion-von-nintendo-classic-konsolen/122708,list.html
+ Sun, 16 Dec 2018 08:00:00 +0100
+ https://www.golem.de/1812/138269-rss.html
+ Wer noch eine der Classic-Konsolen von Nintendo haben will, muss sich mglicherweise beeilen: Wie der USA-Chef des japanischen Herstellers angekndigt hat, soll die Produktion nicht wieder aufgenommen werden. Auch soll es keine weiteren Modelle in der Reihe geben. (Nintendo Classic Mini, Nintendo) ]]>
+ 23
+
+
+ Arrivo: Startup von Hyperloop-One-Grnder macht dicht
+ https://www.golem.de/news/arrivo-hyperloop-startup-von-hyperloop-one-gruender-macht-dicht-1812-138268-rss.html
+ Das von ehemaligen Hyperloop-One-Mitarbeitern gegrndete Startup Arrivo wird wohl keinen Hyperloop bauen: Einem Medienbericht zufolge soll das Unternehmen nicht wie erhofft neue Finanzierungsgelder aufgetrieben haben und muss daher schlieen. (<a href="https://www.golem.de/specials/hyperloop/">Hyperloop</a>, <a href="https://www.golem.de/specials/wirtschaft/">Wirtschaft</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138268&page=1&ts=1544913360" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wirtschaft/arrivo-startup-von-hyperloop-one-gruender-macht-dicht/122706,list.html
+ Sat, 15 Dec 2018 23:36:00 +0100
+ https://www.golem.de/1812/138268-rss.html
+ Das von ehemaligen Hyperloop-One-Mitarbeitern gegrndete Startup Arrivo wird wohl keinen Hyperloop bauen: Einem Medienbericht zufolge soll das Unternehmen nicht wie erhofft neue Finanzierungsgelder aufgetrieben haben und muss daher schlieen. (Hyperloop, Wirtschaft) ]]>
+ 11
+
+
+ Horst Herold: Erfinder der computergesttzten Polizeiarbeit ist tot
+ https://www.golem.de/news/horst-herold-erfinder-der-computergestuetzten-polizeiarbeit-ist-tot-1812-138267-rss.html
+ Der ehemalige Prsident des Bundeskriminalamts, Horst Herold, ist tot. Herold war BKA-Chef zu Hochzeiten des RAF-Terrors und gilt als Miterfinder der Rasterfahndung. (<a href="https://www.golem.de/specials/polizei/">Polizei</a>, <a href="https://www.golem.de/specials/internet/">Internet</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138267&page=1&ts=1544911020" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/politik-recht/horst-herold-erfinder-der-computergestuetzten-polizeiarbeit-ist-tot/122705,list.html
+ Sat, 15 Dec 2018 22:57:00 +0100
+ https://www.golem.de/1812/138267-rss.html
+ Der ehemalige Prsident des Bundeskriminalamts, Horst Herold, ist tot. Herold war BKA-Chef zu Hochzeiten des RAF-Terrors und gilt als Miterfinder der Rasterfahndung. (Polizei, Internet) ]]>
+ 15
+
+
+ Warenwirtschaft: Gummibrchen wegen Softwareproblemen in Not
+ https://www.golem.de/news/warenwirtschaft-gummibaerchen-wegen-softwareproblemen-in-not-1812-138266-rss.html
+ Die Umstellung des Warenwirtschaftssystems bei Hans Riegel Bonn hat zu Produktionsproblemen gefhrt. Haribo soll deshalb Schwierigkeiten bei der Herstellung von Goldbren, Fruchtgummi-Vampiren und anderen Sigkeiten haben. (<a href="https://www.golem.de/specials/unternehmenssoftware/">Unternehmenssoftware</a>, <a href="https://www.golem.de/specials/serverapps/">Server-Applikationen</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138266&page=1&ts=1544874540" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wirtschaft/warenwirtschaft-gummibaerchen-wegen-softwareproblemen-in-not/122704,list.html
+ Sat, 15 Dec 2018 12:49:00 +0100
+ https://www.golem.de/1812/138266-rss.html
+ Die Umstellung des Warenwirtschaftssystems bei Hans Riegel Bonn hat zu Produktionsproblemen gefhrt. Haribo soll deshalb Schwierigkeiten bei der Herstellung von Goldbren, Fruchtgummi-Vampiren und anderen Sigkeiten haben. (Unternehmenssoftware, Server-Applikationen) ]]>
+ 98
+
+
+ Wochenrckblick: Apple scheut den Kontakt und Intel stapelt hoch
+ https://www.golem.de/news/wochenrueckblick-apple-scheut-den-kontakt-und-intel-stapelt-hoch-1812-138240-rss.html
+ Apple Pay startet ohne Probleme in Deutschland, Intel enthllt neue Chiptechnik und wir programmieren mit einer Retrokonsole. (<a href="https://www.golem.de/specials/golemwochenrueckblick/">Golem-Wochenrckblick</a>, <a href="https://www.golem.de/specials/steam/">Steam</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138240&page=1&ts=1544861460" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/politik-recht/wochenrueckblick-apple-scheut-den-kontakt-und-intel-stapelt-hoch/122703,list.html
+ Sat, 15 Dec 2018 09:11:00 +0100
+ https://www.golem.de/1812/138240-rss.html
+ Apple Pay startet ohne Probleme in Deutschland, Intel enthllt neue Chiptechnik und wir programmieren mit einer Retrokonsole. (Golem-Wochenrckblick, Steam) ]]>
+
+
+
+ US-Sicherheitsbehrden: Telekom darf Sprint kaufen, wenn sie Huawei fallen lsst
+ https://www.golem.de/news/us-sicherheitsbehoerden-telekom-darf-sprint-kaufen-wenn-sie-huawei-fallen-lassen-1812-138265-rss.html
+ Die US-Regierung setzt die Deutsche Telekom unter Druck. Der Kauf von Sprint durch T-Mobile US wird genehmigt, wenn der Mutterkonzern die Zusammenarbeit mit Huawei einschrnkt. Offenbar ist die Telekom dazu bereit. (<a href="https://www.golem.de/specials/t-mobile/">T-Mobile</a>, <a href="https://www.golem.de/specials/telekom/">Telekom</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138265&page=1&ts=1544829840" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wirtschaft/us-sicherheitsbehoerden-telekom-darf-sprint-kaufen-wenn-sie-huawei-fallen-laesst/122702,list.html
+ Sat, 15 Dec 2018 00:24:00 +0100
+ https://www.golem.de/1812/138265-rss.html
+ Die US-Regierung setzt die Deutsche Telekom unter Druck. Der Kauf von Sprint durch T-Mobile US wird genehmigt, wenn der Mutterkonzern die Zusammenarbeit mit Huawei einschrnkt. Offenbar ist die Telekom dazu bereit. (T-Mobile, Telekom) ]]>
+ 78
+
+
+ Keine Beweise: BSI spricht sich gegen Huawei-Boykott aus
+ https://www.golem.de/news/keine-beweise-bsi-spricht-sich-gegen-huawei-boykott-aus-1812-138262-rss.html
+ Eine Offenlegung des Quellcodes wie durch Huawei wnscht sich BSI-Chef Schnbohm auch von anderen Herstellern. Derweil besorgt sich das BSI Huawei-Bauteile auf der ganzen Welt, um sie auf Hintertren zu untersuchen. Alles ohne Ergebnis. (<a href="https://www.golem.de/specials/huawei/">Huawei</a>, <a href="https://www.golem.de/specials/handy/">Handy</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138262&page=1&ts=1544806800" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/keine-beweise-bsi-spricht-sich-gegen-huawei-boykott-aus/122701,list.html
+ Fri, 14 Dec 2018 18:00:00 +0100
+ https://www.golem.de/1812/138262-rss.html
+ Eine Offenlegung des Quellcodes wie durch Huawei wnscht sich BSI-Chef Schnbohm auch von anderen Herstellern. Derweil besorgt sich das BSI Huawei-Bauteile auf der ganzen Welt, um sie auf Hintertren zu untersuchen. Alles ohne Ergebnis. (Huawei, Handy) ]]>
+ 34
+
+
+ Bitkom: Besetzung von IT-Jobs scheitert an Geld und Kompetenzmangel
+ https://www.golem.de/news/bitkom-besetzung-von-it-jobs-scheitert-an-geld-und-kompetenzmangel-1812-138264-rss.html
+ Drei von vier Unternehmen meinen, Bewerber fr IT-Jobs forderten zu viel Gehalt. Vier von zehn bemngeln fehlende fachliche Qualifikation. (<a href="https://www.golem.de/specials/studie/">Studie</a>, <a href="https://www.golem.de/specials/it-jobs/">IT-Jobs</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138264&page=1&ts=1544804160" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wirtschaft/bitkom-besetzung-von-it-jobs-scheitert-an-geld-und-kompetenzmangel/122700,list.html
+ Fri, 14 Dec 2018 17:16:00 +0100
+ https://www.golem.de/1812/138264-rss.html
+ Drei von vier Unternehmen meinen, Bewerber fr IT-Jobs forderten zu viel Gehalt. Vier von zehn bemngeln fehlende fachliche Qualifikation. (Studie, IT-Jobs) ]]>
+ 374
+
+
+ Wolfenstein 2: Hitler statt Heiler mglicherweise auch in Deutschland
+ https://www.golem.de/news/wolfenstein-2-hitler-statt-heiler-moeglicherweise-auch-in-deutschland-1812-138261-rss.html
+ Nach einer neuen Entscheidung ber die Indizierung von Wolfenstein 2 prft Bethesda derzeit zusammen mit der USK, ob die Originalversion auch in Deutschland erscheinen kann. Dann wrden Spieler im Handlungsverlauf auf Herrn Hitler statt auf Herrn Heiler treffen. (<a href="https://www.golem.de/specials/jugendschutz/">Jugendschutz</a>, <a href="https://www.golem.de/specials/bethesda/">Bethesda</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138261&page=1&ts=1544800200" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/games/wolfenstein-2-hitler-statt-heiler-moeglicherweise-auch-in-deutschland/122699,list.html
+ Fri, 14 Dec 2018 16:10:00 +0100
+ https://www.golem.de/1812/138261-rss.html
+ Nach einer neuen Entscheidung ber die Indizierung von Wolfenstein 2 prft Bethesda derzeit zusammen mit der USK, ob die Originalversion auch in Deutschland erscheinen kann. Dann wrden Spieler im Handlungsverlauf auf Herrn Hitler statt auf Herrn Heiler treffen. (Jugendschutz, Bethesda) ]]>
+ 21
+
+
+ Kriminalitt: Bombendrohungen per Massenmail
+ https://www.golem.de/news/kriminalitaet-bombendrohungen-per-massenmail-1812-138260-rss.html
+ In den USA, Kanada und Neuseeland empfangen Unternehmen und andere Organisationen per E-Mail versendete Bombendrohungen. Die Absender wollen damit offenbar Geld erpressen, Bomben wurden bisher aber keine gefunden. (<a href="https://www.golem.de/specials/hoax/">Hoax</a>, <a href="https://www.golem.de/specials/spam/">Spam</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138260&page=1&ts=1544798400" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/internet/kriminalitaet-bombendrohungen-per-massenmail/122698,list.html
+ Fri, 14 Dec 2018 15:40:00 +0100
+ https://www.golem.de/1812/138260-rss.html
+ In den USA, Kanada und Neuseeland empfangen Unternehmen und andere Organisationen per E-Mail versendete Bombendrohungen. Die Absender wollen damit offenbar Geld erpressen, Bomben wurden bisher aber keine gefunden. (Hoax, Spam) ]]>
+ 3
+
+
+ Kryptowhrungen: Nutzer knnen fr Razer minen und erhalten Spielgeld
+ https://www.golem.de/news/kryptowaehrungen-nutzer-koennen-fuer-razer-minen-und-erhalten-spielgeld-1812-138258-rss.html
+ Nutzer erhalten virtuelles Silber, wenn sie mit ihrer Grafikkarte fr Razer Hashwerte errechnen. Das Geld knnen sie fr Hardware oder Ingame-Inhalte ausgeben. Es ist nicht ganz klar, wie viel Gegenwert Gamer erhalten - der drfte aber nicht an die Stromkosten heranreichen, die dadurch anfallen. (<a href="https://www.golem.de/specials/razer/">Razer</a>, <a href="https://www.golem.de/specials/maus/">Maus</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138258&page=1&ts=1544793600" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/applikationen/kryptowaehrungen-nutzer-koennen-fuer-razer-minen-und-erhalten-spielgeld/122697,list.html
+ Fri, 14 Dec 2018 14:20:00 +0100
+ https://www.golem.de/1812/138258-rss.html
+ Nutzer erhalten virtuelles Silber, wenn sie mit ihrer Grafikkarte fr Razer Hashwerte errechnen. Das Geld knnen sie fr Hardware oder Ingame-Inhalte ausgeben. Es ist nicht ganz klar, wie viel Gegenwert Gamer erhalten - der drfte aber nicht an die Stromkosten heranreichen, die dadurch anfallen. (Razer, Maus) ]]>
+ 23
+
+
+ Mutant Year Zero im Test: Xcom plus postnukleare Ente
+ https://www.golem.de/news/mutant-year-zero-im-test-xcom-plus-postnukleare-ente-1812-138255-rss.html
+ Die Taktikberraschung der Saison schmeckt nach Geflgel: Das dstere, witzige und fordernde Mutant Year Zero macht vor, wie ein gutes Taktik-Rollenspiel funktioniert. Fans von Fallout und Xcom sollten zubeien. Von Jan Bojaryn (<a href="https://www.golem.de/specials/spieletest/">Spieletest</a>, <a href="https://www.golem.de/specials/rollenspiel/">Rollenspiel</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138255&page=1&ts=1544792400" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/games/mutant-year-zero-im-test-xcom-plus-postnukleare-ente/122696,list.html
+ Fri, 14 Dec 2018 14:00:00 +0100
+ https://www.golem.de/1812/138255-rss.html
+ Die Taktikberraschung der Saison schmeckt nach Geflgel: Das dstere, witzige und fordernde Mutant Year Zero macht vor, wie ein gutes Taktik-Rollenspiel funktioniert. Fans von Fallout und Xcom sollten zubeien. Von Jan Bojaryn (Spieletest, Rollenspiel) ]]>
+ 5
+
+
+ Vivo Nex Dual Screen: Vivo stellt Smartphone mit zwei Displays vor
+ https://www.golem.de/news/vivo-nex-dual-screen-vivo-stellt-smartphone-mit-zwei-displays-vor-1812-138257-rss.html
+ Nach Nubia stellt mit Vivo der zweite chinesische Hersteller binnen kurzer Zeit ein Smartphone mit zwei Displays vor: Neben dem Hauptbildschirm befindet sich ein zweiter, kleinerer auf der Rckseite. Eine Frontkamera hat das Nex Dual Screen entsprechend nicht mehr. (<a href="https://www.golem.de/specials/smartphone/">Smartphone</a>, <a href="https://www.golem.de/specials/android/">Android</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138257&page=1&ts=1544790600" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/handy/vivo-nex-dual-screen-vivo-stellt-smartphone-mit-zwei-displays-vor/122695,list.html
+ Fri, 14 Dec 2018 13:30:00 +0100
+ https://www.golem.de/1812/138257-rss.html
+ Nach Nubia stellt mit Vivo der zweite chinesische Hersteller binnen kurzer Zeit ein Smartphone mit zwei Displays vor: Neben dem Hauptbildschirm befindet sich ein zweiter, kleinerer auf der Rckseite. Eine Frontkamera hat das Nex Dual Screen entsprechend nicht mehr. (Smartphone, Android) ]]>
+ 20
+
+
+ Hochgeschwindigkeitszug: Alfa-X wird der schnellste Shinkansen
+ https://www.golem.de/news/hochgeschwindigkeitszug-alfa-x-wird-der-schnellste-shinkansen-1812-138256-rss.html
+ Erst einmal kommt die Nase, dann erst der Zug. Der neue Shinkansen wird der Zug mit der lngsten Frontpartie. Gerade wurde der erste Wagen mit einer 16 Meter langen Nase fertiggestellt. Die des hinteren wird noch lnger. (<a href="https://www.golem.de/specials/verkehr/">Verkehr</a>, <a href="https://www.golem.de/specials/technologie/">Technologie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138256&page=1&ts=1544789580" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wissenschaft/hochgeschwindigkeitszug-alfa-x-wird-der-schnellste-shinkansen/122694,list.html
+ Fri, 14 Dec 2018 13:13:00 +0100
+ https://www.golem.de/1812/138256-rss.html
+ Erst einmal kommt die Nase, dann erst der Zug. Der neue Shinkansen wird der Zug mit der lngsten Frontpartie. Gerade wurde der erste Wagen mit einer 16 Meter langen Nase fertiggestellt. Die des hinteren wird noch lnger. (Verkehr, Technologie) ]]>
+ 100
+
+
+ Smartphone-Kaufberatung: Mehr Geld fr noch etwas mehr Smartphone
+ https://www.golem.de/news/smartphone-kaufberatung-mehr-geld-fuer-noch-etwas-mehr-smartphone-1812-138230-rss.html
+ Smartphones mit einem Preis von mehr als 600 Euro sind mittlerweile nur noch schwer von gnstigeren Gerten zu unterscheiden. Wir haben dennoch ein paar interessante Gerte gefunden. Mehr als 800 Euro braucht heute aber wirklich niemand mehr fr ein Top-Android-Smartphone auszugeben. Von Tobias Kltzsch (<a href="https://www.golem.de/specials/smartphone/">Smartphone</a>, <a href="https://www.golem.de/specials/sony/">Sony</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138230&page=1&ts=1544785620" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/handy/smartphone-kaufberatung-mehr-geld-fuer-noch-etwas-mehr-smartphone/122693,list.html
+ Fri, 14 Dec 2018 12:07:00 +0100
+ https://www.golem.de/1812/138230-rss.html
+ Smartphones mit einem Preis von mehr als 600 Euro sind mittlerweile nur noch schwer von gnstigeren Gerten zu unterscheiden. Wir haben dennoch ein paar interessante Gerte gefunden. Mehr als 800 Euro braucht heute aber wirklich niemand mehr fr ein Top-Android-Smartphone auszugeben. Von Tobias Kltzsch (Smartphone, Sony) ]]>
+ 53
+
+
+ E-Mail-Scam: Save The Children verliert 1 Million US-Dollar an Betrger
+ https://www.golem.de/news/e-mail-scam-save-the-children-verliert-1-million-us-dollar-an-betrueger-1812-138254-rss.html
+ Hacker verschafften sich Zugriff auf das E-Mail-Postfach eines Angestellten der Kinderhilfsorganisation und legten dessen Kollegen mit geflschten Zahlungsanweisungen herein. Dabei sind sie nicht alleine. (<a href="https://www.golem.de/specials/security/">Security</a>, <a href="https://www.golem.de/specials/passwort/">Passwort</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138254&page=1&ts=1544783760" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/e-mail-scam-save-the-children-verliert-1-million-us-dollar-an-betrueger/122689,list.html
+ Fri, 14 Dec 2018 11:36:00 +0100
+ https://www.golem.de/1812/138254-rss.html
+ Hacker verschafften sich Zugriff auf das E-Mail-Postfach eines Angestellten der Kinderhilfsorganisation und legten dessen Kollegen mit geflschten Zahlungsanweisungen herein. Dabei sind sie nicht alleine. (Security, Passwort) ]]>
+ 14
+
+
+ Daybreak Games: Planetside Arena will Battle Royale mit Klassen und Jetpacks
+ https://www.golem.de/news/daybreak-games-planetside-arena-will-battle-royale-mit-klassen-und-jetpacks-1812-138253-rss.html
+ Der Actionklassiker Planetside bekommt mit Arena einen neuen Ableger. Das Programm fr Windows-PC setzt auf Battle Royale mit drei Klassen und weitere Modi. In einem davon bekmpfen sich zwei Teams aus jeweils 250 Teilnehmern - spter sollen sogar insgesamt 1.000 Kmpfer mitmachen knnen. (<a href="https://www.golem.de/specials/planetside/">Planetside</a>, <a href="https://www.golem.de/specials/mmorpg/">MMORPG</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138253&page=1&ts=1544780760" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/games/daybreak-games-planetside-arena-will-battle-royale-mit-klassen-und-jetpacks/122688,list.html
+ Fri, 14 Dec 2018 10:46:00 +0100
+ https://www.golem.de/1812/138253-rss.html
+ Der Actionklassiker Planetside bekommt mit Arena einen neuen Ableger. Das Programm fr Windows-PC setzt auf Battle Royale mit drei Klassen und weitere Modi. In einem davon bekmpfen sich zwei Teams aus jeweils 250 Teilnehmern - spter sollen sogar insgesamt 1.000 Kmpfer mitmachen knnen. (Planetside, MMORPG) ]]>
+ 11
+
+
+ Firmware-Update: Philips macht die Hue-Lampen praktischer
+ https://www.golem.de/news/firmware-update-philips-macht-die-hue-lampen-praktischer-1812-138252-rss.html
+ Philips hat ein Firmware-Update fr die Hue-Lampen verteilt. Damit sollen sich die Lampen die zuletzt gewhlte Farbe und Helligkeit merken. Bisher gingen die Hue-Lampen immer mit einer nicht nderbaren Standardeinstellung an, wenn sie einmal komplett vom Strom genommen wurden. (<a href="https://www.golem.de/specials/philips-hue/">Hue</a>, <a href="https://www.golem.de/specials/firmware/">Firmware</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138252&page=1&ts=1544779860" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/sonstiges/firmware-update-philips-macht-die-hue-lampen-praktischer/122687,list.html
+ Fri, 14 Dec 2018 10:31:00 +0100
+ https://www.golem.de/1812/138252-rss.html
+ Philips hat ein Firmware-Update fr die Hue-Lampen verteilt. Damit sollen sich die Lampen die zuletzt gewhlte Farbe und Helligkeit merken. Bisher gingen die Hue-Lampen immer mit einer nicht nderbaren Standardeinstellung an, wenn sie einmal komplett vom Strom genommen wurden. (Hue, Firmware) ]]>
+ 33
+
+
+ Microsoft 365: Windows-10-Abo kommt wohl auch fr private Nutzer
+ https://www.golem.de/news/microsoft-365-windows-10-abo-wird-wohl-auch-fuer-verbraucher-kommen-1812-138250-rss.html
+ Derzeit sucht Microsoft nach einem Produkt-Manager, der in einem neuen Team fr eine an Endkunden gerichtete Microsoft-365-Option arbeitet. Damit knnten Kunden in Zukunft auch privat Windows 10 und Office 365 zu einem monatlichen Preis mieten, was bisher Unternehmen vorbehalten ist. (<a href="https://www.golem.de/specials/windows10/">Windows 10</a>, <a href="https://www.golem.de/specials/microsoft/">Microsoft</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138250&page=1&ts=1544778960" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/applikationen/microsoft-365-windows-10-abo-kommt-wohl-auch-fuer-private-nutzer/122686,list.html
+ Fri, 14 Dec 2018 10:16:00 +0100
+ https://www.golem.de/1812/138250-rss.html
+ Derzeit sucht Microsoft nach einem Produkt-Manager, der in einem neuen Team fr eine an Endkunden gerichtete Microsoft-365-Option arbeitet. Damit knnten Kunden in Zukunft auch privat Windows 10 und Office 365 zu einem monatlichen Preis mieten, was bisher Unternehmen vorbehalten ist. (Windows 10, Microsoft) ]]>
+ 330
+
+
+ Virgin Galactic: Raketenflugzeug VSS Unity steigt auf ber 80 Kilometer auf
+ https://www.golem.de/news/virgin-galactic-raketenflugzeug-vss-unity-steigt-auf-ueber-80-kilometer-auf-1812-138251-rss.html
+ Virgin Galactics Raketenflugzeug VSS Unity ist erstmals ber 80 Kilometer hoch aufgestiegen. Virgin Galactic feiert das als Erreichen des Weltraums. Das kommerzielle Raumfahrtprogramm des Unternehmens soll im kommenden Jahr starten. (<a href="https://www.golem.de/specials/virgin-galactic/">Virgin Galactic</a>, <a href="https://www.golem.de/specials/raumfahrt/">Raumfahrt</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138251&page=1&ts=1544778180" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/internet/virgin-galactic-raketenflugzeug-vss-unity-steigt-auf-ueber-80-kilometer-auf/122685,list.html
+ Fri, 14 Dec 2018 10:03:00 +0100
+ https://www.golem.de/1812/138251-rss.html
+ Virgin Galactics Raketenflugzeug VSS Unity ist erstmals ber 80 Kilometer hoch aufgestiegen. Virgin Galactic feiert das als Erreichen des Weltraums. Das kommerzielle Raumfahrtprogramm des Unternehmens soll im kommenden Jahr starten. (Virgin Galactic, Raumfahrt) ]]>
+ 4
+
+
+ Gefahr fr Werbenetzwerke: Wie legal ist das Tracking von Online-Nutzern?
+ https://www.golem.de/news/gefahr-fuer-werbenetzwerke-wie-legal-ist-das-tracking-von-online-nutzern-1812-138244-rss.html
+ Drfen Websites ohne weiteres Daten von Websurfern an Werbenetzwerke weiterreichen? Die franzsische Datenschutzaufsicht CNIL weist einen franzsischen Werbenetzbetreiber in die Schranken und versetzt damit die internationale Online-Werbewirtschaft in Aufregung. Ein Bericht von Christiane Schulzki-Haddouti (<a href="https://www.golem.de/specials/tracking/">Tracking</a>, <a href="https://www.golem.de/specials/datenschutz/">Datenschutz</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138244&page=1&ts=1544776500" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/gefahr-fuer-werbenetzwerke-wie-legal-ist-das-tracking-von-online-nutzern/122683,list.html
+ Fri, 14 Dec 2018 09:35:00 +0100
+ https://www.golem.de/1812/138244-rss.html
+ Drfen Websites ohne weiteres Daten von Websurfern an Werbenetzwerke weiterreichen? Die franzsische Datenschutzaufsicht CNIL weist einen franzsischen Werbenetzbetreiber in die Schranken und versetzt damit die internationale Online-Werbewirtschaft in Aufregung. Ein Bericht von Christiane Schulzki-Haddouti (Tracking, Datenschutz) ]]>
+ 19
+
+
+ Nvidia: Shield TV bekommt Google Assistant
+ https://www.golem.de/news/nvidia-shield-tv-bekommt-google-assistant-1812-138249-rss.html
+ Nvidia verteilt ein Update fr die Android-TV-Streaming-Box Shield TV. Damit kommt der Google Assistant auf das Gert, so dass sich Shield TV umfangreicher als bisher mit der Stimme steuern lsst. Fr ausgewhlte Informationen werden Zusatzinhalte auf dem Fernseher angezeigt. (<a href="https://www.golem.de/specials/shield_tv/">Shield_TV</a>, <a href="https://www.golem.de/specials/google/">Google</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138249&page=1&ts=1544775060" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/sonstiges/nvidia-shield-tv-bekommt-google-assistant/122680,list.html
+ Fri, 14 Dec 2018 09:11:00 +0100
+ https://www.golem.de/1812/138249-rss.html
+ Nvidia verteilt ein Update fr die Android-TV-Streaming-Box Shield TV. Damit kommt der Google Assistant auf das Gert, so dass sich Shield TV umfangreicher als bisher mit der Stimme steuern lsst. Fr ausgewhlte Informationen werden Zusatzinhalte auf dem Fernseher angezeigt. (Shield_TV, Google) ]]>
+ 22
+
+
+ Kein Crowdfunding mehr: Neustart fr Meyer Optik Grlitz nach Insolvenz
+ https://www.golem.de/news/kein-crowdfunding-mehr-neustart-fuer-meyer-optik-goerlitz-nach-insolvenz-1812-138246-rss.html
+ Die Objektive von Meyer Optik Grlitz, deren Produktion ber Kickstarter finanziert werden sollte, werden nicht ausgeliefert. Die Untersttzer gehen leer aus. Doch die Marken des insolventen Unternehmens werden wiederaufgelegt. (<a href="https://www.golem.de/specials/kickstarter/">Kickstarter</a>, <a href="https://www.golem.de/specials/dslr/">DSLR</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138246&page=1&ts=1544769900" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/foto/kein-crowdfunding-mehr-neustart-fuer-meyer-optik-goerlitz-nach-insolvenz/122678,list.html
+ Fri, 14 Dec 2018 07:45:00 +0100
+ https://www.golem.de/1812/138246-rss.html
+ Die Objektive von Meyer Optik Grlitz, deren Produktion ber Kickstarter finanziert werden sollte, werden nicht ausgeliefert. Die Untersttzer gehen leer aus. Doch die Marken des insolventen Unternehmens werden wiederaufgelegt. (Kickstarter, DSLR) ]]>
+ 7
+
+
+ Monowheel Z-One One: Die Elektro-Vespa auf einem Rad
+ https://www.golem.de/news/monowheel-z-one-one-die-elektro-vespa-auf-einem-rad-1812-138248-rss.html
+ Mit dem Monowheel Z-One One hat das Unternehmen Bel & Bel ein Elektrofahrzeug vorgestellt, das einer alten Vespa hnelt und mit einem Sitz ausgerstet ist. Was fehlt, ist das zweite Rad. (<a href="https://www.golem.de/specials/elektromobilitaet/">Elektromobilitt</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138248&page=1&ts=1544769060" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/sonstiges/monowheel-z-one-one-die-elektro-vespa-auf-einem-rad/122677,list.html
+ Fri, 14 Dec 2018 07:31:00 +0100
+ https://www.golem.de/1812/138248-rss.html
+ Mit dem Monowheel Z-One One hat das Unternehmen Bel & Bel ein Elektrofahrzeug vorgestellt, das einer alten Vespa hnelt und mit einem Sitz ausgerstet ist. Was fehlt, ist das zweite Rad. (Elektromobilitt) ]]>
+ 92
+
+
+ Expansion: Apple investiert 1 Milliarde US-Dollar fr texanischen Campus
+ https://www.golem.de/news/expansion-apple-investiert-1-milliarde-us-dollar-fuer-texanischen-campus-1812-138247-rss.html
+ Apple will in den nchsten fnf Jahren 20.000 Arbeitspltze in den USA schaffen und hat angekndigt, fr eine Milliarde US-Dollar einen neuen Campus in Austin im Bundesstaat Texas zu bauen. (<a href="https://www.golem.de/specials/apple/">Apple</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138247&page=1&ts=1544768400" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/wirtschaft/expansion-apple-investiert-1-milliarde-us-dollar-fuer-texanischen-campus/122676,list.html
+ Fri, 14 Dec 2018 07:20:00 +0100
+ https://www.golem.de/1812/138247-rss.html
+ Apple will in den nchsten fnf Jahren 20.000 Arbeitspltze in den USA schaffen und hat angekndigt, fr eine Milliarde US-Dollar einen neuen Campus in Austin im Bundesstaat Texas zu bauen. (Apple) ]]>
+ 3
+
+
+ Leasing: United Internet will 5G-Netz von ZTE bauen lassen
+ https://www.golem.de/news/leasing-united-internet-will-5g-netz-von-zte-fuer-sich-bauen-lassen-1812-138245-rss.html
+ Ein viertes Mobilfunknetz in Deutschland knnte doch noch kommen. Der Chef von United Internet, Ralph Dommermuth, will ZTE aus China fr sich einspannen. ZTE hat gerade seinen wichtigsten Kunden in Deutschland verloren. (<a href="https://www.golem.de/specials/roaming/">Roaming</a>, <a href="https://www.golem.de/specials/telekom/">Telekom</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138245&page=1&ts=1544738880" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/handy/leasing-united-internet-will-5g-netz-von-zte-bauen-lassen/122675,list.html
+ Thu, 13 Dec 2018 23:08:00 +0100
+ https://www.golem.de/1812/138245-rss.html
+ Ein viertes Mobilfunknetz in Deutschland knnte doch noch kommen. Der Chef von United Internet, Ralph Dommermuth, will ZTE aus China fr sich einspannen. ZTE hat gerade seinen wichtigsten Kunden in Deutschland verloren. (Roaming, Telekom) ]]>
+ 11
+
+
+ Sega Classics angespielt: Sonic hpft und springt auf dem Fire TV
+ https://www.golem.de/news/sega-classics-angespielt-sonic-huepft-und-springt-auf-dem-fire-tv-1812-138232-rss.html
+ Keine Mini- oder Classic-Konsole, sondern mit einer App namens Sega Classics luft Sonic auf dem Fire TV Stick 4K von Amazon. Insgesamt bietet die Sammlung 25 Retrogames, die einst auf dem Mega Drive erschienen sind. Golem.de hat ausprobiert, ob das Spielen immer noch Spa macht. (<a href="https://www.golem.de/specials/sega/">Sega</a>, <a href="https://www.golem.de/specials/amazon/">Amazon</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138232&page=1&ts=1544721480" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/games/sega-classics-angespielt-sonic-huepft-und-springt-auf-dem-fire-tv/122674,list.html
+ Thu, 13 Dec 2018 18:18:00 +0100
+ https://www.golem.de/1812/138232-rss.html
+ Keine Mini- oder Classic-Konsole, sondern mit einer App namens Sega Classics luft Sonic auf dem Fire TV Stick 4K von Amazon. Insgesamt bietet die Sammlung 25 Retrogames, die einst auf dem Mega Drive erschienen sind. Golem.de hat ausprobiert, ob das Spielen immer noch Spa macht. (Sega, Amazon) ]]>
+ 5
+
+
+ Anwaltspostfach: BeA-Klage erstmal vertagt
+ https://www.golem.de/news/anwaltspostfach-bea-klage-erstmal-vertagt-1812-138241-rss.html
+ Vor dem Anwaltsgerichtshof in Berlin fand heute die erste Verhandlung zu einer Klage statt, bei der Rechtsanwlte eine Ende-zu-Ende-Verschlsselung im besonderen elektronischen Anwaltspostfach (BeA) erzwingen wollen. Das Gericht sieht aber noch viel Klrungsbedarf. (<a href="https://www.golem.de/specials/bea/">BeA</a>, <a href="https://www.golem.de/specials/verschluesselung/">Verschlsselung</a>) <img src="https://cpx.golem.de/cpx.php?class=17&aid=138241&page=1&ts=1544716680" alt="" width="1" height="1" />
+ https://forum.golem.de/kommentare/security/anwaltspostfach-bea-klage-erstmal-vertagt/122673,list.html
+ Thu, 13 Dec 2018 16:58:00 +0100
+ https://www.golem.de/1812/138241-rss.html
+ Vor dem Anwaltsgerichtshof in Berlin fand heute die erste Verhandlung zu einer Klage statt, bei der Rechtsanwlte eine Ende-zu-Ende-Verschlsselung im besonderen elektronischen Anwaltspostfach (BeA) erzwingen wollen. Das Gericht sieht aber noch viel Klrungsbedarf. (BeA, Verschlsselung) ]]>
+ 9
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_lawnchair.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_lawnchair.xml
new file mode 100644
index 000000000..a3ccbec55
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_lawnchair.xml
@@ -0,0 +1,257 @@
+
+
+
+
+ Lawnchair / @lawnchairapp
+ http://nitter.weiler.rocks/lawnchairapp
+ Twitter feed for: @lawnchairapp. Generated by nitter.weiler.rocks
+
+ en-us
+ 40
+
+ Lawnchair / @lawnchairapp
+ http://nitter.weiler.rocks/lawnchairapp
+ http://nitter.weiler.rocks/pic/pbs.twimg.com%2Fprofile_images%2F1375845300229832705%2FtNh-qHSv_400x400.jpg
+ 128
+ 128
+
+
+ Girlfriend = 🤢🤮
+ Lawnchair = 😍🤩
+ @lawnchairapp
+ Girlfriend = 🤢🤮
+Lawnchair = 😍🤩
+]]>
+ Fri, 23 Sep 2022 18:05:54 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1573373102867857410#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1573373102867857410#m
+
+
+ Lawnicons 1.1.0 has arrived! This release includes 626 icons (218 linked icons and 408 made from scratch icons) and works with Lawnchair 12 Alpha 5 and Lawnchair 12.1+. Thanks to all our contributors! (https://github.com/LawnchairLauncher/lawnicons/graphs/contributors)
+ Download it here: http://lawnchair.app/downloads
+ @lawnchairapp
+ Lawnicons 1.1.0 has arrived! This release includes 626 icons (218 linked icons and 408 made from scratch icons) and works with Lawnchair 12 Alpha 5 and Lawnchair 12.1+. Thanks to all our contributors! (github.com/LawnchairLauncher…)
+Download it here: lawnchair.app/downloads]]>
+ Thu, 22 Sep 2022 09:34:40 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1572882058971594752#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1572882058971594752#m
+
+
+ $999 but still can't run lawnchair
+ @lawnchairapp
+ $999 but still can't run lawnchair]]>
+ Thu, 08 Sep 2022 10:22:29 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1567820662734987264#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1567820662734987264#m
+
+
+ App
+ @lawnchairapp
+ App]]>
+ Fri, 02 Sep 2022 05:06:44 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1565566875127496705#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1565566875127496705#m
+
+
+ REI's popular padded lawn chair is now less than $25
+ @lawnchairapp
+ REI's popular padded lawn chair is now less than $25
+]]>
+ Wed, 31 Aug 2022 21:48:46 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1565094267848396800#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1565094267848396800#m
+
+
+ The best secret development setting: dental hygiene
+ @lawnchairapp
+ The best secret development setting: dental hygiene
+
]]>
+ Wed, 17 Aug 2022 16:30:20 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1559940703215558664#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1559940703215558664#m
+
+
+ Fun faqt, we now have a frequently asked questions section on our website! http://Lawnchair.app/faq
+ @lawnchairapp
+ Fun faqt, we now have a frequently asked questions section on our website! Lawnchair.app/faq
+]]>
+ Mon, 15 Aug 2022 09:41:56 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1559113150263328768#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1559113150263328768#m
+
+
+ R to @lawnchairapp: Made by an ai
+ @lawnchairapp
+ Made by an ai]]>
+ Fri, 12 Aug 2022 05:03:58 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1557956032533598208#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1557956032533598208#m
+
+
+ Get off my lawnchair
+ @lawnchairapp
+ Get off my lawnchair
+]]>
+ Thu, 11 Aug 2022 20:35:42 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1557828123173044227#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1557828123173044227#m
+
+
+ Who would win 😳 @NovaLauncher
+ @lawnchairapp
+ Who would win 😳 @NovaLauncher
+]]>
+ Wed, 10 Aug 2022 07:53:21 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1557273884143017984#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1557273884143017984#m
+
+
+ R to @lawnchairapp: Imagine making the same typo twice
+ @lawnchairapp
+ Imagine making the same typo twice]]>
+ Mon, 08 Aug 2022 10:07:37 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1556582896281985024#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1556582896281985024#m
+
+
+ It's update time!
+ We updated the http://lawnchair.app website, and released Lawnchair 12.1 Alpha 4. Some major changes include:
+ • Custom swipe gestures
+ • A new color picker
+ • Lock home screen
+ • New search engines
+
+ Check the full changelog here:
+ https://github.com/LawnchairLauncher/lawnchair/releases/tag/v12.1.0-alpha.4
+ @lawnchairapp
+ It's update time!
+We updated the lawnchair.app website, and released Lawnchair 12.1 Alpha 4. Some major changes include:
+• Custom swipe gestures
+• A new color picker
+• Lock home screen
+• New search engines
+
+Check the full changelog here:
+github.com/LawnchairLauncher…
+]]>
+ Mon, 08 Aug 2022 10:07:09 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1556582782687657984#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1556582782687657984#m
+
+
+ R to @lawnchairapp: https://www.androidcentral.com/apps-software/how-do-you-steal-code-from-google-and-why-should-anyone-care this is a great article by @gbhil explaining the reverse engineering situation.
+ @lawnchairapp
+ androidcentral.com/apps-soft… this is a great article by @gbhil explaining the reverse engineering situation.
+]]>
+ Sat, 06 Aug 2022 21:26:52 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1556029062312763393#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1556029062312763393#m
+
+
+ Image
+ @lawnchairapp
+
+]]>
+ Sat, 06 Aug 2022 21:26:41 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1556029013734350848#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1556029013734350848#m
+
+
+ RT by @lawnchairapp: Tessa 2.0.6.1 is out with many redesigned icons such as @lawnchairapp, notion, medium, etc and 42 new icons.
+
+ Get it here: http://bit.ly/TessaIconPack
+ @icarusap
+ Tessa 2.0.6.1 is out with many redesigned icons such as @lawnchairapp, notion, medium, etc and 42 new icons.
+
+Get it here: bit.ly/TessaIconPack
+]]>
+ Fri, 05 Aug 2022 11:26:03 GMT
+ http://nitter.weiler.rocks/icarusap/status/1555515472204136449#m
+ http://nitter.weiler.rocks/icarusap/status/1555515472204136449#m
+
+
+ RT by @lawnchairapp: New update for Tessa has been published!
+ Change log on (2) & (3)
+
+ Update/Download/Purchase: http://bit.ly/TessaIconPack
+
+ ✌️👀
+ @icarusap
+ New update for Tessa has been published!
+Change log on (2) & (3)
+
+Update/Download/Purchase: bit.ly/TessaIconPack
+
+✌️👀
+
+
+
+]]>
+ Mon, 25 Jul 2022 17:30:38 GMT
+ http://nitter.weiler.rocks/icarusap/status/1551620956497801217#m
+ http://nitter.weiler.rocks/icarusap/status/1551620956497801217#m
+
+
+ RT by @lawnchairapp: New update for Tessa has been published!
+ Change log on (2) & (3)
+
+ Update/Download/Purchase: http://bit.ly/TessaIconPack
+
+ ✌️👀
+ @icarusap
+ New update for Tessa has been published!
+Change log on (2) & (3)
+
+Update/Download/Purchase: bit.ly/TessaIconPack
+
+✌️👀
+
+
+
+]]>
+ Sat, 23 Jul 2022 17:16:37 GMT
+ http://nitter.weiler.rocks/icarusap/status/1550892652786520064#m
+ http://nitter.weiler.rocks/icarusap/status/1550892652786520064#m
+
+
+ RT by @lawnchairapp: We have never claimed copyright for these features, we have always said that they are taken from the Pixel Launcher and we have never hidden this fact from our community.
+
+ Also, reverse engineering is not a crime.
+
+ https://www.eff.org/issues/coders/reverse-engineering-faq
+ @divadsn
+ We have never claimed copyright for these features, we have always said that they are taken from the Pixel Launcher and we have never hidden this fact from our community.
+
+Also, reverse engineering is not a crime.
+
+eff.org/issues/coders/revers…
+]]>
+ Fri, 22 Jul 2022 16:27:53 GMT
+ http://nitter.weiler.rocks/divadsn/status/1550518003086675968#m
+ http://nitter.weiler.rocks/divadsn/status/1550518003086675968#m
+
+
+ RT by @lawnchairapp: So i came across this developer and this developer just copied 2 launcher apps from lawnchair he even still with the features claiming that it's his launcher can you guys please help me to report as copycat
+ @Sean56010603
+ So i came across this developer and this developer just copied 2 launcher apps from lawnchair he even still with the features claiming that it's his launcher can you guys please help me to report as copycat
+
+
+
+]]>
+ Sat, 16 Jul 2022 12:32:24 GMT
+ http://nitter.weiler.rocks/Sean56010603/status/1548284413514878976#m
+ http://nitter.weiler.rocks/Sean56010603/status/1548284413514878976#m
+
+
+ Lawnchair users assemble, this app is stealing @pashapuma1 hard work. Please report the app as mentioned in this tweet.
+ @lawnchairapp
+ Lawnchair users assemble, this app is stealing @pashapuma1 hard work. Please report the app as mentioned in this tweet.
+
]]>
+ Sat, 02 Jul 2022 20:32:46 GMT
+ http://nitter.weiler.rocks/lawnchairapp/status/1543331869579743238#m
+ http://nitter.weiler.rocks/lawnchairapp/status/1543331869579743238#m
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_lemonde.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_lemonde.xml
new file mode 100644
index 000000000..e30e9994b
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_lemonde.xml
@@ -0,0 +1,184 @@
+
+
+
+ Le Monde.fr - Actualités et Infos en France et dans le monde
+ Le Monde.fr - 1er site d'information. Les articles du journal et toute l'actualité en continu : International, France, Société, Economie, Culture, Environnement, Blogs ...
+ Copyright Le Monde.fr
+ http://www.lemonde.fr/rss/une.xml
+
+ Sun, 11 Feb 2018 14:08:08 +0100
+
+ http://www.lemonde.fr/mmpub/img/lgo/lemondefr_rss.gif
+ Le Monde.fr - Actualités et Infos en France et dans le monde
+ http://www.lemonde.fr/rss/une.xml
+
+
+ http://www.lemonde.fr/jeux-olympiques-pyeongchang-2018/live/2018/02/11/jo-d-hiver-2018-suivez-la-course-de-martin-fourcade-en-direct_5255095_5193626.html?xtor=RSS-3208
+ JO d’hiver 2018 : pas de médaille pour Martin Fourcade
+ Les grands favoris, dont Martin Fourcade, qui termine à la 8e place, et le Norvégien Boe, ont été à la peine lors de l’épreuve de sprint de biathlon.
+ Sun, 11 Feb 2018 11:00:26 +0100
+ http://www.lemonde.fr/tiny/5255095/
+
+
+
+ http://www.lemonde.fr/societe/article/2018/02/10/affaire-maelys-un-faisceau-d-indices-et-un-point-d-interrogation_5254773_3224.html?xtor=RSS-3208
+ Affaire Maëlys : un faisceau d’indices et un point d’interrogation
+ Deux témoignages d’un couple contredisent la version du déroulé de la soirée présentée par l’accusation.
+ Sat, 10 Feb 2018 10:03:47 +0100
+ http://www.lemonde.fr/tiny/5254773/
+
+
+
+ http://www.lemonde.fr/europe/article/2018/02/11/un-avion-de-ligne-russe-transportant-71-personnes-s-ecrase-pres-de-moscou_5255120_3214.html?xtor=RSS-3208
+ Un avion de ligne russe, transportant 71 personnes, s’écrase près de Moscou
+ Le biréacteur, un Antonov An-148 de la compagnie Saratov, transportait 65 passagers et 6 membres d’équipage, selon les agences russes.
+ Sun, 11 Feb 2018 14:01:17 +0100
+ http://www.lemonde.fr/tiny/5255120/
+
+
+
+ http://www.lemonde.fr/campus/article/2018/02/11/le-tres-lucratif-business-des-concours_5255084_4401467.html?xtor=RSS-3208
+ Prépa privée, frais d’inscriptions : le très lucratif business des concours
+ Si les écoles, en concurrence les unes avec les autres, doivent dépenser de fortes sommes en communication pour faire le plein d’étudiants, les prépas privées tirent profit de ce système sélectif.
+ Sun, 11 Feb 2018 10:15:27 +0100
+ http://www.lemonde.fr/tiny/5255084/
+
+
+
+ http://www.lemonde.fr/m-actu/article/2018/02/09/l-insoutenable-intensite-de-daniel-day-lewis_5254073_4497186.html?xtor=RSS-3208
+ Daniel Day-Lewis, aux extrêmes de l’incarnation
+ Pour s’approprier ses personnage, l’acteur s’épuise et pense à chaque fois raccrocher. Son rôle d’un grand couturier dans « Phantom Thread » pourrait lui valoir un quatrième Oscar.
+ Fri, 09 Feb 2018 06:36:57 +0100
+ http://www.lemonde.fr/tiny/5254073/
+
+
+
+ http://filiu.blog.lemonde.fr/2018/02/11/poutine-prisonnier-dassad-en-syrie/?xtor=RSS-3208
+ « Poutine prisonnier d’Assad en Syrie », par Jean-Pierre Filiu
+ La Russie est incapable de transformer en avancée politique ses indiscutables succès, à cause de l’intransigeance du dictateur syrien, analyse le spécialiste du Moyen-Orient.
+ Sun, 11 Feb 2018 08:39:51 +0100
+ http://www.lemonde.fr/tiny/5255073/
+
+
+
+ http://www.lemonde.fr/m-actu/article/2018/02/09/a-louveciennes-la-folle-histoire-du-chateau-louis-xiv_5254367_4497186.html?xtor=RSS-3208
+ A Louveciennes, la folle histoire de la « maison la plus chère du monde »
+ Emad Khashoggi, un promoteur mégalomane, s’est construit un jouet XXL : un chateau de style XVIIe, avec tout le confort moderne, qui a séduit le prince héritier d’Arabie saoudite .
+ Fri, 09 Feb 2018 13:53:07 +0100
+ http://www.lemonde.fr/tiny/5254367/
+
+
+
+ http://www.lemonde.fr/police-justice/article/2018/02/10/proces-fiona-trente-ans-requis-contre-la-mere-de-la-fillette-et-contre-son-ex-compagnon_5254917_1653578.html?xtor=RSS-3208
+ Procès Fiona : la mère et le beau-père condamnés en appel à vingt ans de prison
+ En première instance, en 2016, Cécile Bourgeon avait été acquittée des faits criminels et condamnée à cinq ans de prison pour avoir menti.
+ Sat, 10 Feb 2018 17:24:24 +0100
+ http://www.lemonde.fr/tiny/5254917/
+
+
+
+ http://www.lemonde.fr/proche-orient/article/2018/02/11/les-raids-israeliens-ont-porte-un-coup-severe-a-l-iran-et-la-syrie-selon-netanyahou_5255111_3218.html?xtor=RSS-3208
+ Les raids israéliens ont porté un « coup sévère » à l’Iran et la Syrie, selon Nétanyahou
+ « Nous continuerons à frapper tous ceux qui tentent de nous attaquer », a prévenu, dimanche, le chef de l’Etat hébreu dans un communiqué.
+ Sun, 11 Feb 2018 12:43:38 +0100
+ http://www.lemonde.fr/tiny/5255111/
+
+
+
+ http://www.lemonde.fr/m-actu-chroniques/article/2018/02/11/vous-prendrez-bien-une-part-de-millefeuille_5255108_4573473.html?xtor=RSS-3208
+ Panthère, chapeau violet et code de la route au déjeuner des best-sellers
+ Le 5 février, rue Scribe, à Paris, avait lieu le déjeuner des auteurs les plus lus de l’année. Guillemette Faure, la chroniqueuse de « M », y était. Sylvain Tesson s’est excusé, parti « pour observer la panthère des neiges près des sources du Mékong ».
+ Sun, 11 Feb 2018 12:15:25 +0100
+ http://www.lemonde.fr/tiny/5255108/
+
+
+
+ http://www.lemonde.fr/logement/article/2018/02/11/louis-gallois-denonce-une-volonte-politique-de-minorer-le-nombre-de-sdf_5255086_1653445.html?xtor=RSS-3208
+ Louis Gallois dénonce une « volonté politique de minorer le nombre de SDF »
+ Le président de la Fédération des acteurs de la solidarité accuse certains préfets de ne pas compter certaines catégories de sans-abri.
+ Sun, 11 Feb 2018 10:22:46 +0100
+ http://www.lemonde.fr/tiny/5255086/
+
+
+
+ http://www.lemonde.fr/questions-politiques/video/2018/02/11/suivez-en-direct-l-emission-questions-politiques-avec-gerard-collomb_5255104_4991783.html?xtor=RSS-3208
+ Suivez en direct l’émission « Questions politiques » avec Gérard Collomb
+ Le ministre de l’intérieur est l’invité de France Inter, « Le Monde » et France Télévisions.
+ Sun, 11 Feb 2018 12:00:13 +0100
+ http://www.lemonde.fr/tiny/5255104/
+
+
+
+ http://www.lemonde.fr/planete/article/2018/02/11/notre-dame-des-landes-la-zad-se-cherche-un-avenir_5255024_3244.html?xtor=RSS-3208
+ Fête à Notre-Dame-des-Landes : des milliers de personnes venues « voir ce qui se passera après »
+ Des dizaines de milliers de personnes ont convergé, samedi sur la ZAD, pour célébrer la victoire contre le projet d’aéroport.
+ Sun, 11 Feb 2018 06:34:33 +0100
+ http://www.lemonde.fr/tiny/5255024/
+
+
+
+ http://www.lemonde.fr/tournoi-des-6-nations/article/2018/02/11/tournoi-des-six-nations-la-france-a-la-relance-face-a-l-ecosse_5255081_1616892.html?xtor=RSS-3208
+ Tournoi des six nations : la France à la relance face à l’Ecosse
+ Le XV de France se déplace dimanche en Ecosse (16 heures) lors de la deuxième journée du Tournoi des six nations. Une victoire est indispensable pour les hommes de Jacques Brunel.
+ Sun, 11 Feb 2018 10:00:25 +0100
+ http://www.lemonde.fr/tiny/5255081/
+
+
+
+ http://www.lemonde.fr/climat/article/2018/02/11/neige-et-verglas-huit-departements-en-vigilance-orange_5255035_1652612.html?xtor=RSS-3208
+ Neige et verglas : huit départements en vigilance orange
+ Un risque de verglas et de précipitations neigeuses va toucher le centre et l’est de la France. La vigilance devrait être levée dimanche grâce au redoux.
+ Sun, 11 Feb 2018 06:43:09 +0100
+ http://www.lemonde.fr/tiny/5255035/
+
+
+
+ http://www.lemonde.fr/addictions/article/2018/02/10/le-desarroi-des-parents-face-a-la-consommation-excessive-de-cannabis_5254762_1655173.html?xtor=RSS-3208
+ Le désarroi des parents face à la consommation excessive de cannabis
+ Plus de 7 % des jeunes de 17 ans présenteraient un risque élevé d’usage problématique, soit environ 60 000 adolescents de cet âge.
+ Sat, 10 Feb 2018 09:54:32 +0100
+ http://www.lemonde.fr/tiny/5254762/
+
+
+
+ http://enseigner.blog.lemonde.fr/2018/02/08/bac-2018-10-conseils-pour-loral-des-tpe/?xtor=RSS-3208
+ Bac : comment préparer l’oral des TPE
+ « Les profs ne cherchent pas à couler les élèves. Au contraire, ils leur tendent des perches » : à l’intention des candidats au bac, l’enseignant Claude Garcia présente ses conseils pour l’épreuve dite de « présentation » des travaux personnels encadrés (TPE).
+ Sun, 11 Feb 2018 13:15:19 +0100
+ http://www.lemonde.fr/tiny/5255115/
+
+
+
+ http://www.lemonde.fr/police-justice/article/2018/02/11/reglements-de-compte-dans-le-quartier-de-la-reynerie-a-toulouse-quatre-mises-en-examen_5254985_1653578.html?xtor=RSS-3208
+ Règlements de compte dans le quartier de La Reynerie à Toulouse : quatre mises en examen
+ Trois suspects lyonnais devraient aussi être déférés à Toulouse. Une dizaine d’assassinats, sur fond de trafic de stupéfiants, ont eu lieu depuis 2011 dans ce quartier.
+ Sun, 11 Feb 2018 04:12:56 +0100
+ http://www.lemonde.fr/tiny/5254985/
+
+
+
+ http://www.lemonde.fr/chroniques-de-la-presidence-trump/article/2018/02/11/president-trump-an-ii-l-embardee-du-general-kelly_5255016_5077160.html?xtor=RSS-3208
+ Les « adultes » qui encadrent Trump sont aussi devenus imprévisibles
+ La gestion catastrophique par la Maison Blanche du cas d’un collaborateur accusé de violences conjugales illustre la fragilité de ceux supposés encadrer le président américain.
+ Sun, 11 Feb 2018 06:33:09 +0100
+ http://www.lemonde.fr/tiny/5255016/
+
+
+
+ http://www.lemonde.fr/politique/article/2018/02/11/macron-veut-poser-les-jalons-de-l-organisation-de-l-islam-de-france-au-premier-semestre-2018_5254980_823448.html?xtor=RSS-3208
+ Emmanuel Macron se lance dans la réforme de l’islam de France
+ Le chef de l’Etat veut « avancer touche par touche », et consulter les représentants de toutes les religions.
+ Sun, 11 Feb 2018 02:18:09 +0100
+ http://www.lemonde.fr/tiny/5254980/
+
+
+
+ http://www.lemonde.fr/gouvernement-philippe/article/2018/02/11/enquete-d-ebdo-sur-hulot-marlene-schiappa-sort-de-son-silence_5254974_5129180.html?xtor=RSS-3208
+ Hulot : Marlène Schiappa dénonce un article « irresponsable » d’« Ebdo »
+ Dans une tribune au « JDD », la secrétaire d’Etat à l’égalité entre les femmes et les hommes regrette également une « médiatisation à l’extrême ».
+ Sun, 11 Feb 2018 00:49:31 +0100
+ http://www.lemonde.fr/tiny/5254974/
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_lineageos.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_lineageos.xml
new file mode 100644
index 000000000..69ed2c19b
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_lineageos.xml
@@ -0,0 +1,634 @@
+Jekyll2018-02-25T04:13:58+00:00//LineageOSLineageOS Android DistributionChangelog 16 - Smart Styles, Treble is trouble and Omfg Oreo2018-02-25T00:00:00+00:002018-02-25T00:00:00+00:00/Changelog-16<p><img src="/images/2018-02-25/lineageos-15.1-hero.png" alt="hero adaptive-icons image" class="blog_post_image_full" /></p>
+
+ <h2 id="hello-lineageos-151">Hello LineageOS-15.1</h2>
+
+ <p>We’ve been working hard these months to get this new version available; the changes that were
+ done in upstream (AOSP) are huge: Project Treble changed the way hardware is managed in Android,
+ so all the OEM-abandoned platforms that are supported by Lineage had to be adapted for the new platform.
+ Moreover, we’ve taken the time to make the code future-proof by converting a lot of our hardware-related
+ code to make use of the new Treble capabilities: things such as LiveDisplay and lights (leds) control
+ are now up to date with the new Android standards, so we’re going to have an easier time
+ forward-porting stuff whenever a new Android version comes out.</p>
+
+ <p>We’ve not spent all the time just forward-porting 14.1 features: the whole platform code
+ has been cleaned up: all the unused and deprecated bits have been removed and the rebrand process has been
+ completed.</p>
+
+ <p>We’re also introducing some new features that were highly requested
+ in the <a href="/Summer-Survey/">Summer Survey</a> we held last summer, and a few are featured below:</p>
+
+ <h4 id="styles">Styles</h4>
+
+ <p>You can now style some aspects of your device by selecting a custom accent color and by choosing between a light or dark interface.
+ A really cool feature we’ve added to this is the (optional) integration with LiveDisplay: during the day the device will have a light theme, and at night some of the interface elements will turn dark, so it’s easier on the eyes.
+ What if this isn’t enough? What if you want your device style to match your wallpaper colors? <em>Automagic</em> will propose you the best colors combination based on your current wallpaper.
+ While this is not a full theming replacement, we hope to satisfy users that requested simple theming capabilities.</p>
+
+ <h4 id="new-trebuchet-launcher">New Trebuchet launcher</h4>
+
+ <p>Our homegrown launcher has been rewritten to make it more up to date with Android standards. Some redundant features have been removed and new ones, such as icon packs support, have been added.
+ All our apps have received a new adaptive icon too, thanks to the feedback you provided in the Summer Survey (you can see a sneak peak of them above).
+ Moreover, Trebuchet will allow you to choose the icon shape that suits your liking from circle, super ellipse, squircle and teardrop.</p>
+
+ <h4 id="qr-support-in-snap-camera">QR support in Snap camera</h4>
+
+ <p>There’s now a QR reader mode in our camera app, which supports QR-encoded URLs, plain text, SMS, email addresses, contacts cards, events, phone numbers and location coordinates.</p>
+
+ <h3 id="upgrading-to-151">Upgrading to 15.1</h3>
+
+ <p>We’re starting our 15.1 builds with some devices (listed below), with others migrating to 15.1 sooner or later. Note that several older devices are unable to receive official builds at this time due to the lack of support for working HAL1 camera recorder, which was broken by the treble changes, but don’t worry - we’re working on it.</p>
+
+ <h4 id="from-official-lineageos-141">From official LineageOS 14.1</h4>
+
+ <ol>
+ <li>(Optional) Make a backup of your important data</li>
+ <li>Download the build either from <a href="https://download.lineageos.org">download portal</a> or built in updater app
+ <ul>
+ <li>You can export the downloaded package to the sdcard from the Updater app by long-pressing it and then selecting <em>“Export”</em> on the top menu</li>
+ </ul>
+ </li>
+ <li>Download proper addons packages (<a href="https://wiki.lineageos.org/gapps.html">GApps</a>, <a href="https://download.lineageos.org/extras">su</a>…) for Oreo 8.1 (8.0 packages are not compatible).</li>
+ <li>Make sure your recovery and firmware are up to date</li>
+ <li>Boot into recovery mode</li>
+ <li>Format your system partition</li>
+ <li>Install the LineageOS 15.1 build, then install all your addons <em>WITHOUT</em> rebooting</li>
+ <li>When you’re done, reboot the device.</li>
+ </ol>
+
+ <p>Note that:</p>
+
+ <ul>
+ <li>Wiping data is <em>not</em> needed when upgrading from an official build</li>
+ <li>While you’ll be able to download the update from the updater app, you won’t be allowed to install a 15.1 build on the top of a 14.1 one automatically</li>
+ </ul>
+
+ <h4 id="from-anything-else-including-unofficial-lineageos-builds">From anything else (including unofficial LineageOS builds)</h4>
+
+ <ol>
+ <li>(Optional) Make a backup of your important data</li>
+ <li>Download the build from <a href="https://download.lineageos.org">download portal</a></li>
+ <li>Download proper addons packages (<a href="https://wiki.lineageos.org/gapps.html">GApps</a>, <a href="https://download.lineageos.org/extras">su</a>…) for Oreo 8.1 (8.0 packages are not compatible)</li>
+ <li>Make sure your recovery and firmware are up to date</li>
+ <li>Boot into recovery mode and wipe data</li>
+ <li>Install the LineageOS 15.1 build, then install all your addons without rebooting</li>
+ <li>When you’re done, reboot the device</li>
+ </ol>
+
+ <p>Note that wipe data is <em>always</em> needed when coming from something that’s not an official build, regardless of the Android version</p>
+
+ <h3 id="nightly-builds-will-roll-out-this-monday">Nightly builds will roll out this Monday</h3>
+
+ <p>We’ll be testing the infrastructure this weekend (24th and 25th Feb.), you will see some 15.1 builds appear on our download portal marked as <em>EXPERIMENTAL</em>.</p>
+
+ <p>The first batch of nightlies builds will roll out on Monday 26th February, while the other days of the week will remain dedicated to 14.1 devices.
+ Keep in mind that if you install an <em>EXPERIMENTAL</em> build you will not receive OTA updates, but you’ll have to manually flash a <em>NIGHTLY</em> build instead.</p>
+
+ <h2 id="older-versions-changes">Older versions changes</h2>
+ <ul>
+ <li>LineageOS 14.1
+ <ul>
+ <li>Jelly’s favorites management has been improved</li>
+ <li>December 2017, January 2018 and February 2018 security patches have been merged</li>
+ <li>Webview has been updated to Chromium 64.0.3282.137</li>
+ </ul>
+ </li>
+ <li>LineageOS 13.0
+ <ul>
+ <li>December 2017, January 2018 and February 2018 security patches have been merged</li>
+ </ul>
+ </li>
+ </ul>
+
+ <h2 id="goodbye-lineageos-130">Goodbye LineageOS 13.0</h2>
+ <p>The Marshmallow-based release has been discontinued and the last builds were published on Feb 11th, 2018. The branches will not be locked, so it’ll still be open for contributions such as security patches, like the 11.0 branch which has been getting security patches backported from the community. LineageOS 14.1 will remain under active development, but don’t expect new features to come since the majority of the team has jumped to the Oreo branch.</p>
+
+ <h2 id="infrastructure">Infrastructure</h2>
+ <p>A couple of our infrastructure repos have been moved from the <a href="https://github.com/LineageOS">LineageOS organization</a> to the <a href="https://github.com/lineageos-infra">LineageOS-Infra organization</a> on GitHub.
+ The wiki has also been updated with a focus on device information since a lot of users often check it to look for a suitable device that’s also capable of running LineageOS</p>
+
+ <h2 id="device-support-new-rules">Device support: new rules</h2>
+ <p>Beginning with LineageOS 15.1, we’re enforcing a set of rules defined by the <a href="https://github.com/LineageOS/charter/blob/master/device-support-requirements.md">LDSR</a> (LineageOS Device Support Requirements). This document defines the requirements that must be met in order for devices to be deemed ship-ready for LineageOS releases to maintain a higher quality standard. These rules, which are not retroactive (14.1 builds won’t be affected), will apply to all the devices that want to ship a LineageOS 15.1 official release regardless of having a 14.1 build.
+ For the end user it means that whenever an official 15.1 build is published, you can expect everything that’s listed in the charter as working.</p>
+
+ <h2 id="device-changes">Device changes</h2>
+
+ <h4 id="initial-151-devices">Initial 15.1 devices</h4>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/angler">Google Nexus 6P - angler</a> - moved from 14.1</li>
+ <li><a href="https://wiki.lineageos.org/devices/bullhead">Google Nexus 5X - bullhead</a> - moved from 14.1</li>
+ <li><a href="https://wiki.lineageos.org/devices/zl1">LeEco Le Pro3 / Le Pro3 Elite - zl1</a> - moved from 14.1</li>
+ <li><a href="https://wiki.lineageos.org/devices/oneplus3">OnePlus 3 / 3T - oneplus3</a> - moved from 14.1</li>
+ <li><a href="https://wiki.lineageos.org/devices/cheeseburger">OnePlus 5 - cheeseburger</a> - moved from 14.1</li>
+ <li><a href="https://wiki.lineageos.org/devices/dumpling">OnePlus 5T - dumpling</a> - maintainers: <em>codeworkx, amartinz</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/gts210vewifi">Samsung Galaxy Tab S2 9.7 Wi-Fi (2016) - gts210vewifi</a> - moved from 14.1</li>
+ <li><a href="https://wiki.lineageos.org/devices/gts28vewifi">Samsung Galaxy Tab S2 8.0 Wi-Fi (2016) - gts28vewifi</a> - moved from 14.1</li>
+ <li><a href="https://wiki.lineageos.org/devices/gemini">Xiaomi Mi 5 - gemini</a> - moved from 14.1</li>
+ <li><a href="https://wiki.lineageos.org/devices/capricorn">Xiaomi Mi 5S - capricorn</a> - moved from 14.1</li>
+ <li><a href="https://wiki.lineageos.org/devices/natrium">Xiaomi Mi 5S Plus - natrium</a> - moved from 14.1</li>
+ </ul>
+
+ <h4 id="added-141-devices">Added 14.1 devices</h4>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/fugu/">Google Nexus Player - fugu</a> - maintainer: <em>npjohnson</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/kltesprsports/">Samsung Galaxy S5 Sport - kltesprsports</a> - maintainer: <em>javelinanddart</em></li>
+ <li>Samsung Galaxy S6 <a href="https://wiki.lineageos.org/devices/zerofltexx">Flat (zerofltexx)</a> and <a href="https://wiki.lineageos.org/devices/zeroltexx">Edge (zeroltexx)</a> - maintainer: <em>usaamah99</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/land">Xiaomi Redmi 3S and 3X - land</a> - maintainers: <em>karthick111, darshan1205, chaubeyprateek</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/sumire">Sony Xperia Z5 - sumire</a> - maintainers: <em>myself5, haoZeke</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/tulip">ZTE Axon 7 Mini - tulip</a> - maintainer: <em>tdm</em></li>
+ </ul>
+
+ <h4 id="changes-to-141-devices">Changes to 14.1 devices</h4>
+
+ <ul>
+ <li>Samsung Galaxy Note 2 (<a href="https://wiki.lineageos.org/devices/t0ltekor">Korean</a>) has been merged with the <a href="https://wiki.lineageos.org/devices/t0lte">LTE</a> variant</li>
+ <li><a href="https://wiki.lineageos.org/devices/addison">Motorola Moto Z Play - addison</a> has been readded - maintainer: <em>mccreary</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/jfltexx">Samsung Galaxy S4 T-Mobile - jfltetmo</a> is now supported in the <a href="https://wiki.lineageos.org/devices/jfltexx">Samsung Galaxy S4 International (LTE) - jfltexx</a> builds - maintainer: <em>zatoichi</em></li>
+ </ul>
+
+ <h4 id="removed-141-devices">Removed 14.1 devices</h4>
+
+ <ul>
+ <li>Samsung Galaxy S III US variants: <a href="https://wiki.lineageos.org/devices/d2att">AT&T</a>, <a href="https://wiki.lineageos.org/devices/d2spr">Sprint</a>, <a href="https://wiki.lineageos.org/devices/d2tmo">T-Mobile</a> and <a href="https://wiki.lineageos.org/devices/d2vzw">Verizon</a> - no longer maintained</li>
+ <li>Asus Zenfone 2 <a href="https://wiki.lineageos.org/devices/Z00D">ZE500CL (Z00D)</a>, <a href="https://wiki.lineageos.org/devices/Z008">ZE550ML (Z008)</a> and <a href="https://wiki.lineageos.org/devices/Z00A">ZE551ML (Z00A)</a> - no longer maintained</li>
+ </ul>LineageOS teamOh my! Finally OreoCelebrating one year of LineageOS2017-12-24T00:00:00+00:002017-12-24T00:00:00+00:00/Celebrating-one-year-of-LineageOS<h2 id="reviewing-our-first-12-months">Reviewing our first 12 months</h2>
+
+ <p>One year ago, LineageOS was announced to the world.
+ We’d like to take the time to celebrate with our contributors, our users and our community.
+ This wouldn’t have been possible without all of you.</p>
+
+ <p>We would never have enough words to express how much we appreciate this community and how excited we are for the next year to come.
+ So instead, we’ve created an infographic, that we hope you all will enjoy.</p>
+
+ <p><img src="/images/2017-12-24/lineageos-1st-birthday-infographic.png" alt="infographic" class="blog_post_image" /></p>
+
+ <h4 id="thank-you">Thank you</h4>LineageOS teamHappy birthday to usChangelog 15 - Super Security, Gratifying Gestures, Resounding Recorder2017-12-05T00:00:00+00:002017-12-05T00:00:00+00:00/Changelog-15<h2 id="welcome-to-lineageos-regularly-irregular-review-where-we-go-over-changes-in-the-last-few-weeks">Welcome to LineageOS’ regularly irregular review, where we go over changes in the last few weeks</h2>
+
+ <h3 id="major-changes-since-september-23rd">Major changes since September 23rd</h3>
+
+ <ul>
+ <li>Recorder app has gotten a major redesign, it’s now better thanks to the feedback provided in the Summer Survey.
+ <ul>
+ <li>If you are interested in reading more about the design changes, our very own jrizzoli wrote a <a href="https://medium.com/@jrizzoli/recording-awesomeness-bc1c5ffe2826">Medium post</a> on the thought process</li>
+ </ul>
+ </li>
+ <li>A LiveDisplay tile has been added</li>
+ <li>KRACK Wi-Fi vulnerability has been fixed in both LineageOS 14.1 and 13.0</li>
+ <li>October security patches have been merged for both LineageOS 14.1 and 13.0</li>
+ <li>November security patches have been merged for LineageOS 14.1 and 13.0</li>
+ <li>Bypassing the lockscreen by switching to a lockscreen-less profile from quick settings has been blocked (BUGBASH-1095)</li>
+ <li>The updater, among other minor improvements, now supports device unifications: when a device gets build merged with another one, the user will directly receive updates without requiring the user to manually flash the new build.</li>
+ <li>Added support for extended length NFC (needs to be enabled per-device, if supported)</li>
+ <li>Two new touchscreen gesture options have been added for lowering and raising the media volume</li>
+ <li>Battery icon has been improved; the percentage will be shown in battery saver mode when the “show percentage” option is set. The exclamation mark in the battery has also been given more contrast so it’s easier on the eyes</li>
+ <li>The Calendar app now shows week start and end in the title when in week view, instead of showing the month and year</li>
+ <li>Gallery has received some stability improvements</li>
+ <li>Making emergency calls without a sim card is now possible, in regions that allow it</li>
+ <li>Issues with the “Install” button being greyed out when installing APKs should now be fixed (REGRESSION-1262)</li>
+ </ul>
+
+ <h3 id="oreo-update">Oreo Update</h3>
+
+ <p>Up to now, news on Oreo-based LineageOS 15.0 has been almost non-existent, but we’re in a position now where we can document some of our progress here.</p>
+
+ <p>As many of you have seen (and we’re sure some of you are running them right now), a number of unofficial LineageOS 15.0 builds exist, some of which are built by our very own maintainers.
+ These are in no way representative of a final product, but definitely let you all experience some of the features Android 8.0 has to offer.</p>
+
+ <p>Once that the basic framework has been put in place and devices are successfully booting LineageOS 15.0, some features are being brought forward, most of which are dependent on what was previously known as the CMSDK. A large focus while doing this has been to evaluate the need to carry-forward or otherwise clean up the leftovers from our inception last year.</p>
+
+ <p>However now that Android 8.1 has been released, we’re anticipating moving straight to the 15.1 branch where we’ll merge all our work done for 15.0 and finish the porting effort.</p>
+
+ <p>Like always, we won’t be giving any indication as to when we might be close to a releasable product, but keep waiting patiently, and as we reach big milestones, we’ll be giving you some more status updates.</p>
+
+ <h3 id="infrastructure">Infrastructure</h3>
+
+ <p>Our <a href="https://status.lineageos.org">status page</a> has been updated and now it automatically detects whether a service is down without requiring any manual input as it did previously.</p>
+
+ <p>We have added a new language <a href="https://en.wikipedia.org/wiki/Kabyle_language">Kabyle</a> to our <a href="https://translate.lineageos.org/">translation system</a> . Feel free to subscribe to this or other languages to improve or complete the translation progress!</p>
+
+ <h3 id="build-roster">Build roster</h3>
+
+ <p>We have enforced stricter quality terms for our builds: maintainers now have limited time frames to fix important issues that have been assigned to them on Jira before their device gets pulled down from the build roster. Those devices will be added back once the issues listed in the <a href="https://github.com/LineageOS/hudson/commit/b2560ed989493a7798ca914fe82033ccfee610df">removal commit</a> have been addressed.</p>
+
+ <p>Added 14.1 devices</p>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/gohan">BQ Aquaris X5 Plus - gohan</a> - <em>maintainers: brinlyau, cmorlok, eloimuns, Kra1o5, stucki, cyclon1978, Team aquaris-dev</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/tenshi">BQ Aquaris U Plus - tenshi</a> - <em>maintainers: brinlyau, eloimuns, Kra1o5, stucki, Team aquaris-dev</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/suzuran">Sony Xperia Z5 Compact - suzuran</a> - <em>maintainer: olefb</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/karin">Sony Xperia Z4 Tablet LTE - karin</a> - <em>maintainers: andralex8, cdesai, Kali-, olivier97, quarx2k</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/karin_windy">Sony Xperia Z4 Tablet WiFi - karin_windy</a> - <em>maintainers: andralex8, cdesai, Kali-, olivier97, quarx2k</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/m216">LG K10 - m216</a> - <em>maintainers: erfanoabdi, dom133</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/FP2">Fairphone 2 - FP2</a> - <em>maintainer: chrmhoffmann</em></li>
+ </ul>
+
+ <p>Changes to 14.1 devices</p>
+
+ <ul>
+ <li>Samsung Galaxy S5 Sprint SM-G900P (<a href="https://wiki.lineageos.org/devices/kltespr">kltespr</a>) has been merged into Samsung Galaxy S5 G900I/P (<a href="https://wiki.lineageos.org/devices/kltedv">kltedv</a>).</li>
+ </ul>
+
+ <p>Removed 14.1 devices</p>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/vs985">LG G3 (Verizon) - vs985</a> - no longer maintained</li>
+ <li><a href="https://wiki.lineageos.org/devices/peach">Ark Benefit A3 - peach</a> - no longer maintained</li>
+ <li><a href="https://wiki.lineageos.org/devices/wt88047">Wingtech Redmi 2 - wt88047</a> - no longer maintained</li>
+ <li><a href="https://wiki.lineageos.org/devices/addison">Motorola Moto Z Play - addison</a> - no longer maintained</li>
+ <li><a href="https://wiki.lineageos.org/devices/A6020">Lenovo Vibe K5 / K5 Plus - A6020</a> - outstanding unfixed issues</li>
+ <li>LG G4 - <a href="https://wiki.lineageos.org/devices/h815">h815</a>, <a href="https://wiki.lineageos.org/devices/h811">h811</a> - outstanding unfixed issues</li>
+ <li>HTC One M9 - <a href="https://wiki.lineageos.org/devices/himaul">himaul</a>, <a href="https://wiki.lineageos.org/devices/himawl">himawl</a> - outstanding unfixed issues</li>
+ <li><a href="https://wiki.lineageos.org/devices/i9305">Samsung Galaxy S III (LTE / International) - i9305</a> - outstanding unfixed issues</li>
+ </ul>
+
+ <p>Removed 13.0 devices</p>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/ghost">Motorola Moto X - ghost</a> - no longer maintained</li>
+ </ul>harryyoudChanges since September 23rdSummer Survey - Results2017-10-16T00:00:00+00:002017-10-16T00:00:00+00:00/Summer-Survey-Results<h2 id="we-asked-for-feedback-you-answered">We asked for feedback. You answered</h2>
+
+ <p>Let’s talk about the <a href="https://www.lineageos.org/Summer-Survey/">Summer Survey</a> and its results.<br />
+ To start off, only about 1.35% of our users (at the time of writing) took the survey (23000 / 1700000), so the results are not reflective of our entire userbase, but we’ll analyze the feedback nonetheless.</p>
+
+ <h3 id="builds">Builds</h3>
+
+ <p>The majority of the people who responded were using an official build (86%). Nearly all (97%) had it installed on a phone, whereas a smaller portion (10%) had it installed on a tablet.</p>
+
+ <h3 id="apps">Apps</h3>
+
+ <p>Your favorite apps are our Snap Camera app, our Trebuchet launcher, and AudioFX. The apps you’d like to see improved in LineageOS 15 are Snap, Trebuchet, and the Gallery app.<br />
+ Many asked to match the camera quality of stock in Snap, but unfortunately that is not entirely within our control, primarily due to the proprietary nature of newer stock features and algorithms. However, this doesn’t mean we won’t continue to aim for the best with what we can control.<br />
+ The least used app is Jelly (61% of the surveyed never use it) and that’s understandable since there are more powerful alternatives. This doesn’t mean Jelly (or any other app) is going to be removed, but we will use this information to avoid spending time and resources on projects people rarely use.</p>
+
+ <p>Most of the responders said they were using Google Apps, but a sizeable amount of those surveyed weren’t using any Google Apps (mostly due to region-blocks, or privacy and ideological motivations). We will work hard to improve user experience for both types of users.</p>
+
+ <h3 id="icons">Icons</h3>
+
+ <p>On average, our icons were rated 3.8 / 5, and the Dialer and Gallery were said to have the best icons. We’ll use this feedback to adapt our icons to the new adaptive icon style introduced with Android O in LineageOS 15.</p>
+
+ <h3 id="wallpapers">Wallpapers</h3>
+
+ <p>Our wallpapers have been rated 3.2 / 5. Responder’s favorite kinds are abstract and landscapes. We’ll also try to bring some improvements to our wallpapers collection in the upcoming release.</p>
+
+ <h3 id="features">Features</h3>
+
+ <p>Status bar customizations and Privacy Guard were the favorite features among those who responded, followed by Ambient display, button remapping, lockscreen enhancements, LiveDisplay, Protected Apps, and Profiles.</p>
+
+ <h3 id="infrastructure">Infrastructure</h3>
+
+ <p>Changelogs were rated 4.6 / 5 as a good idea, and 4 / 5 with regards to the quality of them. Our wiki was rated as 3.8 / 5 and the download portal was slightly higher at 4.2 / 5.<br />
+ It looks like a large portion of the responders is not aware of our Jira, subreddit or IRC channels (47%, 42% and 47% respectively). We would like to offer some clarification as to where to find these and what they are.<br />
+ Our subreddit (<a href="https://www.reddit.com/r/LineageOS">r/LineageOS</a>) is a good place for finding support directly from other LineageOS users and sometimes team members.<br />
+ Our <a href="https://jira.lineageos.org">Jira</a> is a place for <a href="https://wiki.lineageos.org/bugreport-howto.html">submitting bug reports</a>.<br />
+ Our IRC, similar to our subreddit, a place for finding support with installation, or asking Android questions, can be found at channels <em>#lineageos</em> and <em>#lineageos-dev</em> on Freenode (the latter being used for development related questions).</p>
+
+ <h3 id="your-personal-messages">Your personal messages</h3>
+
+ <p>The last survey page had an optional text box that could be filled with a personal message for the LineageOS team, and we took the time to read them all.<br />
+ It’s very motivating to see that so many people, who could write anything they wanted, said a simple, yet powerful, “Thank you” (or something similar).<br />
+ Others were mostly about feature suggessions. Even though not all of the suggestions can be implemented, we appreciate your contribution, and we’ll do our best to tune our goals so that they are more inline with the community desires during the development of the next branch.</p>
+
+ <p>The LineageOS team would like to extend our thanks back to everyone who took their time to answer these simple questions.</p>jrizzoliHere's what you told usChangelog 14 - Powerful PrivacyGuard, Unique Updater, Brave Burn-in protection and Awesome AudioFX2017-09-23T00:00:00+00:002017-09-23T00:00:00+00:00/Changelog-14<h2 id="welcome-to-lineageos-regularly-irregular-review-where-we-go-over-changes-in-the-last-few-weeks">Welcome to LineageOS’ regularly irregular review, where we go over changes in the last few weeks</h2>
+
+ <h3 id="major-changes-since-august-8th">Major changes since August 8th</h3>
+
+ <ul>
+ <li>LineageOS Updater app has been rewritten. Previous issues with downloading updates should be gone now
+ <ul>
+ <li>Downloads are now stored at <em>/data/lineageos_updates/</em></li>
+ </ul>
+ </li>
+ <li>Privacy Guard has received an user interface overhaul</li>
+ <li>Burn-in protection (device-specific): statusbar and navigation bar (if any) icon’s position is shifted every minute to help prevent burn-in of these areas</li>
+ <li>AudioFX can now control reverb effect</li>
+ <li>Added system profiles tile</li>
+ <li>September security patches, including <a href="https://www.armis.com/blueborne/">blueborne</a> vulnerability fix</li>
+ <li>Jelly improvements, including more HTML 5 features support</li>
+ <li>Disabled unused cmsdk services in builds</li>
+ <li>Added carrier selection shortcut for Settings app, so you can jump to it right from your homescreen</li>
+ <li>It’s now possible to reapply the current system profile</li>
+ <li>Volume buttons should no longer cause backlit hardware keys to light up</li>
+ <li>Email is (back) able to customize notification lights settings for each email account</li>
+ <li>WEP WiFi encryption input now detects valid keys correctly</li>
+ <li>A number of crashes have been fixed in camera operations</li>
+ </ul>
+
+ <h3 id="survey">Survey</h3>
+
+ <p>Our <a href="https://www.lineageos.org/Summer-Survey/">summer survey</a> has ended. We’d like to thank everyone who took their time to provide advices and feedbacks. We’ll share the results once we’ve analyzed the data in another post. Stay tuned!</p>
+
+ <h3 id="lineageos-150-progress">LineageOS 15.0 progress</h3>
+
+ <p>While the cm-14.1 branch development hasn’t stopped, we’re also working on the next LineageOS version (15.0), based on the latest Android 8.0. We will refrain from giving any ETA, just patiently wait until the new branch is ready for release-time.</p>
+
+ <h3 id="infrastructure">Infrastructure</h3>
+
+ <ul>
+ <li>CVE Tracker
+ <ul>
+ <li>Improvements for internal usage (maintainers): tags for filters, severity indicators for CVEs, actions are now logged</li>
+ </ul>
+ </li>
+ </ul>
+
+ <h3 id="build-roster">Build roster</h3>
+
+ <h4 id="added-141-devices">Added 14.1 devices</h4>
+
+ <ul>
+ <li>LG G6 (<a href="https://wiki.lineageos.org/devices/h870">EU Unlocked - h870</a> and <a href="https://wiki.lineageos.org/devices/us997">US Unlocked - us997</a>) - <em>maintainer: rashed</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/v400">LG G Pad 7.0 WiFi - v400</a> - <em>maintainer: mycax</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/cheeseburger">OnePlus 5 - cheeseburger</a> - <em>maintainers: amartinz, codeworkx, jrizzoli, jumoog, xingrz</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/v1awifi">Samsung Galaxy Note Pro 12.2 Wi-Fi - v1awifi</a> - <em>maintainer: thompatry</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/v1awifi">Samsung Galaxy S5 (Exynos International 3G) - k3gxx</a> - <em>maintainer: tincho5588</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/gtelwifiue">Samsung Galaxy Tab E 9.6 - gtelwifiue</a> - <em>maintainer: zvikovincent</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/gtesqltespr">Samsung Galaxy Tab E 8.0 - gtesqltespr</a> - <em>maintainer: zvikovincent</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/taoshan">Sony Xperia L - taoshan</a> - <em>maintainer: corphish</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/odin">Sony Xperia ZL - odin</a> - <em>maintainers: cyberwalkman, daedroza, chippa_a, adrian dc</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/dogo">Sony Xperia ZR - dogo</a> - <em>maintainers: daedroza, chippa_a, cyberwalkman. adrian dc</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/yuga">Sony Xperia Z - yuga</a> - <em>maintainers: daedroza, cyberwalkman, mardonhh, chippa_a, adrian dc</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/pollux">Sony Xperia Tablet Z LTE - pollux</a> - <em>maintainers: cahbkaup, cyberwalkman, daedroza, chippa_a, adrian dc</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/pollux_windy">Sony Xperia Tablet Z Wi-Fi - pollux_windy</a> - <em>maintainers: cahbkaup, cyberwalkman, daedroza, chippa_a, adrian dc</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/ivy">Sony Xperia Z3+ - ivy</a> - <em>maintainers: cdesai, kali-, olivier97, quarx2k</em></li>
+ </ul>
+
+ <h4 id="readded-141-devices">Readded 14.1 devices</h4>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/lt03lte">Samsung Galaxy Note 10.1 2014 (LTE) - lt03lte</a> - <em>maintainer: rashed</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/w7">Lg L90 - w7</a> - <em>maintainer: mobiusm</em></li>
+ </ul>harryyoudChanges since August 8th 2017Summer Survey2017-08-18T00:00:00+00:002017-08-18T00:00:00+00:00/Summer-Survey<p>While the project’s development proceeds, we think it’s important to take a moment and get some feedback from our users.
+ It has been decided to create a simple survey, instead of collecting on-device metrics, to help us improve LineageOS
+ in the right direction without wasting resources on things that our userbase is not interested in.</p>
+
+ <p>The survey is really simple and we won’t collect any sensitive information.</p>
+
+ <p>We kindly ask you to be respectful of everyone: be honest and don’t take the survey more than one time, each one’s opinion is equally important.</p>
+
+ <p>The survey will be closed in two weeks’ time.</p>
+
+ <h3 id="topics">Topics</h3>
+
+ <p>We’ve divided this survey into 5 topics:</p>
+
+ <ol>
+ <li>Apps</li>
+ <li>Wallpapers</li>
+ <li>Features</li>
+ <li>Infrastructure</li>
+ <li>Public relations</li>
+ </ol>
+
+ <p>You can take the survey here below, and you can share it to your friends using this link: <a href="https://goo.gl/forms/4phLuXIWHUr3s4Qf2">goo.gl/forms/4phLuXIWHUr3s4Qf2</a></p>
+
+ <p>We’re looking forward to see your answers!</p>
+
+ <p>The LineageOS team</p>
+
+ <h3 id="survey">Survey</h3>
+
+ <html>
+ <iframe src="https://docs.google.com/forms/d/e/1FAIpQLSdb1IiHmxwVh08emdMh5Nc9pi8oIhc-Wp49Sr5JdFRzoDMPmA/viewform?embedded=true" width="100%" height="700" frameborder="0" marginheight="0" marginwidth="0"><a href="https://goo.gl/forms/4phLuXIWHUr3s4Qf2">Loading...</a></iframe>
+ </html>jrizzoliIt's your timeChangelog 13 - Wonderful Webviews, Pedantic Permissions and Disappearing Dates2017-08-08T00:00:00+00:002017-08-08T00:00:00+00:00/Changelog-13<h2 id="welcome-to-lineageos-regularly-irregular-review-where-we-go-over-changes-in-the-last-few-weeks">Welcome to LineageOS’ regularly irregular review, where we go over changes in the last few weeks</h2>
+
+ <h3 id="major-changes-since-july-3rd">Major changes since July 3rd</h3>
+
+ <ul>
+ <li>Even more Jelly improvements
+ <ul>
+ <li>Search on page has been added</li>
+ <li>No longer saves form data when in incognito mode</li>
+ <li>Changed to Google as the default search engine, home page and suggestion provider. This can still be changed in Settings, just like before</li>
+ <li>Added the Yandex search engine</li>
+ <li>Media can now be displayed in full screen mode</li>
+ </ul>
+ </li>
+ <li>Merged July security patches for both LineageOS 14.1 and 13.0</li>
+ <li>Merged August security patches for LineageOS 14.1</li>
+ <li>Sensitive number improvements
+ <ul>
+ <li>Countries with multiple MCCs are now supported properly (including GB, US, and India)</li>
+ <li>Added multiple 116 numbers in various European countries</li>
+ <li>Added sensitive numbers for Greece</li>
+ </ul>
+ </li>
+ <li>Date can now be hidden on the LockClock widget</li>
+ <li>Updated Chromium Webview to version 60 (60.0.3112.78)</li>
+ <li>A number of deadlocks/freezes/crashes in AppOps have been fixed</li>
+ <li>The updater app now warns in case mobile data is about to be used for a download</li>
+ <li>“Panic detection” mode is now enabled. Pressing the back button several times in quick succession will return you to the home screen</li>
+ <li>Fixed a number of crashes and removed a screen for single SIM devices in the Setup Wizard</li>
+ <li>Eleven (Music app), Snap, and Gallery are now properly granted external storage permissions</li>
+ <li>On dual-SIM devices, the preferred SIM for SMS is no longer reset on reboot</li>
+ </ul>
+
+ <h3 id="infrastructure">Infrastructure</h3>
+
+ <ul>
+ <li>CVE tracker improvements
+ <ul>
+ <li>Added a dark theme - makes it easier on the eyes!</li>
+ <li>Added a new landing page to answer some FAQs</li>
+ </ul>
+ </li>
+ </ul>
+
+ <h3 id="build-roster">Build roster</h3>
+
+ <p>Added 14.1 devices</p>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/nx512j">nubia Z9 Max - nx512j</a> - <em>maintainer: Bauuuuu</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/mido">Xiaomi Redmi Note 4 - mido</a> - <em>maintainer: TheScarastic</em></li>
+ </ul>
+
+ <p>Readded 14.1 devices</p>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/athene">Motorola Moto G4 - athene</a> - <em>maintainers: vache, shr3ps, rahulsnair</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/d800">LG G2 (AT&T) - d800</a> - <em>maintainer: Kapricornus</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/d801">LG G2 (T-Mobile) - d801</a> - <em>maintainer: Kapricornus</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/d802">LG G2 (International) - d802</a> - <em>maintainer: Kapricornus</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/d803">LG G2 (Canadian) - d803</a> - <em>maintainer: Kapricornus</em></li>
+ </ul>
+
+ <p>Suspended 14.1 devices</p>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/lt03lte">Samsung Galaxy Note 10.1 2014 (LTE) - lt03lte</a>
+ <ul>
+ <li>Withdrawn due to neglected CVE patches</li>
+ </ul>
+ </li>
+ </ul>harryyoudChanges since July 3rd 2017Changelog 12 - Jam-packed Jelly, Terrific Tiles, and Updated Updater2017-07-03T00:00:00+00:002017-07-03T00:00:00+00:00/Changelog-12<h2 id="welcome-to-lineageos-biweekly-review-where-we-go-over-changes-in-the-last-couple-of-weeks">Welcome to LineageOS’ biweekly review, where we go over changes in the last couple of weeks</h2>
+
+ <h3 id="major-changes-since-june-12th">Major changes since June 12th</h3>
+
+ <ul>
+ <li>Jelly has been vastly improved:
+ <ul>
+ <li>When a download is completed, a notification is now shown, and a scan for new files is now run</li>
+ <li>Links in incognito tabs are now opened in new incognito tabs</li>
+ <li>A shortcut can now be created directly to a new incognito tab</li>
+ <li>Form data (e.g. usernames, passwords are not saved) is now saved by default</li>
+ <li>Do not track option can now be enabled</li>
+ <li>Search suggestions are now available, including:
+ <ul>
+ <li>Baidu</li>
+ <li>Bing</li>
+ <li>DuckDuckGo (default)</li>
+ <li>Google</li>
+ <li>Yahoo</li>
+ <li>None</li>
+ </ul>
+ </li>
+ <li>Links can now be opened in external apps (e.g. YouTube links can be opened in the YouTube app)</li>
+ <li><a href="https://android-developers.googleblog.com/2017/06/whats-new-in-webview-security.html">Safe browsing</a> is now supported</li>
+ </ul>
+ </li>
+ <li>The <a href="https://www.lineageos.org/Changelog-10/">sensitive numbers list</a> has been expanded:
+ <ul>
+ <li>Brazil, France, Portugal, and the UK have new numbers included</li>
+ <li>Sensitive numbers for Greece, Taiwan, and Ukraine have been added</li>
+ <li>Country detection for the Czech Republic has been fixed</li>
+ </ul>
+ </li>
+ <li>A longstanding issue affecting tap-to-pay on several devices has now been fixed</li>
+ <li>Media codecs have been updated</li>
+ <li>A timeout for the ‘long press power button for torch’ option can now be set. You can find this option in Settings > Buttons > Automatically turn torch off</li>
+ <li>The clock app can now set a system profile when an alarm triggers</li>
+ <li>The Location QS tile can now be toggled without fully expanding the status bar</li>
+ <li>The Battery Saver QS tile has been removed, as this functionality is already available in the main Battery QS tile</li>
+ <li>Custom tiles have now been integrated into the framework to allow for deeper integration with the system, and mimic behavior from older versions
+ <ul>
+ <li>In the next few weeks, keep an eye out for new tiles being forward ported</li>
+ </ul>
+ </li>
+ <li>The updater app now prevents major version upgrades (e.g. 13.0 to 14.1) from being automatically installed, in order to prevent the situation where the user doesn’t notice the change and ends up with incompatible add-ons</li>
+ </ul>
+
+ <h3 id="infrastructure">Infrastructure</h3>
+
+ <ul>
+ <li>The <a href="https://cve.lineageos.org/">CVE tracker</a> has seen a major redesign, and completion percentage calculation has been improved</li>
+ <li>The <a href="https://download.lineageos.org/">downloads page</a> now shows <code class="highlighter-rouge">sha256</code> and <code class="highlighter-rouge">sha1</code> checksums instead of <code class="highlighter-rouge">md5</code></li>
+ <li>Weather providers are now available on the <a href="https://download.lineageos.org/extras">extras page</a></li>
+ </ul>
+
+ <h3 id="build-roster">Build roster</h3>
+
+ <p>Added 14.1 devices</p>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/foster">Nvidia Shield Android TV - foster</a> - <em>maintainer: webgeek1234</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/shieldtablet">Nvidia Shield Tablet - shieldtablet</a> - <em>maintainer: webgeek1234</em>
+ <ul>
+ <li>Promoted from 13.0</li>
+ </ul>
+ </li>
+ </ul>
+
+ <p>Readded 14.1 devices</p>
+
+ <ul>
+ <li>LG G5 (<a href="https://wiki.lineageos.org/devices/h830">T-Mobile - h830</a> and <a href="https://wiki.lineageos.org/devices/h850">International - h850</a>) - <em>maintainer: rashed</em></li>
+ <li>LG V20 (<a href="https://wiki.lineageos.org/devices/h918">T-Mobile - h918</a> and <a href="https://wiki.lineageos.org/devices/us996">GSM Unlocked - us996</a>) - <em>maintainers: rashed, Albinoman887</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/v521">LG G Pad X (T-Mobile) - v521</a> - <em>maintainer: rashed</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/ham">ZUK Z1 - ham</a> - <em>maintainers: ashwinr64, raymanfx, shenki</em></li>
+ </ul>
+
+ <p>Suspended 14.1 devices</p>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/w7">LG L90 - w7</a>
+ <ul>
+ <li>No active maintainer owns the device</li>
+ </ul>
+ </li>
+ <li><a href="https://wiki.lineageos.org/devices/athene">Motorola Moto G4 - athene</a>
+ <ul>
+ <li>Investigating boot issues</li>
+ </ul>
+ </li>
+ </ul>javelinanddartChanges since June 12th 2017Changelog 11 - June ASB, Chromium 59 and Tasks Lock2017-06-12T00:00:00+00:002017-06-12T00:00:00+00:00/Changelog-11<h2 id="welcome-to-lineageos-biweekly-review-where-we-go-over-changes-in-the-last-couple-of-weeks">Welcome to LineageOS’ biweekly review, where we go over changes in the last couple of weeks</h2>
+
+ <h3 id="major-changes-since-the-31st-may">Major changes since the 31st May</h3>
+
+ <ul>
+ <li><a href="https://source.android.com/security/bulletin/2017-06-01">June security patches</a> have been merged (AOSP tag <em>android-7.1.2_r17</em>). All builds starting June 6th will include these. Users that have a vendor.img (mostly Google devices) will be presented with a notice to update this on first boot</li>
+ <li>You can now <a href="https://review.lineageos.org/#/q/topic:taskLock">prevent tasks from being removed when clearing all apps</a> in the recent apps view</li>
+ <li>Jelly now supports HTTP authentication</li>
+ <li>System WebView has been updated to <a href="https://review.lineageos.org/#/q/topic:chromium-59">Chromium 59</a></li>
+ <li>The <a href="https://www.lineageos.org/Changelog-10/">sensitive numbers list</a> has been expanded, and some new countries are now included (e.g. Canada, Czech Republic, Germany, Greece, India, Israel, Netherlands, Serbia and Spain)</li>
+ <li>You can now disable lock screen album background when playing music</li>
+ <li>Double tap to sleep now works on the lock screen too</li>
+ <li>Terminal now properly recognizes CTRL and ALT keys</li>
+ </ul>
+
+ <h3 id="build-roster">Build roster</h3>
+
+ <p>Added 14.1 devices</p>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/flounder">Google Nexus 9 (WiFi) - flounder</a> - <em>maintainers: hashbang173, razorloves</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/flounder_lte">Google Nexus 9 (LTE) - flounder_lte</a> - <em>maintainers: hashbang173, razorloves</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/libra">Xiaomi Mi 4c - libra</a> - <em>maintainer: Demon000</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/capricorn">Xiaomi Mi 5s - capricorn</a> - <em>maintainer: LuK1337</em></li>
+ <li><a href="https://wiki.lineageos.org/devices/lithium">Xiaomi Mi MIX - lithium</a> - <em>maintainer: balika011</em></li>
+ </ul>
+
+ <p>Changed 13.0 devices</p>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/maserati">Motorola Droid 4 - maserati</a> - Promoted to 14.1</li>
+ <li><a href="https://wiki.lineageos.org/devices/targa">Motorola Droid Bionic - targa</a> - Promoted to 14.1</li>
+ <li><a href="https://wiki.lineageos.org/devices/spyder">Motorola Droid RAZR/RAZR MAXX (CDMA) - spyder</a> - Promoted to 14.1</li>
+ <li><a href="https://wiki.lineageos.org/devices/umts_spyder">Motorola Droid RAZR/RAZR MAXX (GSM) - umts_spyder</a> - Promoted to 14.1</li>
+ </ul>
+
+ <p>Suspended 14.1 devices</p>
+
+ <ul>
+ <li><a href="https://wiki.lineageos.org/devices/tenshi">BQ Aquaris U Plus - tenshi</a>
+ <ul>
+ <li>Rework in progress</li>
+ </ul>
+ </li>
+ <li><a href="https://wiki.lineageos.org/devices/v521">LG G Pad X (T-Mobile) - v521</a>
+ <ul>
+ <li>Suspended until wiki instructions are updated</li>
+ </ul>
+ </li>
+ <li>LG G2 (<a href="https://wiki.lineageos.org/devices/d800">AT&T</a>, <a href="https://wiki.lineageos.org/devices/d801">T-Mobile</a>, <a href="https://wiki.lineageos.org/devices/d803">Canadian</a> and <a href="https://wiki.lineageos.org/devices/d802">International</a>)
+ <ul>
+ <li>No longer actively maintained</li>
+ </ul>
+ </li>
+ <li>LG G5 (<a href="https://wiki.lineageos.org/devices/h830">T-Mobile</a> and <a href="https://wiki.lineageos.org/devices/h850">International</a>)
+ <ul>
+ <li>Suspended until wiki instructions are updated</li>
+ </ul>
+ </li>
+ <li>LG V20 (<a href="https://wiki.lineageos.org/devices/h910">AT&T</a>, <a href="https://wiki.lineageos.org/devices/h918">T-Mobile</a>, <a href="https://wiki.lineageos.org/devices/ls997">Sprint</a>, <a href="https://wiki.lineageos.org/devices/vs995">Verizon</a> and <a href="https://wiki.lineageos.org/devices/us996">GSM Unlocked</a>)
+ <ul>
+ <li>Suspended until wiki instructions are updated</li>
+ </ul>
+ </li>
+ </ul>
+
+ <p>You can <a href="http://wiki.lineageos.org/contributing.html">contribute</a> and help the maintainer with updating the wiki instructions by submitting a commit like <a href="https://review.lineageos.org/#/c/175965/">this one</a> for the device to get builds re-enabled.</p>TimSchumiChanges since 31st May 2017SafetyNet2017-06-05T00:00:00+00:002017-06-05T00:00:00+00:00/Safetynet<h2 id="safetynet-what-it-is-and-how-it-affects-you">SafetyNet: What it is, and how it affects you</h2>
+
+ <h3 id="what-is-safetynet">What is SafetyNet?</h3>
+ <p><a href="https://developer.android.com/training/safetynet/index.html">SafetyNet</a> is an API that was developed by Google in order to detect whether or not a device is in a known-good state. On older devices, this check is more lenient in order to maintain compatibility.</p>
+
+ <h3 id="how-does-this-affect-you">How does this affect you?</h3>
+ <p>App developers can choose to enable a toggle in the app developer console to hide their app on the Play Store if a device doesn’t pass SafetyNet tests, or can choose to check the SafetyNet status of a device to disable certain functionality. Notable examples would be Netflix, which is hidden on the Play Store, and Android Pay, which checks SafetyNet each time the app is used. Devices running Lineage may have a smaller selection of usable apps in the Play Store as a result of these checks.</p>
+
+ <h3 id="what-are-we-going-to-do-about-it">What are we going to do about it?</h3>
+ <p>Our official stance is that <strong>we will not intentionally circumvent an integrity check that Google has put in place for app developers</strong>. Any action taken to bypass SafetyNet risks a backlash against all custom OSes, and could cause Google to block them entirely from the Play Store. We have always taken the approach that our customizations should not change the underlying Android architecture in ways that developers cannot predict.</p>
+
+ <h3 id="what-can-you-do-about-it">What can you do about it?</h3>
+ <p>For apps that are no longer visible in the Play Store, you can pursue alternative methods of app installation. For apps that inhibit functionality, you can always install your device’s stock software and relock your bootloader.</p>
+
+ <p>The LineageOS Team</p>javelinanddartWhat it is, and how it affects you
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_londoner.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_londoner.xml
new file mode 100644
index 000000000..b40033c86
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_londoner.xml
@@ -0,0 +1,1742 @@
+
+Londonisthttp://londonist.com/A website about LondonWed, 28 Jun 2017 09:12:41 -0000en-UShourly1Make The Most Of London's Offerings With Chiphttp://londonist.com/london/make-the-most-of-london-s-offerings-with-chiphttp://londonist.com/london/make-the-most-of-london-s-offerings-with-chip#commentsWed, 28 Jun 2017 09:39:37 +0100http://londonist.com/?p=524e62c38de6420122c7
+
There is no shortage of cool and quirky things to do in London — some of them, however, can be fairly pricey. That's where Chip comes in. It's a new app that can help you save some cash without you even realising you're doing it.
+
+
With pints rarely less than a fiver, and transport fares rising every year, it's no mean feat for Londoners to end up with savings at the end of the month.
+
What if you woke up after a great night out with the knowledge that you'd paid for it all using savings? Sounds like a guilt-free and regret-free way to make the most of London.
+
Chip is the answer to your saving woes — helping you save for that special something.
+
+
Chip coordinates with your current account, its intelligent algorithms doing the work for you by looking at your average spending habits to calculate how much you can afford to save — saves are calculated every 4-7 days.
+
+
It then puts this money away for you automatically — before you know it, your stash could be pretty substantial. Little and often means you don't even notice you're putting money to one side.
+
Your Chip account is an instant access savings account, held in your name at Barclays — it's all regulated by the Financial Conducts Authority (FCA), so you can be safe in the knowledge that all is legit and protected.
+
+
You'll still have control of your savings though — press pause at any moment, or choose to save more or less every few days. If you manage to get friends to sign up, you'll get 1% interest for each person, up to a maximum of 5%.
+
Simply click 'withdraw' to transfer the money from your Chip account to your current account — it will be in there the same day if you withdraw before 2pm. For people whose income is irregular, Chip is perfect — nothing is too complex for the app's algorithms.
+
Saving doesn't get easier than this — download Chip on Apple and Android now, and make the most of living in the best city in the world.
+
Because saving is so much harder (and more important) in London, Chip is currently offering all Londoners an exclusive starting interest rate of 2% when you enter the promo code LDNSAVES
+
+]]>Things To Do Today In London: Wednesday 28 June 2017http://londonist.com/london/things-to-do/things-to-do-today-in-london-wednesday-28-june-2017http://londonist.com/london/things-to-do/things-to-do-today-in-london-wednesday-28-june-2017#commentsTue, 27 Jun 2017 19:00:42 +0100http://londonist.com/?p=0bbf6172719dd64c3b8e
+
Things to do in London today is sponsored by CommuterClub.
Grenfell Tower fundraiser axed when venue objected to "crap" trap and bashment music line-up.
+
60-year-old pays £1billion for terraced property on Downing Street.
+
IanVisits relays the story of the day a plane landed in the middle of Canary Wharf.
+
+
Things to do
+
HEATHROW EXRESS: To celebrate the milestone of reaching 100 million passengers, Heathrow Express has been photographing passengers and staff travelling on its trains, in collaboration with travel blogger and photographer Dave Burt. HExibition is a pop-up interactive photography exhibition to pay tribute to the diverse travellers across the UK. Paddington station, free, just turn up, 28 June-4 July
+
UNDERGROUND MEMORABILIA: Peruse original vintage posters from the London Underground and around the world at Antikbar's gallery preview. Checking out what's on offer in advance of their auction on Saturday 1 July will give you time to find a perfect spot on your walls for a little piece of history. AntikBar (Chelsea), £5, just turn up, 10am-6pm
+
BRITISH BOWLS: Lawn bowls might not usually scream "festival atmosphere", but Festibowl 2017 is changing that perception. Barefoot Bowls is the traditional British game but with a modern twist. Chuck a couple of balls around while chilling to DJs, with street food and cocktails. Finsbury Square, £25, book ahead, until 30 June
+
DNA REPAIR: Spend your lunch hour feeding your curiosity. Geneticist Charlotte Mykura speaks on how the DNA in our cells is broken down tens of thousands of times a day, and how these breaks are repaired to prevent the cells from dying or becoming cancerous. Wellcome Collection, free, just turn up, 1pm-2pm
+
TROUBLEMAKERS: The Society of Genealogists is revealing the stories behind some of Bishopsgate Institute's archives on radicals and troublemakers who dared to challenge the status quo. Bishopsgate Institute, £8, book ahead,2pm-3pm
EGYPTIAN SECRETS: Go behind the scenes at the Petrie Museum to learn about their collection of letters, drawings and tales on papyrus. Find out the fascinating process of making papyrus from the stem of the papyrus plant, and as these ancient and fragile documents age, see how researchers battle to conserve the delicate material. Petrie Museum, free, just turn up, 6pm-8pm
+
LGBTQ+ SASS:Take yourself off to the Science Museum for an LGBT-inspired evening of fabulousness, tying in with Pride in London. Drag kings and queens will be sashaying around the museum while you explore animal sex habits, sex counselling, the history of sexual orientation, walking like your opposite gender, and more. Age 18+. Science Museum, free, just turn up, 6.45pm-10pm
+
INSIDE CLERKENWELL: Photographers can catch a different glimpse of London to the rest of us — but how do they do it? Olivia Arthur and Mark Power discuss their most recent project, a photographic portrait of contemporary Clerkenwell. Museum of London, £10, book ahead, 7pm-8.30pm
+
CAMP FIRE STORIES:Forget it's only Wednesday at Skip Garden's evening of music and fresh veggie food around the camp fire, which raises funds for The Starfish Project. Ticket price includes entrance, food and live music. Skip Gardens, £15, book ahead, 7pm-11pm
+
BREWERY BRAWL: Who doesn't love a good local craft beer? But which is best? Five Points brewery in Hackney pit their top three beers against Orbit Beers of Walworth to see who will come out on top. Tickets include six beers and snacks. Jackdaw and Star, £10, book ahead, 8pm-10pm
+
+
Sponsor Message
+
Fancy saving some money on travel? Meet CommuterClub
+
+
Want to get away from the daily drudge and the expense of commuting? You could save up to £300 on travel to put towards an epic summer holiday when you join CommuterClub. These guys give you the value of a yearly travelcard — much cheaper than the monthly alternative — but let you pay for it in 11 instalments. This means you get a whole month of free travel.
+
When you join CommuterClub you’ll even get your hands on a Gold Card, giving you 1/3 off National Rail travel, and 2-for-1 on plenty of London attractions. Better still, Londonist readers can get £20 off when they join – the summer savings just keep on coming. This is the ultimate way to pay for travel – flexible, manageable, and incredibly good value. Find out how much you could save here.
+
Representative example: Credit limit: £1,200. Interest: £67 Total payable: £1,267 in 11 monthly instalments of £115. Representative 10.6% APR. Interest rate: 5.6% pa (variable)
+
+
Art review: power politics
+
+
Copyright kennardphilipps
+
+
Duo kennardphillipps are renowned for the famous Tony Blair selfie in front of an explosion. This small exhibition sees them attacking Theresa May, David Cameron, Trump and the finance industry in collages made from newspapers and share prices. It’s a no-holds-barred attack on the current political system. May Not at Dadiani Fine Art, 30 Cork Street, W1S 3NG, free.Until 6 July ★★★☆☆ (Tuesday-Saturday)
+
Theatre review: austerity folks
+
+
The legend of Richard the Lionheart's dubious rescue from captivity by his minstrel Blondel is the subject of this rock musical by Tim Rice and Stephen Oliver. With its youthful cast, it's well sung, and is funny in a pantomime sort of way. It's a pity that Blondel comes across less as a rock star and more of a folk singer — it could do with a throbbing beat and a few guitar riffs to keep the action moving. But you'll find a few wry observations about austerity which will seem as relevant as when the show first premiered in 1983. Blondel, Union Theatre, 229 Union Street, SE1 0LR, £22.50-£25.Until 15 July 2017 ★★★☆☆ (Tuesday to Sunday) Paul Ewing
+
Food review: street food stalwarts overlooking the docks
+
+
On arrival at Street Feast's Giant Robot, we're disappointed to learn we won't be dining inside an actual giant robot. But that disappointment is short-lived as we suss out the food options. Steamed buns, tapas, fried chicken and lobster rolls are on offer from some stalwarts of the London street food scene — and that's before we get to the bar. If you're suffering from the night before, Thunderbird's buffalo chicken will sort you right out, before you get started again on the peach bellinis. It's a relaxed, warehouse-style space, with tables inside and outside on the balcony overlooking the docks, the ideal place to get a group together for brunch. Before we know it, we've wiled away five hours of our Saturday here, and leave feeling full and satisfied. Extra hungry? Head down on a Sunday for Giant Sundays — supersized portion sizes for the same price. Open 11am-late everyday. Giant Robot, Crossrail Place, Canary Wharf, E14 5AR ★★★★☆ Laura Reynolds
+
Good cause for the day
+
+
Get your team together for costumed capers at Dodgeballdayer on 5 August in Wimbledon. Dodge, duck, dip and dive to raise money for Mencap at the UK's largest fancy dress dodgeball event. As well as a day full of dodging, there will be live DJs, a raffle and an auction with some top-notch goodies. There will also be food and drink stalls to keep you going throughout the day. Wimbledon Rugby Football Club, £30 per person, book ahead, 1pm-1am
+
+
Funzing
+
Fun things to do with our friends and sponsor Funzing.
Scientific research is resuming on how psychedelics affect the weirder aspects of human consciousness. This talk from Dr David Luke engages in current study into pyschedelics and their historical use in shamanic rituals. Be prepared, you might leave with more questions than answers. Get tickets
+
Every January you do the same thing. You make a New Year's resolution to lose weight, be thriftier, quit smoking or possibly even to start exercising. Yet how many of us find ourselves in the exact spot we started in once the month is up? This talk by Dr Gabija Toleikyte, explains why the brain resists changing habits of a lifetime. She'll also explain how to create long lasting change, by working with your brain rather than against it. Get tickets
+
What would you say face-to-face to Saddam Hussein? How would you feel digging up the mass graves of Kosovo? Jonathan Tait-Harris will share experiences from his jobs as a policeman, soldier, war-crimes investigator and adviser to UK and Iraqi governments. £10 Get tickets
+
+
+
+
+]]>Getting Slippery With Strangers On A Plastic Sheet: Londonist Goes To Liquid Lovehttp://londonist.com/london/features/getting-slippery-with-strangers-on-a-plastic-sheet-londonist-goes-to-liquid-lovehttp://londonist.com/london/features/getting-slippery-with-strangers-on-a-plastic-sheet-londonist-goes-to-liquid-love#commentsTue, 27 Jun 2017 16:08:09 +0100http://londonist.com/?p=ed185b6be243a864113b
+
"How can there be no penetration?" asks Bae, the night before Liquid Love, when I will roll around on a plastic sheet with strangers. "If some guy has an erection, he's going to want to put it in you!" Bae has been lying there thinking about this, and I do not know what to say to reassure him. The truth is, I am dreading it, but I feign nonchalance in case Bae says, "don’t go then!" Backing out is not an option. The unbearable awkwardness of it is precisely what attracts me. Last summer I went to the beach at Brexit-on-Sea, at the height of the burkini-ban, wearing a burkini and a backpack. Uncomfortable is my catnip.
+
All participants must take a plus-one, but instead of Bae, I've invited Amber, a female friend who is actually looking forward to it. Amber and I discuss whether we'll get naked, agreeing to bring bikinis, then see what everyone else is doing. I have an overwhelming anxiety that I'll catch a skin condition. Amber is afraid there will be fat people. "I want oil on my boobs, but what if take off my bikini top and ugly people want to rub against me?" I tell Amber she doesn’t owe anyone a boob-rub. She says, "I know, I just don't like fat people."
+
+
I attempt to look relaxed for a photo but cannot control the veins pulsing in my forehead.
+
+
As Amber drives towards the tower block in east London where Liquid Love is held, she tells me she fears our drinks will be spiked. It is a week after the Grenfell Tower fire, and I am more afraid the building will burn down, but I reassure Amber that I know a girl who's been to Liquid Love three times. I do not tell Amber that the girl looks like a Victoria's Secret model who advertises Alpen in commercials set in Swiss Alps. I do not want to share my sense of foreboding that everyone will look like a supermodel, and I will look lardy and lumpy and possibly be turned away.
+
We time it to arrive at the last minute, as I do not do small talk. Nor does Amber. "Did you bring any cake?" I ask, as we run around the building looking for the door. We are panicking now, afraid we won't be let in. The email was clearly worded — latecomers will be turned away, and traffic woes mean we are pushing our luck. "No, I just brought some food for myself," says Amber, "I’m not sharing it!" I have bunged some grapes in my bag, but neither of us want to get involved in the post-session food sharing, suggested in the email. We are terrible, selfish, anti-social people. That is why we're friends.
+
Eyal the organiser answers the door. He's friendly and entirely unthreatening, and suddenly I'm not as petrified as I was. His flat smells of incense and Amber later tells me she's surprised he didn't tidy up. We sit fully clothed in a circle while Eyal talks us through the rules. They are pretty much no wanking, no penetration and no standing up on the sheet once it's oily. There's a two-taps-means-no policy, if anyone's wandering hands are unwelcome. Eyal, who gets naked but doesn’t get involved, has been running Liquid Love once or twice a month for the last two years. His neighbours are yet to take part.
+
+
Eyal warms the olive oil for the session.
+
+
At the end of the talk, we're invited to take off our clothes, as many or as few as we like. Suddenly there are bare ballsacks in close proximity to me. I have never seen anyone take their clothes off so quickly. I use the bathroom to stall for time, waiting to see what everyone else does before I decide whether to wear my bikini. When I come out, I'm relieved to see a woman with her knickers on. I point her out to Amber like I’ve spotted a De Beers diamond ring at a boot fair.
+
We stand in a circle and Eyal tells us to look at the various body parts of everyone else, starting from the feet up. When he gets to genitals, Amber whispers, "I feel like we cheated!" Amber is wearing black lacy knickers and I'm in some stripy bikini bottoms. The sort of swimwear Bridget "Big Pants" Jones might wear to the beach. Aside from one other woman in her knickers, everyone else is naked. I feel an expat in Spain, eating egg and chips (telling the BBC why I voted Brexit).
+
I opt for a blindfold and after oil has been poured on me, I lie on my front, trying to convince myself that this is no different to going for a massage, while berating myself for lying there like I'm in rigor mortis. Bodies slide against me and I'm pulled into the centre of the room where it feels like that scene in Ghost where Patrick Swayze and Demi Moore do some pottery. Only, I am the pottery.
+
The Liquid Love blurb asked us to be "open to both touching as well as being touched" but I cannot do it. I feel selfish and rebuke myself for being uptight and English, but when I get into the car with Amber after, she tells me she too lay there in a blindfold, unable to look at anyone or touch them back. Amber has had sex at Torture Garden. Amber is not English. I wonder if I have been too hard on myself. Maybe my awkwardness is not due to being uptight and English. Maybe it's because this is fucking mental.
+
+
I get oiled up, ready for an afternoon of anxiety.
+
+
The iPod is playing a song off Austin Powers and I can feel a flaccid cock on my foot. Bae need not have worried about anyone trying to penetrate me. I am more rigid than any penis in this room.
+
I have spent the majority of the session on my stomach, my breasts inaccessible beneath me. Turning over, I feel, would be crossing the line, taking this beyond the legit massage I'm trying so hard to kid myself this is. But my bladder tells me my position is not sustainable, and several people have slid across the back of my legs, their weight pressing my knee-caps into the floor. I can't take much more of this or I'll be walking like I've had a visit from some thugs.
+
I do not want to lift my blindfold to make my way to the bathroom, but if I don't go now, olive oil won't be the only yellow liquid people are rolling around in. As I sit on the toilet, I pick someone's pube off my stomach and wonder what the fuck I'm doing letting randoms rub against me, when I've got a beautiful boyfriend at home. As it happens, we split up a few days later (for unrelated reasons), and I wonder if I'd have experienced it differently, if I'd been single.
+
We finish up with a "Love Train" sitting on the floor in two lines. Liquid Love facilitators Jessica and Dione each sit at the end of a line, touching the back of the person in front of them. The idea is that each person copies what they feel, replicating it on the person in front of them. I fail to grasp this, and sit there for some time waiting to start. As I am not touching the man in front of me, he is not touching anyone else, so the Love Train ends at me. Amber is sitting behind me, stroking my back. I wonder why she is doing this and politely pretend not to notice.
+
+
NOT WEIRD AT ALL.
+
+
Showered and dressed, I ask Dione how he and girlfriend Jessica feel about seeing each other with other people. "It strengthens our relationship," says Dione, stroking a naked girl next to him. "We're taught to believe jealousy is a sign that someone cares about you," he continues, as his cock rises, "but actually it's not." So events like this don’t jeopardise your relationship? "On the contrary!" contributes Eyal, "we have relationships starting at these sessions!" He tells me a long-term lesbian couple came to an event, and left in a love triangle with a guy who's now a permanent part of their relationship.
+
As we walk to the car, Amber catches sight of blood stains on my sundress and says, "oh my God, are you bleeding?!" I realise I am. Someone's toenail caught my calf at the end of the session, but I hadn't realised it had ripped my skin. My anxiety levels bubbling over, someone sensible spends the next 12 hours assuring me I can't have caught HIV.
+
My aversion to forced fun has not been altered by attending the session, but if you're up for getting slippery with strangers, Liquid Love is certainly somewhere to do it.
+]]>One-Night Extravaganza Of Art Takes Over East Londonhttp://londonist.com/london/art-and-photography/one-night-of-art-takes-over-east-londonhttp://londonist.com/london/art-and-photography/one-night-of-art-takes-over-east-london#commentsTue, 27 Jun 2017 15:20:00 +0100http://londonist.com/?p=16c9a150da861a37c1ed
+
+
Whitechapel Gallery will be open late — a chance to catch their current Benedict Drew exhibition. Courtesy of the artist and Matt's Gallery
+
+
Gallery lates are nothing revolutionary, but Art Night goes on into the wee small hours. For 12 hours from 6pm on 1 July, east London will be sprinkled liberally with all things art; galleries keep their doors open, venues host special installations, and everyone has an artsy ball.
+
One of our top tips? Jake and Dinos Chapman — known for their macabre, often disturbing, works — will be haunting a warehouse in the docks, with a show starring creepy mannequins (look out for eyeballs where they shouldn't be).
There's an Aleister Crowley-themed video installation in the Masonic temple at Andaz London (a must visit if you've not made it here during Open House), a silent disco in Broadgate Square (you're invited to join in) — or treat your eardrums to a night of sonic experimentation at Village Underground.
+
Bars, DJs, live music, and historic tours are the icing on the cake.
+
+
The Chapman brothers are know for their creepy kooky works and they'll have art across two venues. Courtesy of the artists and White Cube
+
+
Last year our biggest gripe was the fact half the exhibitions were ticketed; this time there seems to be less of this going on, though there may be still some queuing. One ticketed work worth noting is a meditative light and sound installation in the bascule chamber of Tower Bridge. It's fully booked but there is a waitlist. Sign up, we say.
+
+
This masonic temple will play host to a video work. Courtesy Andaz London Liverpool Street
+
+
Local galleries are staying up too, so if you haven't caught the latest exhibition at, say, Whitechapel Gallery or Beers London, stock up on coffee, and call in.
+
+
Do Ho Suh wowed with his recent exhibition at Victoria Miro gallery, so let's see what he can do for Art Night
+
+
With so many participants, it's going to be nigh-on impossible to see it all, so plan and book ahead using the online map and download a visitors guide. Otherwise, there are suggested trails to help you out, or there'll be plenty you can get involved with if you just turn up.
+
Art Night is on across various venues in east London on 1 July, from 6pm onwards. Some events continue till 2 July.
+
+]]>Artist's Model Of A Doomed West End Bookshophttp://londonist.com/london/books-and-poetry/an-online-shrine-to-foyleshttp://londonist.com/london/books-and-poetry/an-online-shrine-to-foyles#commentsTue, 27 Jun 2017 13:40:38 +0100http://londonist.com/?p=9381ddfffbd5cca1778e
+
While the address 113-119 Charing Cross Road might not mean much to you, the bookshop that lived there from 1929 until 2014, may well do.
+
+
Foyles lives on as a business a few doors down, yet the building that was its flagship for over 80 years is fated to fall at the feet of developers.
+
"Soho is currently being erased!" says artist Sebastian Harding. He make paper models of 'unremarkable' buildings, in order to underline their historical and architectural significance.
+
The material, in this case, is particularly poignant — representing, if you like, both the ephemeral nature of the Charing Cross building, and the fragile state that print finds itself in.
+
+
Even from the photos, you can see Harding's work doing its job; able to float over the former Foyles emporium, you can pick out its individual flourishes: the dainty framing of the windows; a cluster of rusty coloured chimney pots.
+
By no stretch the most striking, elegant or important building in the area, it exudes a simple charm that the Ilona House development will struggle to follow.
+
+
The paper model is one part of the project; Harding has released a kind of online shrine to 113-119 Charing Cross Road — which features memories from former employees, including Steve Lake, who recalls one particular 'eccentric' customer:
+
There was one elderly guy who used to come in with a walking stick, with a dentist's mirror on the end of the stick. He'd use it to look up all the skirts of women. He had to be chucked out a few times.
+
+
Steve Lake outside the 'receiving' bay of the old Foyles store.
+
+
Steve goes on:
+
This may be apocryphal but there was a story passed down of a customer who used to sow cress into the carpets. There were certainly areas so quiet, like the Philosophy department where you could definitely have got away with that!
+
5,000 signature may not have been enough to save 113-119 Charing Cross Road, but in his own way, Harding has preserved it for the generations to come, who'll discover it on their phones and tablets.
+]]>London's Best Cake Shops, Tried And Testedhttp://londonist.com/london/food/london-s-best-cake-shopshttp://londonist.com/london/food/london-s-best-cake-shops#commentsTue, 27 Jun 2017 12:02:19 +0100http://londonist.com/?p=96f8026f774201879811
+
Sometimes only a seriously sweet treat will do; dark, fudgy brownies, warm, comforting scones or a massive slab of the biggest, WI impressing Victoria sponge around. Well, hold onto your hats people because we've found the best bakes in town. From globally famous brownies, to curly whirly cakes, to doughnut/muffin hybrids (it's called a 'duffin', OK?) to the most French French patisserie around, we've eaten it all. You're welcome.
+
Maison Bertaux
+
A much-loved Soho stalwart, the window displays alone are enough to entice you in to this higgledy-piggledy French patisserie. Tourists, Soho-ites and those in-the-know flock here in their droves for a taste of perfect choux, authentic tartlets and generally beautiful bakes. They've been around for over 150 year and, believe us, it shows. Cannot be faulted and we'd happily live here forever feeding off tea, hot chocolate and Paris Brest. A true classic.
From the lady that invented the 'duffin' (and fought off copycats from Starbucks in the process), this doughnut/muffin hybrid filled with your choice of raspberry jam or Nutella still has people flocking to Bea's of Bloomsbury today. The original Bloomsbury branch is a cosy, shabby chic kind of shop with an open pastry kitchen that gets a lot of neighbourhood love for its sweet and savoury treats. You'll find celebration cakes, brownies, scones with clotted cream and jam, and a dizzying array of cupcake flavours - from chocolate Baileys and chocolate peanut butter to passion fruit and vanilla and a few vegan or free-from choices, should you require. Happily, there are lots of mini things (brownies, marshmallows and even baguettes) so you can squeeze all the more in. Namesake Bea is no longer involved (though look out for her pop up Butterscotch in Old Street station) but there are now branches in Marylebone and St Paul's in addition to the Bloomsbury original. Plus you can grab a treat to take away at Farringdon and Maida Vale. Most have some pavement seating for you to enjoy your sugary creation and watch the world go by.
After over 20 years in London, German-born konditor (pastry chef) and cook, Gerhard Jenne has acquired legendary status for his wares and helped revolutionise cake making in the UK in the process. His lovely little shops and cafes offer a wide range of cakes and confections - with seasonal variations - and even some savoury lunchables for nearby office workers. The original, bijou Waterloo branch still consists of a small shopfront within a late Georgian cottage and a production kitchen attached where they churn out dozens of their intricately designed signature Curly Whirly cakes, Whiskey Bombs and more handmade freshly every day. Their brownies are so good they've a cult following, such is their dense, fudgy chewiness. You'll also find an impressive range of contemporary bakes, frosted sponge cakes and fruity seasonal tarts. Their hot chocs aren't half bad either.
No, it's not the most original choice of cake shop, but we stand by the fact that it is one of the best. After coming over a decade or so ago, American inspired Hummingbird Bakery quickly made waves (and cookbooks) with their new-style bakes, cheery service and frankly hands down the best red velvet cake you'll find (so good this writer chose it as her wedding cake). The red velvet sponge is deep, dark red and not too sweet and topped with proper cream cheese, plus extra crumbs for decoration. But if you're going occasion cake, you can have whatever the hell you like done to it.
+
Famous for the proper American style cupcakes with a strong buttercream icing to sponge ratio, these guys are well known for going all out for any holidays. Visit near Halloween, Christmas or 4 July and you'll find all manner of creative decorations, US flavours and festive cheer galore. Cupcakes not for you? We urge you to try the black bottomed version which replaces most of the dense chocolate sponge base for a lighter cheesecake. It's addictive.
Violet Cakes is a cute, small California bakery in east London, born from food writer and stylist Claire Ptak. Having started out as a market stall on Broadway Market cooking her delicious cakes from home, Ptak found such success that she opened Violet. Every cake is make with organic flour, sugar, milk and eggs and all other ingredients are organic where possible. Seasonal limited edition buttercream icings are made by folding in fresh homemade fruit purees (think mango, melted Valhrona chocolate, freshly brewed espresso, homemade flower cordials or the darkest caramels with proper sea salt). There are also thick, indulgent brownies, tempting cinnamon rolls and classic bakes but you'll also find a wealth of healthy sounding items like spelt, oat and prune scones, chocolate spelt and agave cake or gluten free almond polenta layer cake. OK, they're not really healthy, but they are truly scrumptious.
E5 Bakehouse is a charming independent organic bakery in a repurposed railway arch under London Fields station. Chiefly known for their out-of-this-world sourdough and othe breads, their passion for artisan methods and organic, local ingredients spills over into their accomplished cake-making. Provenance is a huge deal for E5 Bakehouse and the cafe will only use trusted organic, seasonal suppliers of everything from veg, fruit and dairy to create their cakes and breads. With an in-house stone mill which uses UK grains, E5 believes this makes for the freshest and most nutrient rich flour for their exemplary bread and cakes which include anything from British bakewells to Scandi fika-style buns, American brownies and traditionals like carrot cake. There's also a decent range of free from for any gluten and dairy dodgers.
Just off Columbia Road, the achingly cool Lily Vanilli bakery has a weekly changing seasonal menu of cakes, pastries, brownies and savouries. People travel here from afar to try Lily's (of Vanilli fame) goodies, which include bacon and maple syrup cakes, banana salt caramel with chewy banana chips and many a festooned floral creation. There's a big emphasis on rustic, botanical and natural ingredients and decorations and she must be doing something right as she's baked sweet treats for Elton John, Lulu Guiness, 10 Downing Street and many, many more. There are vegan and gluten free bakes available; check their Instagram feed for current specials. Make sure you grab a coffee and a cake from Lily whenever you visit the flower market.
French patissier Eric Rosseau's pastry work is legendary and his three stores (Islington, Newington Green and within Selfridges) are all works of art in themselves. His cakes, chocolates, breads, viennoseries, tarts and quiches are all made to incredibly high standards using the best ingredients money can buy: French cream, Valhrona chocolate and only the freshest fruit. Each of Belle Epoque's cakes are made individually by pastry chefs at the top of their game and are all hand finished. Take a trip over to our favourite, the newest Islington shop, and order the Belle epoque itself, created by Rousseau for his then-girlfriend 15 years ago. Classic flavours of orange infused creme brulee are encased in a decadent dark chocolate mousse and there's crunchy orange streusel, praline and a chocolate sponge for contrast. It's all finished with a chocolate mirror glaze and decorated with crunchy pearls and the shop's signature logo. Phew! No wonder she's now his wife.
Yes, we know Biscuiteers really specialise in, er, biscuits. But look, their cakes are pretty damn delicious too. If you're after an an extra special occasion cake then you can't go wrong here, and any birthday, baby shower, corporate gifting or wedding cake is going to be pretty great. From triple layered sponges to ultra-traditional fruit cakes, each order is hand made by the talented Biscuiteers team, covered in moreish buttercream before being topped with fondant and hand iced to perfection. And that's what Biscuiteers do best really; if you're after something properly personalised, with spot-on bespoke illustrations for business or pleasure (their Peter Rabbit and Little Miss Sunshines are adorable) these are your guys. We've had many a Biscuiteers gift over the years and they've always been beyond beautiful.
+
If you're not in the market for a giant celebrtion cake then do peruse their range of macarons, cupcakes and mini (they're not mini!) cakes.
+]]>Victorian Prophecy: 'Crystal Palace Will Be Destroyed'http://londonist.com/london/history/crystalpalacedestroyedhttp://londonist.com/london/history/crystalpalacedestroyed#commentsTue, 27 Jun 2017 11:32:43 +0100http://londonist.com/?p=6083cfbec06223fda24c
+
+
Crystal Palace on fire, 30 November 1936. Public domain
+
+
London was doomed by its own progress. July 1866 and an anonymous scribe wrote to the Argosy newspaper with his unique vision of apocalypse, brought about by too much tunneling and engineering.
+
"Can you escape a shuddering thrill of blow-up-iness and collapse-and-smash-iness?," he writes, in the kind of language that would never find its way into The Times.
+
"I cannot. We pity people who live in volcanic and earthquaky [sic] countries. But what if civilisation is coming to similar complexion. What if London, when the population is, say five millions, and it is engineered all over, above, below, and in the middle, should explode?"
+
The author has a particular beef about electricity. At the time, electricity was still a novelty. It would be 15 years before the first electric street lighting, on Holborn Viaduct and the Embankment, and nobody had it in their homes.
+
"Electric agency will probably be more used than it is now, and in ways not anticipated by the vulgar. Now conceive all London electrified; all the gasometers exploding; all the water-pipes bursting; all the plugs up, and the turnkeys gone mad or crushed; all the railway arches falling in, and all the trains smashing down among the omnibuses and cabs and people! What a catastrophe!”
+
+
And on the raving goes. But, then, we’re offered this choice piece of prophecy:
+
"The crash would be sure to climb up to Sydenham; the Crystal Palace itself must go, and what a noise all that glass would make, falling in! It would be like the smashing of a kitchen dresser to the falling of a house."
+
The Crystal Palace was utterly consumed by fire almost exactly 70 years later. On the night of 30 November 1936, a devastating conflagration ripped through the building, and it would indeed have sounded like the smashing of a kitchen dresser. The cause was never established, but an electrical fire — as our Victorian seer suggested — is a strong possibility.
+
+
The remains of the Crystal Palace following its destruction by fire in 1936. Public domain.
+
+
Eerily prescient? Not really. The Crystal Palace was one of the marvels of its day. It would be natural to choose it for a symbol of destruction in a piece like this — much as you might damn The Shard or London Eye if you were to fantasize about London's destruction today.
+
In any case, our correspondent immediately renounces all claims of being a reliable prophet with his final prediction. He also has it in for the Victoria Tower, tallest tower in the newly built Houses of Parliament.
+
+
One of Rodin's Burghers of Calais helpfully points out the Victoria Tower
+
+
"...but one thing will happen in our time. The Victoria Tower will "settle" and fall down. That I do distinctly prophesy. I have watched that tower like a father; and it has most distinctly the physiognomy of an edifice that contemplates self-destruction. Do you laugh? Very well. Stone the prophetic man, do! You will build me a tomb some day."
+]]>Ticket Alert: See The Skyline From London's New Ziplinehttp://londonist.com/london/things-to-do/ticket-alert-see-the-skyline-from-london-s-fastest-ziplinehttp://londonist.com/london/things-to-do/ticket-alert-see-the-skyline-from-london-s-fastest-zipline#commentsTue, 27 Jun 2017 10:43:59 +0100http://londonist.com/?p=01008a6be96630b356f0
+
+
Calling all adrenalin junkies: you'll be able to get your fix from a new zipline coming to London this summer.
+
For 12 weeks, Zip World London will pitch up in Archbishop's Park, next to Lambeth Palace, between Westminster and Lambeth bridges on the south bank. Those brave enough to have a go will launch themselves from a tower 35 metres above the ground, before making the 225 metre descent back to earth.
+
It claims to be "the biggest, fastest city zipwire in the world". We're promised a chance to see the likes of the London Eye, Houses of Parliament, the Gherkin and The Shard — although from the mock-up above, it looks like you'll be travelling away from, rather than towards, most of London's skyline landmarks.
Zip World London opens on 6 July for 12 weeks. Tickets need to be booked in advance (and will probably sell out), costing £22.50 for an adult/£16.50 for a child.
+
+]]>Museum Of London's Next Exhibition Will Reveal The City At Nighthttp://londonist.com/london/art-and-photography/london-at-nighthttp://londonist.com/london/art-and-photography/london-at-night#commentsTue, 27 Jun 2017 10:01:23 +0100http://londonist.com/?p=28e4716325786c720dcc
+
London in the sun is all well and good, but let's not forget it's often at its best in the thick of night.
+
200 photos and film clips from the 19th century to the present day form part of Museum of London's next major exhibition, which focuses on the city's nightlife.
+
London Nights will feature photos from renowned photographers including Bill Brandt, Alvin Langdon Coburn and Rut Blees Luxemburg, as well as lesser-known artists.
+
+
Buckingham Palace from the north east at night. George Davison Reid
+
+
Split into three parts, the exhibition will also cover the darker side of the capital at night, bringing visitors out of their comfort zone by alluding to the fear of the unknown, including the blackout of the Blitz.
+
+
Night meeting at the Blackfriars Shelter c.1910
+
+
The final part of the exhibition will look at Londoners working and playing in the city after dark, including the commute home, those clocking on for the night shift, and, of course, people heading for a night out.
+
+
A group of teddy boys outside Burger Bar 1962 (C) Henry Grant_Museum of London
+
+
Anna Sparham, Curator of Photography at the Museum of London, said
+
Through powerful photography London Nights will explore everything from the twinkling lights and buzzing nightlife to the darker, more uncomfortable vulnerability that sometimes arises in the urban, or suburban night environment.
+
A programme of themed events will run alongside the exhibition. The bad news: you'll have to wait a while to see this — it doesn't start until May 2018.
+
+
Trafalgar Square and St Martin in the Fields 1920 to 1933. Photograph by George Davidson Reid
+
+
London Nights will run at Museum of London, 11 May-11 November 2018.
+
+]]>Life At The Tower Of London Revealed In Fascinating Bookhttp://londonist.com/london/life-at-the-tower-of-london-revealed-in-new-bookhttp://londonist.com/london/life-at-the-tower-of-london-revealed-in-new-book#commentsTue, 27 Jun 2017 10:00:39 +0100http://londonist.com/?p=6ec00d0759d87882c93e
+
This fascinating book about the Tower of London offers a personal glimpse of the ancient fortress.
+
In a very unobtrusive way, Chris West made sure that he was present at every event at the Tower — large and small — during 2014 and 2015. He has captured the thoughts of those who live and work there, from the Yeoman Warders to the Chaplain, to the Constable, to the curators and the families of Tower residents.
+
Over the years, many histories have been written about the Tower and the great events that have occurred within its walls, but this is a record of life today, proving that the Tower of London is living history and not just a relic of the past. Below we reproduce some abridged extracts from Chris's book.
+
21 January: Sir Winston Churchill’s Memorial Wreath
+
+
This wreath of laurel leaves, surmounted by the iconic ‘V’ for Victory symbol in gold, has been specially designed and made by the Royal Poppy Factory and is to be laid on the water of the River Thames, opposite the Houses of Parliament, to commemorate the culmination of Winston Churchill’s state funeral on 30 January 1965. It is kept close to the altar in St Peter ad Vincula — the Tower's church — until collection on the 30th.
+
1 February: Saint Peter ad Vincula Morning Service
+
+
The congregation was joined by the Royal Military Police Association and the RAF for their annual services. Many other forces associations use St Peter ad Vincula similarly. The form varies — veterans wear their medals and some gather with their families and friends in the chapel, while others parade and march behind their regimental colours across the Broadwalk, processing to the Chapel. Younger relatives or partners may also wear the medals, but on the right breast, instead of the left. These people have a great sense of camaraderie and purpose, a reminder to us of the price people have paid and the need to honour and respect them.
+
18 March: Game of Thrones
+
+
The cleanup after Game of Thrones.
+
+
The world premiere of Game of Thrones season five was screened at the Tower, three weeks before it was released in the USA. The red-carpet premiere was organised by Sky Atlantic. The Director of Sky Atlantic in the UK, Zai Bennett, said:
+
I am delighted we will be hosting the world premiere of this epic show at the Tower of London. I can’t think of a more fitting venue to give what promises to be another unmissable series its big launch.
+
Considering the way in which the Tower is used for such promotions, I have listened to many different points of view about the best ways to utilise the Tower’s historical moat. Traditionalists argue that it should remain unspoiled, local residents bemoan its ugliness following use by marquees, and others champion the facility for marketing and promoting ‘today’s Tower’. Maybe it’s important to consider the excitement and straightforward joy for those able to visit the moat.
+
There are other upsides. Events such as this generate much-needed revenue for Historic Royal Palaces. Also, that period of muck and mud, when the marquees are removed, reminds us ‘after the poppies’, of Flanders fields, and of the 888,246 whom we should never forget.
+
7 April: Arrival of New Probationer Gary Thynne
+
+
The latest probationary Yeoman Warder, Gary Thynne, arrived to start his six months’ training, sporting a beard envied by many of his colleagues. Gary, still a young man, has passed through his 22 years’ good conduct and achieved senior rank in the Royal Artillery as Welfare Warrant Officer for two of their regiments.
+
Though he is no doubt well prepared, now comes a gruelling period of concentrated, focused training as a probationer. For six months he will be immersed in learning ‘the story’. During this time, he must live alone at the Tower, away from his wife. He will be transformed into a polished, entertaining expert specialist performer and speaker about the Tower of London.
+
21 May: The Ceremony of the Lilies and Roses
+
This famous annual event is held in the Wakefield Tower and attended by the provosts of Eton College and King’s College, Cambridge. They pay homage to King Henry VI, who founded both their colleges, by laying their college emblems (lilies and roses respectively) on the spot where the King was allegedly murdered on 21 May 1471. Invitations are limited because of the confined space, so I greatly appreciated my own invitation.
+
17 July: Harley Davidsons at the Tower
+
Quietly walking along Tower Wharf, my eyes nearly popped when I saw 50-plus Harley Davidson motorbikes roaring in through the East Gate. I watched, agog, as I could hear them making their way up the hill and onto the Broadwalk. All was well; Yeoman Serjeant Peter McGowran was there and smiling. David Hutchinson belongs to the 1066 (topical) chapter of the ‘Harley Owners Group’, based in Sussex. Moreover, he is brother-in-law to Canon Hall, who had obtained permission for them to visit.
+
+
According to David: "On a previous visit, some of us gathered together for a photo around my brother-in- law’s splendid Morgan (known affectionately as Mr Toad). This time, as we drove off, we were stopped from leaving at the gate. Most embarrassing: the volume and vibration of the assembled Harley exhausts had set off an alarm system, so we had to wait until we were given the all-clear. This was our third visit and we are not too sure whether we will be welcomed back!
+
My guess is that they have been forgiven.
+
25 August: Ghosts – Well, Why Not?
+
+
It was late evening as I passed the Byward Tower, close to the Main Gate, when I realised I had left my notebook behind in the Yeoman Warders’ Bar, at the far end of Water Lane. On returning, yes, I was thinking about the eerie spookiness of the Tower at night. I looked to the right (towards the doctor’s surgery and Old Mint) and there, peering through the window, was an illuminated white, shrouded figure. I hadn’t noticed before, but this gadget is permanently displayed in the window and projects various images. It can be switched on at times to suit, so I assume that someone had spotted an easy victim. OK, guys, it was a great scam and, yes, I nearly jumped out of my skin. Ho ho ho!
+]]>Things To Do Today In London: Tuesday 27 June 2017http://londonist.com/london/things-to-do/things-to-do-today-in-london-tuesday-27th-june-2017http://londonist.com/london/things-to-do/things-to-do-today-in-london-tuesday-27th-june-2017#commentsMon, 26 Jun 2017 19:00:12 +0100http://londonist.com/?p=c1daf1c5fdd29a8c6b50
+
VIRTUAL REALITY: There are two kinds of people in the world: those who love VR, and those who haven't tried it yet. Book a 20 minute slot in this VR experience in a pub, and see if you can survive the zombies long enough to meet the giant spider — or if that's not your thing, try one of the other experiences available. The Four Thieves (Clapham Junction), £15, book ahead, various times
+
STREET GYM:Urban areas shouldn't just be nice to look at, they should be places where are are inspired to train. Take to the street for this free urban physical adventure taster session, where architectural features, gradients and street furniture become workstations for sets and reps. Somerset House, free, book ahead, 12.30pm-1.15pm
+
TERRACE TIPPLES: What better way to celebrate the summer than with a fiesta on the terrace, complete with free flowing drinks, cool beats and Argentinian canapés? Round off London Food Month in style. Gaucho Broadgate, £49.95, book ahead, 6pm
+
MODERNISM: Explore the readings of Modernism through a non-Western lens, and re-examine the conventional Western narrative of this unique style of architecture. You might be surprised by some of the fantastic examples of Modernist architecture from places rarely featured, such as Kenya, Zambia, China and India. Royal Institute of British Architects, £9, book ahead, 6.30pm-8pm
TALK AND WALK: Cover 2000 years of history in two hours in Wren, Romans and Liveryman. This walk will take you around the Square Mile as you hear stories of the Romans and Italians, the hard-hitting Great Plague and Great Fire, and how the city was raised from the ashes once more by Sir Christopher Wren. Start at Tower Hill station, £2/£9/£12, book ahead, 6.30pm-8.30pm
+
FASHION FORWARD: Make a one-of-a-kind hard shell party clutch bag, or surprise someone with a personalised gift. In this workshop you can choose from a selection of designer and vintage fabric and add a bit of sparkly embellishment too. Dotty's Tea House (Carshalton), £49, book ahead, 7pm-9.30pm
+
UNNECESSARY DETAIL: Enthusiasts, scientists, miscellaneous experts and comedians are invited to talk about whatever they want, in whatever level of detail they want... but be warned, you revoke all rights to complain about what they choose to bang on about by attending this event. Backyard Comedy Club (Cambridge Heath), £11, book ahead, 7.30pm-10.30pm
+
POETRY EVENING: Poetry slam winner and Glastonbury performer Vanessa Kisuule headlines this poetry evening. Those with something to say can perform their own poetry in a five minute slot — those who don't can simply sit back and take in the words. Love & Dye (Raynes Park), free, just turn up, 8pm
+
FREE COMEDY: You like laughing, right? And you like free things? Then we're set. Barry Ferns presents a mix of comic favourites performing longer sets for a laugh out loud evening. The Camden Head, free, just turn up, 8pm-10pm
+
+
Sponsor message
+
Relive your childhood on Alexandra Palace's giant waterslide
+
+
Move over kids: adults can take to the slope on this giant waterslide, which is coming to Alexandra Palace's annual Summer Festival on 22 July.
+
As well as this, there’ll be an outdoor cinema and three live music stages, with The Craig Charles Funk & Soul Club headlining. Check out all the craft beer and street food that will get your mouth watering —whether you fancy ribs and a pint, or churros and a cocktail, you’ll be spoilt for choice.
+
Bring along the whole family — the kids will enjoy theatre performances and craft workshops, and may even fancy joining in with Big Fish Little Fish’s Family Rave. Get the lowdown on what’s happening at this free entry festival here.
+
+
Art review: little devils
+
+
Sitting in circles, climbing up chains or hanging limply from walls. These cutesy devils by Permindar Kaur are all over the gallery. It’s a bit like walking through a shop filled with eerie dolls, harmless yet somehow threatening at the same time. Permindar Kaur: Black and Blue at New Art Projects, 6D Sheep Lane, E8 4QS. Until 1 July, free. ★★★★☆ (Tuesday-Saturday)
+
Food review: hot chicken of your dreams
+
+
It's named after a bad, bad man — folklore-outlaw figure Stag O'Lee — but this Fulham soulfood joint is serving up a seriously good menu. Everything bar the fries is made from scratch in the downstairs kitchen, and that amount of TLC pays off in a big way. All the Southern Americana classics are there — collard greens with ham hock, spinach dip thick with cheese, cornbread, fried catfish... and what might be the best hot chicken you'll find this side of Nashville: it's definitely the best we've found in London. Food to warm the heart comes coupled with a menu of bourbon, rye and moonshine to get you fired up. Cocktails are a strong suit, with the Southern Hospitality an enamel mug of sweet tea vodka, Southern Comfort and tart, homemade lemonade — the sort of cocktail you want to drink on a sultry day on a shady porch. Throw in good, bluesy music and service with Southern warmth, and we have a hunch we'll be spending a lot of time here. Real, ridiculously good soulfood in a soul-warming restaurant. Stagolee's, 453 North End Road, SW6 1NZ. ★★★★★ Lydia Manch
+
Theatre review: to go or not to go?
+
+
After Benedict Cumberbatch’s hit performance as the desperate Dane two years ago, it is his Sherlock opposite number Andrew Scott’s turn to play arguably the Bard’s most famous character. The leading man is ably assisted by Truly, Madly, Deeply’s Juliet Stevenson as Gertrude and Jessica Brown Findlay (Downton Abbey’s Lady Sybil) as Ophelia; all three are utterly mesmerising. Director Robert Ive borrows heavily from the Ivo van Hove Shakespeare stylebook, employing recorded and live video techniques similar to those used by the Belgian in his mammoth productions. Scott’s nuanced and passionate performance amid a highly talented ensemble make this one of the theatre hits of the summer. Hamlet. Harold Pinter Theatre, Panton Street, SW1Y 4DN. £15-£95. Until 2 September. ★★★★★ Franco Milazzo
+
Good cause for the day
+
+
ONE MILLION STEPS: Why not walk instead of taking the tube, and be on your way to completing the One Million Step Challenge in aid of Diabetes UK. Starting on the 1 July and running until 30 September, participants are encouraged to push themselves out of their comfort zone and take an average of 10,000 steps a day. Free, 1 July-30 September
+
+
Funzing
+
Fun things to do with our friends and sponsor Funzing.
Scientific research is resuming on how psychedelics affect the weirder aspects of human consciousness. This talk from Dr David Luke engages in current study into pyschedelics and their historical use in shamanic rituals. Be prepared, you might leave with more questions than answers. Get tickets
+
Every January you do the same thing. You make a New Year's resolution to lose weight, be thriftier, quit smoking or possibly even to start exercising. Yet how many of us find ourselves in the exact spot we started in once the month is up? This talk by Dr Gabija Toleikyte, explains why the brain resists changing habits of a lifetime. She'll also explain how to create long lasting change, by working with your brain rather than against it. Get tickets
+
What would you say face-to-face to Saddam Hussein? How would you feel digging up the mass graves of Kosovo? Jonathan Tait-Harris will share experiences from his jobs as a policeman, soldier, war-crimes investigator and adviser to UK and Iraqi governments. £10 Get tickets
+
+
+
+
+]]>King's Road Chelsea Station Scrapped From Latest Crossrail 2 Planshttp://londonist.com/london/transport/kings-road-chelsea-station-scrapped-from-latest-crossrail-2-planshttp://londonist.com/london/transport/kings-road-chelsea-station-scrapped-from-latest-crossrail-2-plans#commentsMon, 26 Jun 2017 17:34:26 +0100http://londonist.com/?p=1d6ab5d3c08e855fc032
+
A controversial station at King's Road Chelsea, set to form part of Crossrail 2, has been dropped from the latest business case for the planned rail route.
+
In the business case which TfL sent to the government in March, and seen by City AM, the latest route for the railway running across London and the south east has left out the King's Road Chelsea station that had been planned in between Clapham Junction and Victoria.
+
The proposed station had proved divisive, with proponents saying Underground stations in the area will need the support as passenger numbers are set to swell in the next decade.
+
Those opposing the station however, including actress Felicity Kendal and broadcaster Loyd Grossman, were concerned about the disruption it would bring, and worried it would wreck the intimate village atmosphere of Chelsea.
+
It’s not the only option that has been scrapped in the revised route either, with floated stations at Turnpike Lane and Balham getting the boot too in favour of Wood Green and Tooting Broadway options.
+
+
The changes aren’t concrete ones though and the route hasn’t been committed to. For the purpose of the business case, TfL needed to put together a case scheme option against which to test alternatives, reflecting the recommendations made by the National Infrastructure Commission, set up by the government to oversee infrastructure projects.
+
During its 2015 consultation, TfL offered up two options between Seven Sisters and New Southgate. One proposed went via Turnpike Lane and Alexandra Palace, while the other would call at Wood Green only.
+
The majority of respondents preferred the former, but the London Borough of Haringey favoured the latter, saying it would provide more economic benefits.
+
Another toss-up was between Balham or Tooting Broadway, which TfL hopes will help relieve one of the most crowded parts of the Tube network – the Northern Line section from Balham to Stockwell. Tooting got the go-ahead in TfL’s business case, though it did note that investigations carried out early last year found ground conditions around Tooting would make construction “challenging”.
+
And Tooting proved a more popular choice in consultation, despite the fact concerns have been raised over the fate of Tooting Market. Much of the space will likely be subject to a compulsory purchase order if Crossrail 2 comes to the area.
+
Michele Dix, TfL’s managing director for Crossrail 2, said:
+
No decisions have yet been made. We continue to discuss with government all aspects of the project and are committed to holding a full public consultation on our plans.
+]]>Fancy Saving On Your Travel Costs?http://londonist.com/london/fancy-saving-on-your-travel-costshttp://londonist.com/london/fancy-saving-on-your-travel-costs#commentsMon, 26 Jun 2017 14:30:03 +0100http://londonist.com/?p=7f0a93d9e3d7dd7151cd
+
This is a sponsored article on behalf of CommuterClub.
+
+
Travelling in the UK isn't getting any cheaper — in fact, the price keeps on rising every year. Luckily, CommuterClub is here to help you save when it comes to getting to and from work.
+
With CommuterClub, you'll get all the benefits of a yearly travelcard, but with the regular and manageable payments that come with a monthly one, meaning that you could save up to £300 a year. Even better, for a short time Londonist readers can get £20 off when booking here.
+
+
Let's face it —monthly travelcards are a much more flexible way to pay for commuting, but they can be a lot more costly than the annual alternative. Although cheaper, the annual travelcard means paying a huge lump sum up front.
+
CommuterClub is the answer to all your travelling woes, as they offer the chance to get a yearly travelcard, but pay for it in 11 monthly instalments — the twelfth month will be absolutely free.
+
+
All in all, you could save yourself £300 if you buy with CommuterClub — a decent saving that could be put towards a holiday somewhere away from the bustling capital.
+
If you think that sounds too good to be true, you'll be even more blown away by the Gold Card that all CommuterClub customers receive — this gives you 1/3 off National Rail travel, as well as 2-for-1 on loads of London attractions.
+
+
Now is the time to get on board with CommuterClub — from 26 June - 1 July, they are running a Festival of Summer Savings to make sure even more dosh stays in your pocket. As part of this, Londonist readers can get £20 off when booking here.
+
CommuterClub are also currently running a competition — if you're feeling lucky, enter here to win free travel this summer for a whole four months.
+
It's a no-brainer — regular payments, better value and major money saving is on the cards if you join CommuterClub.
+
+
+
Representative example: Credit limit: £1200. Interest £67. Total payable: £1267 in 11 monthly instalments of £115. Representative 10.6% APR. Interest rate 5.6% (variable)
+]]>Things To Do This Weekend In London: 1-2 July 2017http://londonist.com/london/things-to-do/things-to-do-this-weekend-in-london-1-2-july-2017http://londonist.com/london/things-to-do/things-to-do-this-weekend-in-london-1-2-july-2017#commentsMon, 26 Jun 2017 13:15:00 +0100http://londonist.com/?p=d7334e7c19e02424024f
+
FOOD FESTIVAL: Bask in the sunshine and sample a range of delectable treats as this walking banquet of gourmet traders descend on Ealing Common. A bandstand provides the soundtrack to the afternoon while you globe-trot between cuisines — be sure to turn up hungry. Ealing Common, £3 entry, just turn up, 1-2 July
+
CITY AGRICULTURE: Ditch city life for the weekend and enjoy the delights of the countryside. A fresh produce marquee, an equestrian show, fairground rides, a birds of prey display and a rare sheep show all feature in this agricultural festival right in the city. Mudchute Park and Farm, free, just turn up, 1-2 July
+
GLUTEN-FREE:London's original gluten-free street food celebration returns to Camden. Featuring innovative and delicious dishes, enjoy the best in gluten-free cakes, bread, desserts and worldwide foods. Jamestown Road (Camden), free, just turn up, 1-2 July
+
RIVERS WEEK: This week-long festival celebrating London's waterways comes to an end this weekend. The full programme is here — pick from walks, talks, river dipping and more.26 June-2 July
+
PRIDE: The parade isn't until next weekend, but there are plenty of Pride in London events this weekend including a cycle ride, video game day, museum tour, Victoria Park picnic and much more. 24 June-9 July
+
+
Sponsor message
+
Dance to The Craig Charles Funk & Soul Club at this FREE summer festival
+
+
There's a day of music, theatre and craft beer galore at Alexandra Palace on 22 July. The free entry summer festival boasts three live music stages, delicious street food and theatre performances for all the family.
+
Book tickets for the outdoor cinema where Austin Powers will be screened under the stars against a backdrop of stunning views, or get ready for a show of colourful acrobatics thanks to Jackson's Lane. With children's activities, silent discos, a giant waterslide, and a headline act of The Craig Charles Funk & Soul Club, this festival is not to be missed.
STOCKWELL FESTIVAL: Back after a two-year hiatus, Stockwell Festival brings together an eclectic mix of local street food, crafts and activities. There's no better way to witness the unique creativity, energy and diversity of the local area. Larkhall Park, free, just turn up, 12pm-6pm
+
HENDRIX'S FOOTSTEPS: On the first in a series of tours about the rock star, begin at Jimi Hendrix's flat on Brook Street and mosey over to Mayfair and Marble Arch areas as you visit the places that meant a lot to him. Start at 23 Brook Street, £15, book ahead,12.30pm-2pm or 3.30pm-5pm
+
THEY DON'T SING: This Finnish choir is an odd one — they don't sing a single note. Join them on a four-hour workshop and learn their unique style, shouting, screaming and bellowing excerpts from a diverse range of texts. Royal Festival Hall, £12, book ahead, 1.30pm-5.30pm
+
ICANDANCE: icandance is a charity which offers dance and performance opportunities to children and young people with varying disabilities. Today, watch 14 year old Ellie, who has cerebal palsy, take to the stage with her heroes, BalletBoyz in solo section of the School of Rock inspired performance. Artsdepot (North Finchley), £13, book ahead, 2.30pm
+
PUPS PICNIC: Bring your own blanket, food and dog for a pawsome meet up on Hampstead Heath. This afternoon is filled with dogs, delicious food and gorgeous views, and is the perfect opportunity to get to know other dog lovers in the area. Parliament Hill, free, book ahead, 2.30pm-4.30pm
+
CRAFT BEER:A ticket to the Craft Beer Cares' inaugural beer festival will net you a keepsake glass and tokens to spend on the huge variety of beer on offer. The festival celebrates all the good that is being done in the craft beer industry while raising money for charities Mind and the Newman Trust. Brew Club, 38-40 Upper Clapton Road, £14.40, book ahead, 6pm-11.30pm
+
ART NIGHT: Some of the world's leading artists transform the City with free art, performance and music. Taking place in locations such as the Bascule Chamber at Tower Bridge and the Masonic Temple at Andaz Liverpool Street, it's a great chance to explore London's history, culture and architecture. Various locations around the City of London, free, just turn up,6pm-6am
+
LA LA LAND: London has had pretty good weather recently, but it's still not quite LA, is it? Experience the glitz and glamour of the jazz soaked City of Angels with a screening of Damien Chazelle's award-winning film La La Land. St John the Evangelist Church (South Norwood), £20, book ahead, 7pm-11.30pm
SUMMER STREETS: Every Londoner's wish comes true, as Regent Street becomes pedestrianised for a day, in a bid to encourage visitors to relax, unwind and enjoy the fantastic range of entertainment along the street. This year's theme of culture, style, wellness and food and drink promises a bold day out. Regent Street, free, just turn up, all day
+
HAMPSTEAD BEACH: JW3 Jewish Centre in North Finchley is getting a beach for the summer. Golden sand, tasty food and cocktails set the mood for long evenings of sun, fun and holiday vibes. JW3, free entry, just turn up, 9am-10.30pm
+
CITY SOUND: This two mile guided walk explores the City of London through the medium of sound. From church bells to road crossings, this sonic tour will introduce you to sounds of the past, present and future, and show you how London's soundscape is changing through time. St Paul's tube, £18, book ahead,11am-1.15pm
+
MODERNIST HAMPSTEAD: Discover the best of the revolutionary Modernist architecture in Hampstead on the guided walk, from the 1930s Sun House by Maxwell Fry and the the iconic Isokon flats in Belsize Park. Mainly echoing European design trends, eighteenth-century design was also a strong influence for architects of these buildings. Hampstead Station, £9-£12, book ahead, 11.30am-1.30pm
+
EID FESTIVAL: As Ramadan draws to a close, everyone is invited to come together in Trafalgar Square for entertainment and attractions for the whole family to enjoy. With a global food festival, live music, arts and crafts and calligraphy, there is no better way to celebrate Eid. Trafalgar Square, free, just turn up, 12pm-6pm
+
LET ME TAKE A SELFIE:Unprecedented social pressure to look slim, prosperous, happy, extroverted and popular has led to an increase in depression and suicide. This talk charts the ride of narcissism and the selfie generation, taking us back to its origins on the shores of Ancient Greece. Conway Hall, £3, book ahead,2pm-3.30pm
+
WOODY ALLEN: Spend a heady night listening to New Orleans style jazz in the splendour of the Royal Albert Hall in a one-off concert headed by none other than American director Woody Allen. Allen once famously missed accepting a 'Best Picture' Academy Award as he was performing a concert on the same evening. Royal Albert Hall, various prices, book ahead, 4.15pm
+
DRUNKEN PERFORMANCE: You've heard of Sh*t-Faced Shakespeare, but how about its sibling, Sh*t-Faced Showtime? Enjoy a performance of The Wonderful Wizard of Oz with one actor selected at random to drink themselves silly before the performance. Sounds like a recipe for disaster, and a whole lot of laughs. Leicester Square Theatre, £15, book ahead, 8pm
+
The weather is looking great too, so why not take a look at our pub database and find a nice beer garden to kick back in?
+
+
Funzing
+
Fun things to do with our friends and sponsor Funzing.
Scientific research is resuming on how psychedelics affect the weirder aspects of human consciousness. This talk from Dr David Luke engages in current study into pyschedelics and their historical use in shamanic rituals. Be prepared, you might leave with more questions than answers. Get tickets
+
Every January you do the same thing. You make a New Year's resolution to lose weight, be thriftier, quit smoking or possibly even to start exercising. Yet how many of us find ourselves in the exact spot we started in once the month is up? This talk by Dr Gabija Toleikyte, explains why the brain resists changing habits of a lifetime. She'll also explain how to create long lasting change, by working with your brain rather than against it. Get tickets
+
What would you say face-to-face to Saddam Hussein? How would you feel digging up the mass graves of Kosovo? Jonathan Tait-Harris will share experiences from his jobs as a policeman, soldier, war-crimes investigator and adviser to UK and Iraqi governments. £10 Get tickets
+
+
+
+
+]]>BP Portrait Award Is Back - But It's Much The Samehttp://londonist.com/london/art-and-photography/portraits-abound-in-this-annual-free-exhibitionhttp://londonist.com/london/art-and-photography/portraits-abound-in-this-annual-free-exhibition#commentsMon, 26 Jun 2017 13:00:07 +0100http://londonist.com/?p=05c70db88433d45583a5
+
+
A 'double portrait' of the artist's wife who was eight months pregnant at the time. Copyright: Thomas Ehretsmann
+
+
The BP Portrait Award is a stalwart in the art calendar. This free exhibition brings together portrait painters from across the world to compete for the top prizes.
+
This year there were over 2,500 entries from across 87 countries, which have been whittled down to the 53 on display at the National Portrait Gallery.
+
+
This painting of a breastfeeding mother, the artist's wife, was the overall winner. Copyright: Benjamin Sullivan
+
+
While the painting quality of the entries is always to a high standard, the prize itself is quite staid. We've suggested how it can be improved, but this year is more of the same.
+
There are some exceptions, including one entry where the background is reflective, thus making the subject of the portrait into one of the crowd of gallery-goers.
+
+
Vulnerability and determination meet in the third prize winner. Copyright Antony Williams.
+
+
But on the whole it's all very same-y and not much stands out in this year's prize.
+
BP Portrait Award 2017 is on at National Portrait Gallery until 24 September. Entrance is free.
+
+]]>7 Things To Do At Alexandra Palace's Summer Festivalhttp://londonist.com/london/7-things-to-do-at-alexandra-palace-s-summer-festivalhttp://londonist.com/london/7-things-to-do-at-alexandra-palace-s-summer-festival#commentsMon, 26 Jun 2017 12:00:05 +0100http://londonist.com/?p=9ca31f17ecf0acdc1dc1
+
Alexandra Palace's Summer Festival is back, and this year promises to be the best one yet. Head there on 22 July for theatre performances, street food and craft beer.
+
Be sure to check out the giant waterslide and book tickets for the outdoor film screening of Austin Powers. If you're up for some serious dancing, grab a prime spot for the Craig Charles Funk & Soul Club set.
+
+
+
There'll be so much to do and see, so we've put together this guide to 7 things you won't want to miss on the day.
+
1. Giant waterslide
+
+
Grab a dinghy and get ready to be a big kid, as there's a giant waterslide popping up for the Summer Festival. The grounds of Alexandra Palace will host this 100m waterslide for one day only — it'll be popular, so book before your visit, and prepare to get wet.
+
2. Outdoor cinema
+
+
This has got to be one of the best places to settle down and watch a blockbuster. Austin Powers will be screened under the stars on the slopes. Grab a beer and a blanket, and enjoy this example of comedy gold on a huge pop-up screen against the stunning backdrop of the London skyline. Tickets for this are sure to sell out so get them while you can.
+
3. Silent disco
+
+
Step inside the secret forest, pop on your headphones and prepare for some serious moves at this disco with a difference. There are eight sessions to choose from, and sets include Cartoon Classics, Summer of Love, and guilty pleasure Club de Fromage.
+
4. Theatre
+
+
There'll be some fantastic performances thanks to Chickenshed and Jackson's Lane, with dedicated shows for kids as well. Lost in Translation Circus, Cirque Bordello, is the offering from Jackson's Lane, which will see colourful and chaotic acrobatics and aerial performances.
+
5. Family raves
+
+
Why should the adults have all the fun? Big Fish Little Fish family raves are for all ages. With sensory dancefloors, summer of love vibes and plenty of fairy lights, this is techno for the tots. There'll also be hula hoop workshops and craft areas, plus the all important licensed bar — grab your tickets now.
+
6. Live music
+
+
The Summer Festival will have three live music stages offering everything from Dat Brass to JJ SoulX and Let The Drum Beat. Listen to classic songs reworked, as Cash Cows put a quirky spin on tunes we all know and love. If folk is more up your street, be sure to keep Ogre Melodies on your radar. The best bit about all the music is that it's completely free. Now this is the sort of festival we like.
+
7. Street food and craft beer
+
+
A festival wouldn't be complete without lots of delicious food and drink to choose from — pizza from Arancina, BBQ delights from Bob the Griller, and Oli Baba's legendary halloumi fries are among the vast selection of traders, which have options for veggies, vegans and fussy kids alike. With 20 different craft and cask ales as well as plenty of Pimms and cocktails, we'd come with a stash of cash if we were you.
+
Convinced? Alexandra Palace's Summer Festival is set to be an epic day out — check out the schedule full schedule here, and be sure to book for the ticketed events.
+
+]]>A Spinning Artwork Hovers Over St Pancrashttp://londonist.com/london/art-and-photography/a-spinning-artwork-hovers-over-st-pancrashttp://londonist.com/london/art-and-photography/a-spinning-artwork-hovers-over-st-pancras#commentsMon, 26 Jun 2017 11:30:10 +0100http://londonist.com/?p=a574070221be703ed94a
+
+
Next time you've got a few minutes to kill at St Pancras station, head up to Platforms 1-4 (or the Eurostar platforms, if you're lucky enough to have a ticket), and look up to the clock behind you to see the station's new artwork.
+
Three large metal arms spin slowly while the blue lattices on each arm arrange themselves both in and out along each arm.
+
+
A close up of the new artwork. Image courtesy the artist, Royal Academy of Arts and Terrace Wires.
The lattice structures move to the inside of the arms. Image courtesy the artist, Royal Academy of Arts and Terrace Wires.
+
+
The new addition by Conrad Shawcross has been compared to a wind turbine and a fidget spinner. Our opinion is it's not Shawcross's finest work as his strength lies in complexity, and this looks like a much simpler work — but it's still great to have something to look at while waiting for a train.
+
+
Here they are extended to full width. Image courtesy the artist, Royal Academy of Arts and Terrace Wires.
+]]>The London Areas That Don't Want To Be In London At Allhttp://londonist.com/london/features/areas-that-don-t-want-to-be-in-londonhttp://londonist.com/london/features/areas-that-don-t-want-to-be-in-london#commentsMon, 26 Jun 2017 11:00:06 +0100http://londonist.com/?p=7aa9299aa57b7cd988fc
+
We love London. Heck, we love it so much we run a website dedicated to it. Some other people... let's just say they're not huge fans. Time to run through the London neighbourhoods who'd like to divorce themselves from the city.
+
Croydon
+
Croydon has applied to become its own city six times. You feel like after five, one would get the message and move on, but Croydon hasn't. Let's clarify, this is six times and counting. Don't put it past the wily south London borough to give it another go in the near future.
This article in the Croydon Advertiser laments the fact that city status hasn't been granted, has a particularly poignant quote from local historian John Hickman.
+
Croydon should become a city because it has all that a city requires.However, I think our big disadvantage is we are too close to London to be a city.
+
Lets examine this carefully. He uses the phrase "too close to London". Not: "we are already in London", or "being a London borough". No. These people are in denial. Having your own trams doth not a city make.
This one's a tad more divisive. As with most of the areas on this list, London subsumed Romford in 1965 through the London Government Act. Before then Romford was firmly entrenched in Essex and some haven't quite adapted to that change.
+
TV show The Apprentice stoked the embers of the debate by referring to Romford as Essex in a 2012 episode. Romford residents are firmly split down the middle as to whether they consider themselves Londoners or Essexonians. Some (correctly) point out that they're in a London borough, and pay council tax. Perhaps other just want a personal connection to TOWIE.
+
Even as time goes on, the media still refers to Romford as Essex. Evening Standard's property section used the incorrect "Romford, Essex" terminology in their 2015 guide to the area. The confusion rages on.
+
Orpington, Bromley and Biggin Hill
+
+
Admittedly, the rest of London doesn't have these. Photo: David Howard
+
+
+
These three neighbours contain many citizens just clawing at the chance to be in Kent. They don't seem to realise that not having a traditional London postcode, doesn't mean you're not in London. See an explanation of that below.
+
+
We'll excuse a couple of locals incorrectly believing they're in Kent, but the same cannot be said of the Post Office. The addresses for their Bromley branches all end in Kent. The way we see it, if you're in a London borough you're in London. Surely these are the people that are supposed to be setting an example. Shame on you Post Office, shame on you.
+
+]]>Londoners' Share Their Break-Up Storieshttp://londonist.com/london/features/londoners-break-up-storieshttp://londonist.com/london/features/londoners-break-up-stories#commentsMon, 26 Jun 2017 10:00:14 +0100http://londonist.com/?p=dfcfa3d0b2aabec20fc6
+
For every beautiful romantic moment at the blossom of a relationship just remember there's likely to be an equally awful break-up at the end. We asked our readers to send in their London break-up stories and here are some of our favourites:
+
Leave right now
+
Eli had a little help from a B-list pop star with his break up. "Back during the 2012 Olympics, they had a concert every night in Hyde Park. Just outside the fence separating the concert area from the rest of the park, I had a conversation with a girl where I told her that I didn't want to continue seeing her. Will Young was performing that night and this conversation, completely coincidentally, was happening while he was singing Leave Right Now. She was (understandably) upset and got up and slowly walked away right as the second chorus started."
+
An innocent mistake to be sure, but it's got us pumping out some Will Young at Londonist towers Eli, so thank you.
+
+
Dangers of subletting
+
Jasmine says she "had been dating a Northern Irish guy for over four years. I also had a German friend who was planning to move to London to study media (like my partner). I suggested they chat and she could stay in the flat while she sorted accommodation out."
+
"One month later I got dumped and replaced by said German friend. Quite a bitter pill to swallow, never been able to visit some areas of London afterwards, it all got a bit awkward."
+
A tough one to take for sure, but please don't let these two traitors put you off any parts of London. That's letting them win.
+
The masterstroke
+
"So I walked my girlfriend to Kingsbury tube and as the doors were closing I chucked a note on board saying we're done. Didn't hear from her again!"
+
That gem is from Danny. We're actually quite annoyed we've never thought of this ourselves, though we did once recommend something quite similar. It's incredible to think that there's a romantic movie that heavily relies on tube doors shutting — Sliding Doors — and this doesn't happen in it.
+
+
Ahh sliding tube doors. The perfect London break-up spot. Photo: chutney bannister
+
+
+
Just taking care of some last minute business before I go
+
Tony's ex left him in a non-confrontational but nevertheless determined style. "My girlfriend drove all the way from Earls Court to Slough at 4am to stick a post-it note on my front door telling me I was dumped because she was moving back to New York. And leaving on the 7am flight. I didn't get up until 8..."
+
Well clearly she didn't want to put either of you off any London locales by doing the deed in the city, which as we've seen above, can happen. She had no qualms with putting you off Slough however, which come to think of it, might not be the worst move in the world.
+
Play it off as laugh
+
"I got dumped at a restaurant in Covent Garden at our two year anniversary meal... half way through main course. I thought he was joking. He wasn't. We didn't have dessert."
+
That's seriously cold from Natalie's partner. However, not cold enough for ice cream as he's not a dessert guy.
+
+
Hammersmith's 'Spoons, The William Morris. Photo: SteHLiverpool
+
+
+
The tearjerker
+
Susan's one brought a tear to our eye. "I got dumped by my partner of 2.5 yrs who I thought I was going to marry. This happened while I was having treatment for cancer, two days after I'd been in hospital again. He lied about the fact he was seeing someone else; younger model obviously, who wasn't chemo-bald like me. And where did he choose to do this? Wetherspoons in Hammersmith. Classy."
+
Definitely an awful situation and we sincerely hope you're doing better Susan.
+
Prying ears
+
Elysse tells us: "Once I was in Abney Park Cemetery and overheard a couple going through a breakup. Not sure if that was the perfect location or if it just made things worse."
+
Thanks for keeping an ear out and sending in that one Elysse. Little known fact about Abney Park Cemetery is that it's where Amy Winehouse's Back to Black video was shot. Which, is a song about a break-up. Coincidence? We think not.
+
+
Melancholic museum
+
Dawn, "studied abroad in London from the US in the mid '90s. A day or two before Valentine's Day, I got a breakup letter from my boyfriend in the States. I was devastated. The next day our class went on a field trip to the British Museum. I remember being amazed at the collection but overwhelmed by sadness. Recently had the chance to revisit the museum with my husband (not the '90s boyfriend) and had a wonderful experience."
+
That's what we like to hear. Don't let anyone put you off the British Museum, it's just got so much great stuff.
"I once went on a date with a guy whilst living in London. He had a bright red mohawk and it wasn't the eighties. No second date. We bid adieu at Charing Cross. Still one of my favourite stations despite the unfortunate hair."
+
Rachael's date's transgression might've been forgiven were he to catching the Central line, but as it is that's truly disgraceful. We're with you Rachael.
+
If you've got any more London break-up stories, we'd love to hear them in the comments beneath.
+]]>Things To Do Today In London: Monday 26 June 2017http://londonist.com/london/things-to-do/things-to-do-today-in-london-monday-26-june-2017http://londonist.com/london/things-to-do/things-to-do-today-in-london-monday-26-june-2017#commentsSun, 25 Jun 2017 19:00:25 +0100http://londonist.com/?p=d48cae75949e692a1e04
+
DEREGULATION: Discover how the deregulation revolution brought us much of the technology and free expression that we take for granted today. From FM radio to the iPhone, these gadgets wouldn't exist if special interests and regulators had their way. Adam Smith Institute, free, book ahead, 6pm-8pm
+
GRAFFITI AND MEMORY: This panel discussion tackles the subject of graffiti and memory, and how they work in the context of the city. Featuring 100 Days of Leake Street, a presentation that shows changes on 10 different walls in a legal graffiti spot over 100 days. London Metropolitan University, free, book ahead, 6pm-8pm
+
MUSIC AND DANCE: The Barbican plays host to over 69 schools taking part in a two week programme of singing, instrumental and dance events. Performances from bands, vocal groups, choirs and orchestras feature, and this evening concert kicks off the event. Barbican, £7, book ahead, 6.30pm
+
DREAMS OF FREEDOM: Hundreds of young voices become one at a special concert inspired by Amnesty International UK's children's book Dreams of Freedom. Children's thoughts, opinions, ideas and dreams of freedom and human rights have been turned into a musical, theatrical performance of hope for a better world. Royal Albert Hall, £10-£25, book ahead, 7pm
+
VIDEO GAMES: Do video games have the solutions to some of our most complex scientific problems? From a game where players manipulate 3D proteins, to one where astronomers predict how complex star patterns appear, it certainly seems so. Museum of London, £12, book ahead, 7pm-8.30pm
+
FEMINIST STITCHING: Embroidery is not an activity for women stuck in their parlours in the 19th century, a point especially stressed in this workshop. Dedication, perseverance, care, skill, patience and creativity are all going to be needed as you stitch to success. Drink, Shop & Do (King's Cross) £39, book ahead, 7pm-9.30pm
+
MONDAY BLUES: It might be Monday, but that's no excuse not to kick back and enjoy some live music from talented jazz and soul musician James Junior. Having performed for Royal Family and the England rugby team, you're sure to be entertained. 100 Wardour Street, 8pm-10pm
Get 2-for-1 tickets for Dustin Hoffman season at BFI Southbank
+
+
It's Hollywood legend Dustin Hoffman's 80th birthday and BFI Southbank is celebrating by running a whole season of films dedicated to him. Join in on the party and catch the actor in hits such as All the President's Men and Midnight Cowboy.
+
There'll be classics including Rain Man and Tootsie, but also newer hits such as Roald Dahl's Esio Trot and Hoffman's directing debut, Quartet. In true celebratory spirit, BFI Southbank is offering two tickets for the price of one to see these epic films — simply enter the code LONDONIST241 when booking. Check out the full Hoffman line-up here.
+
+
Art review: abstract kites
+
+
Image courtesy Flowers gallery
+
+
This exhibition brings together five decades of abstract painter Richard Smith's work. The central installation looks like a series of kites painted, thus making abstract painting much more immersive than it could be placed on walls.Richard Smith at Flowers, 21 Cork Street, W1S 3LZ, free.Until 15 July ★★★☆☆ (Monday-Saturday) Tabish Khan
+
Food review: mini plates of goodness
+
+
The Bird In Hand may be a little out of the way, tucked down a side street in West Kensington, but it's a favourite with locals and once you know about it, you'll be telling all your friends. With terracotta hues and funky chic decor, it won't surprise you that they specialise in tapas style food to share, and great wine. Plates are small so ordering three per person seems to be the right balance, but delicacies such as padron peppers with paprika salt and pan fried seabass with saffron risotto and rice will certainly tickle your tastebuds. The Bird In Hand, 88 Hasbro Road, W14 0LR ★★★☆☆ Eleana Overett
+
Art review: Indian marble
+
+
Courtesy Amar gallery
+
+
Amar Gallery is located in Angel and its current show focuses on two Indian artists. The star of the show is Parul Thacker who has created two intricate works made entirely of Indian materials, from crystal to marble. Stunning works, and we do love coming across a new gallery. Form: Flow at Amar Gallery, 48 Penton Street, N1 9QA.Until 3 August, free.★★★☆☆ (Monday-Friday)
+
Good cause of the day
+
+
CRAFT BEER CARES: Book ahead to celebrate all the good being done in the craft beer industry whilst raising money for Mind and the Newman Trust. A ticket will get you a keepsake glass and seven beer tokens to spend on a huge variety of craft beer. Brew Club (Upper Clapton Road), £14.40, book ahead, 1 July
+
+
Funzing
+
Fun things to do with our friends and sponsor Funzing.
Scientific research is resuming on how psychedelics affect the weirder aspects of human consciousness. This talk from Dr David Luke engages in current study into pyschedelics and their historical use in shamanic rituals. Be prepared, you might leave with more questions than answers. Get tickets
+
Every January you do the same thing. You make a New Year's resolution to lose weight, be thriftier, quit smoking or possibly even to start exercising. Yet how many of us find ourselves in the exact spot we started in once the month is up? This talk by Dr Gabija Toleikyte, explains why the brain resists changing habits of a lifetime. She'll also explain how to create long lasting change, by working with your brain rather than against it. Get tickets
+
What would you say face-to-face to Saddam Hussein? How would you feel digging up the mass graves of Kosovo? Jonathan Tait-Harris will share experiences from his jobs as a policeman, soldier, war-crimes investigator and adviser to UK and Iraqi governments. £10 Get tickets
+
+
+
+
+]]>In Photos: St Paul's At Its Besthttp://londonist.com/london/art-and-photography/in-photos-st-paul-s-at-it-s-besthttp://londonist.com/london/art-and-photography/in-photos-st-paul-s-at-it-s-best#commentsSun, 25 Jun 2017 14:00:23 +0100http://londonist.com/?p=e84905bba28eeac43a51
+
The London skyline sure has changed a lot over the years, but St Paul's has been standing tall over it for many years. While not as tall nor shiny as some of its newer city counterparts, it's an instantly recognisable icon — you can spot this beauty from all over the city.
+]]>Weird Sculptures Fill The Square Milehttp://londonist.com/london/great-outdoors/weird-sculptures-fill-the-square-milehttp://londonist.com/london/great-outdoors/weird-sculptures-fill-the-square-mile#commentsSat, 24 Jun 2017 15:00:00 +0100http://londonist.com/?p=5a644d77def852b520fb
+
Every summer, a motley collection of sculptures is grafted onto the City of London's pavements. This year's crop for Sculpture in the City is now in place. Head over to Bishopsgate, and the streets around it, to find the following curiosities.
+
+
The plum spot for Sculpture in the City is to hang out here in front of the Gherkin. This year's contribution is from Paul McCarthy and is entitled 'Apple Tree Boy Apple Tree Girl' (the girl figure is not pictured in our shot, to keep things consistent with this year's woeful under-representation of women artists).
+
+
+
Close by, you'll find the mother of all suspicious packages dangling from a tree. It's meant to be an air-dropped parcel, whose contents are listed on a difficult-to-read plaque beneath the tree. This is the work of Ryan Gander and its deeper meaning is hard to translate from the accompanying artspeak. Something about 'the disparity between research based practices and production based practices'. Right.
+
+
+
This is The Black Horse, by Mark Wallinger. It is a black horse — nothing more, nothing less. This is the same artist who was supposed to have a 50 metre-tall horse at Ebbsfleet as a notional Angel of the South. That isn't happening, but at least he's got an equine onto this important crossroads in the City. We've walked past a few times now and this one seems to be getting more attention than some of its peers.
+
+
+
Man in pink shirt: "Hello, security... there's an exploding shed full of light outside my office. What? Art? By Nathaniel Rackowe? Oh. Sorry to trouble you."
+
+
+
Fernando Casasempere contributes this curious cube to the collection. A mix of building blocks and scrunched up forms are arranged into a white cube, which apparently 'evokes not only geology but the remains of a once-grand ruined structure or even a construction site'. Nah. We're thinking 'roughed-up Santa Claus'.
+
+
+
Gavin Turk's 'Ajar' is a leftover from last year's bunch. We don't mind its stubborn persistence, as it's one of the more intriguing works. What does it mean to have a door frame standing in open space? Should you walk through it? Why is the handle so low? Is it a portal to another dimension? Who is that man, and is he part of the artwork? What do the pigeons make of it all? Ah, the mysteries of the Universe.
+
+
+
Karen Tang's Synapsid resembles a triumphant bobsledder with pustulous yellow armpits. In a good way. These two Fenchurch Street workers certainly seem happy enough, eating their lunch beneath the oozing axillae.
+
+
Further works, including a piece by Damien Hirst, will be added to the roll-call over the coming weeks. Head on down to the Square Mile any time in 2017 and early 2018 to view the sculptures. Full information on the Sculpture in the City website.
+
+]]>Free And Cheap London Events This Week: 26 June - 2 July 2017http://londonist.com/london/things-to-do/free-and-cheap-london-events-this-week-26-jun-2-julyhttp://londonist.com/london/things-to-do/free-and-cheap-london-events-this-week-26-jun-2-july#commentsSat, 24 Jun 2017 13:15:23 +0100http://londonist.com/?p=d55a9b4ae63ffd51be17
+
DOODLEMANIA: What do you get when you take a hotel corridor and a professional doodler? A bloody exciting walkway, that's what. The Doodle corridor at The Exhibitionist Hotel is open to the public for a month as part of the ART CORRIDORS programme. The Exhibitionist Hotel, free, just turn up, all day
+
RIVER WEEK:A week long chance to celebrate London's waterways, and all the hard work that goes in to maintaining them. Did you know that over 66 Shards-worth of river has been rewilded? More than 30 free events take place across the week, from canoeing to boat tours. See programme for details, 25 June-2 July
+
PRIDE IN LONDON: Pride Festival gets underway this week with loads going on around the capital, including film screenings, exhibitions, tours, talks, sports, museum lates and more, all celebrating LGBT+ culture in the capital. See the full programme here. 24 June-9 July
+
LONDON RIVIERA: Dance workshops, mass karaoke, comedy and more are part of this week's free entertainment line-up at the London Riviera, a summer festival next to City Hall. Free, just turn up, until 31 August
SHADOW WORLD: This documentary screening reveals how the international trade in weapons fosters corruption, determines foreign policy, undermines democracy and creates suffering. Followed by a Q&A session. The Scout Hut, 106 Cottenham Park Road (Raynes Park), £5, book ahead, 7pm-10pm
+
MONDAY BLUES: It might be Monday, but that's no excuse not to kick back and enjoy some live music from talented jazz and soul musician James Junior. Having performed for Royal Family and the England rugby team, you're sure to be entertained. 100 Wardour Street, 8pm-10pm
+
Tuesday 27 June
+
POETRY EVENING: Poetry slam winner and Glastonbury performer Vanessa Kisuule headlines this poetry evening. Those with something to say can perform their own poetry in a five minute slot — those who don't can simply sit back and take in the words. Love & Dye, free, just turn up, 8pm
+
FREE COMEDY: You like laughing, right? And you like free things? Then we're set. Barry Ferns presents a mix of comic favourites performing longer sets for a laugh out loud evening. The Camden Head, free, just turn up, 8pm-10pm
DNA REPAIR: Spend your lunch hour feeding your curiosity. Geneticist Charlotte Mykura speaks on how the DNA in our cells is broken down tens of thousands of times a day, and how these breaks are repaired to prevent the cells from dying or becoming cancerous. Wellcome Collection, free, just turn up,1pm-2pm
FOOD MONTH: A whole month of food celebrations? Our stomachs are rumbling at the thought of it. Kick off Waterloo Food Month in style at this launch party on Lower Marsh, with live entertainment, demonstrations and free tasting sessions from stallholders including Greenport Kitchen, Sticky Mango and Yo! Sushi. Lower Marsh, free, just turn up, 5pm-9pm
+
ACROSS THE CHANNEL: The newly installed UK Ambassador in Paris, Edward Llewellyn — who was David Cameron's former Chief of Staff — will reflect on Anglo-French relations in the first Maurice Fraser Memorial Lecture. LSE, free, just turn up, 6.30pm-8pm
+
HYDRAULIC ECONOMY: Explore the background of two famous economists, Walter Newlyn and Bill Phillips and how they built their hydraulic model of the economy, and how it fits in with economic thinking about the macroeconomy. LSE, free, just turn up, 6.30pm-8pm
+
MYSTERY MOCKUMENTARY: If you're the sort of person who says 'I wonder what that was?', then this is the show for you. Will Close and Rose Robinson present a live mockumentary adventure investigating monsters, myths and Noel Edmonds. Prepare to be mildly unnerved. Pleasance Theatre, £5, book ahead, 7.45pm-8.45pm
JEWISH REFUGEES: To mark Refugee Week, this presentation highlights the plight of thousands of Jewish refugees from Nazi-occupied Europe, as they joined the fight against fascism by joining the British Army. Images, memories and objects help tell their extraordinary tales. National Army Museum, free, book ahead, 11.30am
+
REVEAL FESTIVAL: Today is the launch of REVEAL, a free, week long festival celebrating the V&A's 165th anniversary and opening of its brand new Exhibition Road Quarter. Explore the new space through events and activities designed to bring the architecture and collections to life. V&A Museum, free, just turn up, 5pm-10pm
+
CAR CANYONS: ...or beautiful boulevards? Need we accept that our major roads will be unpleasant and polluted if that is the price we have to pay for getting around smoothly? Explore whether we can free our streets from the tyranny of traffic, and make them attractive places people want to be in and live on. The Gallery (Cowcross Street), free, book ahead, 5.30pm-8pm
SUMMER TAP: Hang out on the deck at the launch party for Summer Tap Saturdays — enjoy some nosh from a rotating line-up of guests from the street food scene, boogie to some tunes and drink some excellent beer. Sounds like a good combo. The Five Points Brewing Company (Hackney), free, book ahead, 1pm-8pm
+
STOCKWELL FESTIVAL: Back after a two-year hiatus, Stockwell Festival brings together an eclectic mix of local street food, crafts and activities. There's no better way to witness the unique creativity, energy and diversity of the local area. Larkhall Park, free, just turn up, 12pm-6pm
+
WOMEN IN THE ARMY: 1917 marked the first time that women could join the army outside of nursing roles, and only recently was a ban on combat roles lifted for women. This 30 minute guided tour explored the theme of women in the army. National Army Museum, free, just turn up, 2.30pm
+
ART NIGHT: Some of the world's leading artists transform the City with free art, performance and music. Taking place in locations such as the Bascule Chamber at Tower Bridge and the Masonic Temple at Andaz Liverpool Street, it's a great chance to explore London's history, culture and architecture. Various locations around the City of London, free, just turn up, 6pm-6am
SUMMER STREETS:Every Londoner's wish comes true, as Regent Street becomes pedestrianised for a day, in a bid to encourage visitors to relax, unwind and enjoy the fantastic range of entertainment along the street. This year's theme of culture, style, wellness and food and drink promises a bold day out. Regent Street, free, just turn up,all day
+
HAMPSTEAD BEACH:The year round popular swimming spot Hampstead is now getting a beach. Golden sand, amazing food and cocktails set the mood for long evenings of sun, fun and holiday vibes at JW3 Jewish Centre. Free, just turn up,9am-10.30pm
+
EID FESTIVAL:As Ramadan comes to a close, everyone is invited to come together in Trafalgar Square for entertainment and attractions for the whole family to enjoy. With a global food festival, live music, arts and crafts and calligraphy, there is no better way to celebrate Eid. Trafalgar Square, free, just turn up,12pm-6pm
+
Funzing
+
Fun things to do with our friends and sponsor Funzing.
Scientific research is resuming on how psychedelics affect the weirder aspects of human consciousness. This talk from Dr David Luke engages in current study into pyschedelics and their historical use in shamanic rituals. Be prepared, you might leave with more questions than answers. Get tickets
+
Every January you do the same thing. You make a New Year's resolution to lose weight, be thriftier, quit smoking or possibly even to start exercising. Yet how many of us find ourselves in the exact spot we started in once the month is up? This talk by Dr Gabija Toleikyte, explains why the brain resists changing habits of a lifetime. She'll also explain how to create long lasting change, by working with your brain rather than against it. Get tickets
+
What would you say face-to-face to Saddam Hussein? How would you feel digging up the mass graves of Kosovo? Jonathan Tait-Harris will share experiences from his jobs as a policeman, soldier, war-crimes investigator and adviser to UK and Iraqi governments. £10 Get tickets
+
+
+
+
+]]>In Photos: Tower Bridge, You Beautyhttp://londonist.com/london/art-and-photography/in-photos-tower-bridge-at-its-besthttp://londonist.com/london/art-and-photography/in-photos-tower-bridge-at-its-best#commentsSat, 24 Jun 2017 11:30:20 +0100http://londonist.com/?p=f166671e9cacc2a151b7
+
Unfortunately for its little cousin, Tower Bridge is so magnificent that people often mistake it for London Bridge. Is it any wonder, though? This is THE London bridge, the biggest and most beautiful of them all...
+]]>Things To Do This Weekend In London: 24-25 June 2017http://londonist.com/london/things-to-do/things-to-do-this-weekend-in-london-24-25-june-2017http://londonist.com/london/things-to-do/things-to-do-this-weekend-in-london-24-25-june-2017#commentsFri, 23 Jun 2017 19:00:00 +0100http://londonist.com/?p=bbd030589d623e5cd48d
+
IT'S ALL INSTRUMENTAL: Whether you've never touched an instrument or once put a violin down and forgot to pick it up again, Learn to Play Weekend is offering free music lessons for both adults and children on piano, guitar, violin, trumpet and drums — or try something new on the Yamaha Venova. Yamaha Music Store (Wardour Street), free, just turn up, 24-25 June
+
CROYDON HERITAGE: In the run up to the Croydon Heritage Festival , a host of events will get your brains in gear, from archaeological displays to talks on attracting bees to your garden. Hear an introduction to the River Wandle or find out about Croydon's part in gaming history. 16-30 June
+
PALACE FESTIVAL:Soak up the atmosphere of this impressive Tudor palace as performers take to the stage in Hampton Court's beautiful open-air courtyard. Highlights include Will Young, Van Morrison, James Morrison and the Royal Philharmonic Orchestra. Hampton Court, various prices, book ahead, 7-24 June
+
PRIDE FESTIVAL: The parade may not be for a couple of weeks, but Pride in London events begin this weekend with the official festival launch, film screenings, exhibitions, tours and more. See programme for full details. 24 June-9 July
+
UNDERBELLY FESTIVAL: The best in live circus, comedy, cabaret and family entertainment is at South Bank. Have a tipple in one of London's largest outdoor bars before you kick back and watch some of the amazing performances. South Bank, various prices, book ahead,until 30 September
BILINGUAL: If you've always wanted to try learning Spanish, German, Italian or Brazilian-Portuguese but haven't been able to convince yourself to take lessons yet, Lingua Diversa is offering one-hour taster sessions to get you started. Conway Hall (Holborn), £10, book ahead, various times
+
EMERGING ARTISTS: Split between the Royal College of Art's two campuses in Battersea and Kensington, emerging contemporary art and design is on show from over 600 postgraduate students. Much of the work will also be on sale or commission, so get yourself a piece of the action before they're famous. Free, just turn up,noon-6pm
+
REBEL GARDENING: Did you know you can grow new plants from your supermarket leftovers? Just because you're a city-dweller, doesn't mean you can't get into a spot of gardening. Learn how to create seedbombs and green spaces in this urban gardening session. Museum of London, £25, book ahead, 1.30pm-4pm
+
PRESERVING HISTORY: Discover one of the most severely bombed areas of the city in the second world war — from the buildings they tried to rescue, to the ones that have been lovingly restored, and even those that remain as damaged monuments. Moorgate Station, £12, book ahead, 2.30pm-4.30pm
+
SERPENTINE PAVILION: This year's Serpentine Pavilion has been revealed, and we love it. Tour round Francis Kéré's bold, innovative structure and see how he brings his characteristic sense of light and life to the lawns of Kensington Gardens. Serpentine Pavilion, free, just turn up, 3pm
+
ART AT WAR: Explore the different ways war can be depicted through art, featuring photographs of recent conflicts and a discussion on the challenges of being an artist in a war zone. Royal College of Nursing Library and Heritage Centre, free, book ahead,5.30pm-8pm
+
LONDON SWEDES: Sit back and chill out on fluffy bean bags under flower arches at this Midsummer House party, with live music, authentic Swedish food and what every summer party needs - a chocolate fountain. Loft Studios (Kensal Green), £25/£30, book ahead, 5.30pm-3am
+
MASKED MAYHEM: Head to Mexico this weekend via York Hall, where legendary and newly-masked wrestling stars battle it out in flamboyant capes and outlandish suits. The Greatest Spectacle of Lucha Libre has everything from high-flying moves to catapulting off ropes. York Hall (Bethnal Green), various prices, book ahead, 7pm
+
GAP YEAR COMEDY: Comedian Jordan Brookes brings his Edinburgh Fringe show to Soho as he tells the tales of a gap year gone wrong, with daft faces, uncomfortable poses, and unnecessary confessions. Soho Theatre, £10/£12, book ahead, 9.15pm
DRAGON BOAT: It's a race to the finish line at this year's London Hong Kong Dragon Boat Festival, a fun-filled day out that promises traditional Chinese lion dancing, martial arts displays, Tai Chi, cultural theatrical acts and dance performances, and of course the dragon boat race itself. London Regatta Centre, free, just turn up, 8.30am-6pm
+
AMAZING ANTIQUES:Explore the longest running antiques fair in London and find a hidden treasure you just have to have. This particular fair specialises in fine jewellery, silver, ceramics and paintings. The Royal Horticultural Halls and Conference Centre, £4, just turn up, 10am-4.30pm
+
LOCAL MARKET: Enjoy a plethora of delicious foods, beautiful handmade goods, unique clothes, and even some pet fashion accessories at East Village Market, accompanied by the pleasing notes of musicians from across London. Victory Park, free, just turn up, 11am-4pm
+
VINTAGE SURPRISES: Find a one of a kind treasure at the Big London Flea with over 50 vintage traders in north London's biggest vintage market. From curiosities and collectibles to lost and found objects, you may come across something quite unexpected. EPIC Dalston, free, just turn up, 11am-6pm
+
DISMEMBERED:Should we be alarmed at the ideological attack on the state since 2010, by a series of governments to the right of the Thatcher administration? Or were these cuts a pragmatic response to the deficit crisis? Polly Toynbee and David Walker, authors of a book on the topic, discuss. Kings Place, £15-£29.50, book ahead,11.30am
+
KEATS HOUSE: Hear the stories of John Keats and his good friend Charles Brown on this tour of the basement and first floor areas of their former home, and discover how it was transformed into the building we know and love today. Keats House, free with admission, just turn up, 11.30am-12.15pm
+
SECRET SPIES: Immerse yourself in a world of danger and intrigue as you evade undercover surveillance to carry out a series of missions in the heart of the city. Undercover London will make all your spy career fantasies come true and is sure to keep you on your toes. Have you got what it takes? Secret Venue (Orange Street), £25, book ahead, 1.45pm-4.30pm
+
REFLECTING WITH ED: Ed Miliband reflects on his political career and looks ahead to what might happen next. Is there a future for the centre left? How does he explain the current position of the Labour party? Features a Q&A session with the audience. Kings Place, £19.50-£29.50, book ahead, 2pm
+
SUPPORT GRENFELL: Join in a West End fundraising gala evening of song, dance and comedy for those made homeless and the relatives of those who lost their lives in the Grenfell Tower fire. Songs of Solidarity stars Jason Manford, Dreamgirls star Tyrone Huntley, Wicked star Rachel Tucker and others. All proceeds will go to the Grenfell Tower Fire fundraiser. Trafalgar Studios, £25-£45, book ahead, 7.30pm
+
Good cause for the weekend: Amnesty International UK
+
+
Raising money for Amnesty International UK to help them promote their vision of unity and universal human rights, Ben Oakley Gallery and friends are hosting a special two day show launching an exclusive limited edition print release donated by contemporary artist Guy Denning. There is also a showcase of art throughout the weekend as various artists interpret what unity means to them. Ben Oakley Gallery, free, just turn up, 24-25 June, 11am-6pm
+
+
Funzing
+
Fun things to do with our friends and sponsor Funzing.
Scientific research is resuming on how psychedelics affect the weirder aspects of human consciousness. This talk from Dr David Luke engages in current study into pyschedelics and their historical use in shamanic rituals. Be prepared, you might leave with more questions than answers. Get tickets
+
Every January you do the same thing. You make a New Year's resolution to lose weight, be thriftier, quit smoking or possibly even to start exercising. Yet how many of us find ourselves in the exact spot we started in once the month is up? This talk by Dr Gabija Toleikyte, explains why the brain resists changing habits of a lifetime. She'll also explain how to create long lasting change, by working with your brain rather than against it. Get tickets
+
What would you say face-to-face to Saddam Hussein? How would you feel digging up the mass graves of Kosovo? Jonathan Tait-Harris will share experiences from his jobs as a policeman, soldier, war-crimes investigator and adviser to UK and Iraqi governments. £10 Get tickets
+
+
+
+
+]]>What's Our Relationship With Nature? Wellcome Collection Investigateshttp://londonist.com/london/museums-and-galleries/what-s-our-relationship-with-nature-head-to-the-wellcome-collection-to-find-outhttp://londonist.com/london/museums-and-galleries/what-s-our-relationship-with-nature-head-to-the-wellcome-collection-to-find-out#commentsFri, 23 Jun 2017 16:00:00 +0100http://londonist.com/?p=c18e3d202c28002ffac4
+
+
How does collecting cars equate with collecting beetles?
+
+
How do we relate to nature? It's a great question to ask to an exhibition audience in the Big Smoke.
+
+
But rather than tell us how we should interact with nature, this exhibition at Wellcome Collection has sourced the stories from Londoners.
+
+
The antler of a Fallow Deer donated by nature presenter Chris Packham.
+
+
The objects in this show were all donated by members of the public. They range from the eye-catching antler of a deer to the rather mundane looking pair of beaten up trainers.
+
+
The story behind these crab coffins is very sad. Image courtesy Wellcome Collection.
+
+
These objects themselves are only one half of the show — each one also has a story behind it that you can read about or listen to as to how these items helped the donating individual connect with nature. Some objects have brought people closer to the natural world, other helped them get over a difficult time in their life.
+
+
A collection of Jersey Kale waking sticks. But what's the story behind it.
+
+
Great stories abound and the tale of two sisters about crab coffins is heartbreaking. It's a moving and deeply personal exhibition, and well worth a visit.
+]]>What's It Like Inside The Supreme Court?http://londonist.com/london/things-to-do/what-s-it-like-inside-the-supreme-courthttp://londonist.com/london/things-to-do/what-s-it-like-inside-the-supreme-court#commentsFri, 23 Jun 2017 15:00:05 +0100http://londonist.com/?p=514cbe5d1a0df6ae515b
+
Ever been in the Supreme Court? Apart from the airport-style security screening, there's nothing to stop you going in.
+
The neo-Gothic style building is newer than it looks, having been built in 1913. Architect: James Gibson. Its original purpose was as the Middlesex Guildhall and as a denizen of Brentford, it’s this aspect which particularly interests me. What many don’t realise — even today — is that Middlesex no longer exists as a legal entity, since it and all its functions were swallowed up by the new Greater London Council in 1965. But in days gone by, all of London north of the Thames and west of the River Lea was Middlesex (hence Middlesex Station — Surrey Station in the Boat Race). The little county was small of size, big of population, a quite relatively powerful entity with a proud history.
+
+
Pendant celebrating the Middlesex Regiment at the Battle of Albuhera (1811) during the Peninsular War.
+
+
In the building there are lots of references to Middlesex history, in particular portraits of local worthies (including two portraits of Hugh Percy, 1st Duke of Northumberland – one by Reynolds, the other by Gainsborough). In the foyer there's a war memorial of the Middlesex Regiment, and in the basement display there are quite a few historical objects from the lamented county’s past. Not forgetting the building’s additional past business as a law court, there are portraits of legal notables too. Very pleasing to see the Blind Beak of Bow Street, John Fielding.
+
+
But all that’s in the past. The Supreme Court was set up in late 2009 to take over the functions previously carried out by the Law Lords in Parliament. This building was chosen because it was still close to the seat of Parliament while giving some separation from the House which was in many senses remote from the public.
+
+
The Library
+
+
Unlike all other courts, cases here are filmed and broadcast live. There are twelve Justices who normally hear and judge cases in panels of five, although seven and nine are occasionally used for more complicated or important cases. The justices do not wear robes or wigs except on ceremonial occasions.
+
+
Court Room 1. Beautiful medieval style carved wood ceiling decor with art nouveau style lanterns.
+
+
From the time of the Act in 2005 to set up the Supreme Court and its actual opening four years later, the building had to be extensively renovated. Eight courtrooms needed to be combined and reduced to three; a quite large library and cafeteria-restaurant were introduced. This was extremely controversial and widely unpopular. Having not seen the “before”, it’s difficult for me to comment, but I would say what we have today is a pleasing blend of the old and the new – this coming from a usually reactionary fuddy-duddy.
+
You can visit the Supreme Court any time during its stated opening hours for free. Access to the court rooms will depend on whether the court is in session, so the best time to visit is on a Friday when it is not. If you wish to have a guided tour as group like we did, they charge a very reasonable £5. I’d like to thank our guide, Simon Josiffe, who imparted great knowledge and hospitality.
+
This article originally appeared on London Historians. You can become a London Historians member here.
+
+]]>Vegan Doners Make Triumphant Shoreditch Returnhttp://londonist.com/london/food/vegan-doners-make-triumphant-shoreditch-returnhttp://londonist.com/london/food/vegan-doners-make-triumphant-shoreditch-return#commentsFri, 23 Jun 2017 13:00:00 +0100http://londonist.com/?p=c9d4d2f4a812d30e97c1
+
+
Vegans wept protein-deficient tears when street food market The Pump shut a couple of months ago, all for the loss of the incredible What The Pitta.
+
Their prayers have been answered, as What The Pitta has reopened just around the corner, in Boxpark. With this new stall they’ve added more to the menu. The doner box with “meat” and chips is an attractive form of vegan carbicide for sure. However, for our money it’s still the kebab wrap that tops the bunch, which is both healthier and tastier.
+
+
What The Pitta, Boxpark Shoreditch, 2-10 Bethnal Green Rd, E1 6GY
+
+]]>Learn All About London At The Bishopsgate Institutehttp://londonist.com/london/learn-all-about-london-at-the-bishopsgate-institutehttp://londonist.com/london/learn-all-about-london-at-the-bishopsgate-institute#commentsFri, 23 Jun 2017 12:30:06 +0100http://londonist.com/?p=4b45e90692cc58285132
+
If you're a London obsessive like us, then the upcoming events at the Bishopsgate Institute will be right up your frog and toad.
+
There's a new series of talks coming up —London Talks —celebrating the history and diversity of our incredible city. Events cover everything from sexuality to suffrage, the East End and protest history — it's time to satisfy your inner London geek.
This covers some of the East End's best secrets and stories, from criminality and degeneracy, myths and questions, right up to its gentrification — it's on 5 July, and a complete bargain at under a tenner.
+
+
The colourful city is the order of the day for From 'Evil Men' To 'Disco Divas'. The second in the London Talks series will remap queer London from persecution to liberation —the event on 19 July covers basement clubs and the highs of Heaven, focusing on the city between 1950 and the 1980s.
+
+
We bet you never thought that swimming galas would be part of the Votes for Women campaign — London's suffrage movement and popular culture is the topic of conversation on 26 July and features the unlikely activities of Ju Jitsu and rollerskating.
+
+
These London Talks promise to be some fascinating snapshots into what makes our city so great. As well as these, upcoming events at the Bishopsgate Institute look worth checking out.
+
+
Get rebellious on 13 July with We Are Angry, an evening which looks at large scale protests throughout history, starting from the early nineteenth century. Learn about how London coped with the Great Strike in the 1920s as you explore the archive material.
+
Rebels are also the subject of the Institute's art night, The Revolution Will Be Photocopied on 1 July, giving you the chance to get the lowdown on London's radical past before creating your own piece of angry artwork.
+
+
The event's open to those who don't fancy being creative too — visitors are welcome to just enjoy a drink and take a look at the exhibitions without getting stuck in with the sticking and gluing.
+
+
There's a lot more to London than meets the eye. Get below the surface of the city and explore some of the more fascinating sides of our glorious capital with these talks, events and the incredible archives the Bishopsgate Institute holds.
+
Check out the full schedule at the Bishopsgate Institute here.
+
+]]>In Photos: The Best Of Rush Hour Crushhttp://londonist.com/london/art-and-photography/the-best-of-the-metro-s-rush-hour-crushhttp://londonist.com/london/art-and-photography/the-best-of-the-metro-s-rush-hour-crush#commentsFri, 23 Jun 2017 12:00:05 +0100http://londonist.com/?p=a221b91e687a62304993
+
Sometimes a long tube journey can leave you staring longingly into the eyes of a fellow commuter. Here are some of our favourite submissions to Metro's Rush Hour Crush section. We wonder if any of these couples have gone the distance?
+]]>Tuck Into Glorious Grub At London's 'Gastronomic Glastonbury'http://londonist.com/london/glorious-grub-at-these-london-food-festivalshttp://londonist.com/london/glorious-grub-at-these-london-food-festivals#commentsFri, 23 Jun 2017 11:30:00 +0100http://londonist.com/?p=d09d4ca67942dedfda8b
+
Discover foodie heaven at Foodies Festival Festival this summer. Live demonstrations from world-class Michelin Star and celebrity chefs, flavours of the world from London’s best street food and prosecco trucks, award-winning produce at the artisan markets and London's best unsigned bands on the Live Music Stage. There will also be masterclasses including everything from healthy gin cocktails to craft beer and cheese pairing or afternoon tea and gin jam.
+
+
Foodies Festival is the UK’s favourite celebration of food, drink and wellbeing, and is popping up on Blackheath (7-9 July) and Alexandra Palace (26-28 August) for the Bank Holiday Weekend.Take home recipe tips from big names like Great British Bake Off Winner Candice Brown, food blogger and Healthy Eating sensation Deliciously Ella, top TV chefs Rosemary Shrager of The Big Family Cooking Showdown and Matt Tebutt ofSaturday Kitchen. Take home recipes from twice Michelin starred Atul Kochhar and Adam Simmonds, Masterchef Winner 2017 Saliha Mahmood-Ahmed and runner-up East London local Steve Kielty.
+
+
+
There'll be plenty of workshops so you can try your hand at some recipes yourself — whether you fancy a cocktail class or a lesson on Psychedelic Pavlovas, there are lots of opportunities to up your cookery game.
+
+
If you've got a sweet tooth, head to the Cakes and Desserts Theatre for demos from top pastry chefs, before heading to the Chocolate, Cake and Dessert Village for workshops like cake decorating.
+
Of course you'll have to make rooms for the all-important tasting of artisan breads, innovative bakes and buttery pastries — be sure to get your hands on some melt in the mouth churros too.
+
Elsewhere, The Healthy Living Zone is all about healthy cooking and exercise. Get your questions answered by Deliciously Ella before hitting a yoga class and stocking up on products from the market.
+
+
Of course it wouldn't be a festival without some music, and Foodies has that covered. Dance to live music with a glass of Pimms in hand and work up an appetite for even more eating.
+
Kids are taken care of too, with dedicated children's cookery classes as well as crafts, giant Jenga and bouncy castles to keep them entertained.
+
+
You might want to go to the many drinks-centred activities without the littl'uns though — there'll be mixologists and sommeliers, whisky and champagne tastings at the Drinks Theatre. There's A Beer For That will also be doing craft ale and food pairings, which could get slightly messy.
+
+
Street Food Avenue will be offering all sorts of global cuisine, and the Artisan Producer's Market will show off fabulous ingredients and products that you can take home. Feeling brave? There's even a bug eating competition for the strong-stomached.
+
Both Foodies Festivals are bound to be a great day out — check out the line up. We suggest you get booking — at the moment you can get 2-for-1 tickets plus a goodie bag if you enter FOOD2FOR1 at the checkout.
+
Foodies Festival takes place at Blackheath 7-9 July and Alexandra Palace 26-28 August (Bank Holiday Weekend).
+
+]]>11 Apps To Solve Your London Problemshttp://londonist.com/london/technology/11-must-have-apps-for-londonershttp://londonist.com/london/technology/11-must-have-apps-for-londoners#commentsFri, 23 Jun 2017 11:00:00 +0100http://londonist.com/?p=f718bf329415613a7883
+
Living in London is great, but it has its problems, right?
+
Nothing that an app can't fix. We've found a solution to every problem — from apps that can help you find something to do, to those that can help you get there, and even those which will keep you entertained on the way.
+
1. The times that you get lost...
+
You've lived here a while now, and you're probably quite impressed with your navigation skills. You can remember every stop of the 343 bus to New Cross and you always know which exit to take at Bank tube. But admit it — you still get lost sometimes, don't you?
+
+
If you've not already cottoned onto City Mapper, where've you been? It helps you navigate the city by just about any mode of transport possible, helping you find the fastest, cheapest and easiest route across town. Live train times, Uber integration and cycle docking station information means you'll never be caught short again. It even tells you where to sit (or let's be honest, stand) on the tube so you can make a swift exit at your destination. Nifty, that.
+
CityMapper is available on iOS free / Android free
+
2. The times you're wondering if your bus will ever turn up...
+
Sometimes you'll find yourself waiting for a bus at a stop without one of those handy little countdown displays. Disaster, right? You'll probably be here all night, and you find yourself doubting whether the route you need even exists anymore.
+
Not with this app you won't.
+
+
London Bus Live Countdown plugs directly into live TfL data to give you minute by minute progress updates of your bus. You'll know exactly when it's due to turn up, and can even keep tabs on all the other services due at your stop, in case you need to change route. What's more, the pensioner waiting next to you will be dead impressed when you're able to tell them that their bus will be here in four minutes time. You do-gooder, you.
+
London Bus Live Countdown is available on iOS free / Android free
+
3. The times when your lunchtime spending is getting out of control...
+
Ah, lunchtime. A chance to escape the humdrum of the office and grab a bite to eat. You used to bring in a cheese sandwich and can of Coke from home, but that soon fizzled out when you discovered the delights of London's lunchtime scene. Now you're on an acai bowl a day, and the nearest you get to a cheese sandwich is a grilled halloumi pita from the Cypriot pop-up down the road. You're exotic now.
+
But your bank account is hurting.
+
+
Monzo helps you keep track of your extravagant spending with a handy app and a delightful coral pink card. It's a bank built from the ground up for the smashed avocado generation — gone are the days of only finding out how lax you are with your finances when you take a look at your bank statement. Instead, live notifications keep you up to date with your spending habits, and there's even a handy budgeting feature so you can try to restrict your spending.
4. The times when your inner tube nerd lets you down...
+
As a Londoner, you know that the tube lies sometimes. That explains the smug look on your face when you disobey the signs and take a cheeky shortcut to get to your train a little quicker (King's Cross, we're looking at you). But there are also times when your inner nerd lets you down and you find yourself wondering whether that pesky 'Way Out' sign has led you the long way round...
+
Wonder no more.
+
+
StationMaster equips you with a handy 3D map of every station on the network, allowing you to ditch the signs and forge your own route through the tunnels. It even features a guide on the best door to exit both the station and your train by. You'll be out of there in no time now you're privy to all the shortcuts.
5. The times when you have no idea what to do tonight...
+
You've done London to death, and can tick off pretty much every major attraction as 'been there, done that'. You were even forced to go to M&M's World once, for lack of anything better to do. Is your love affair with the greatest city on earth over?
+
Hold on a minute.
+
+
YPlan helps you discover last minute events and things to do, no planning required. Just open the app and you'll be presented with a list of weird and wonderful goings-on in the city, all ready for you to book in as little as two taps. Suddenly a whole 'nother side to the city opens up — you'd never have guessed so much was going on right on your doorstep.
6. The times when you can't afford to go for a drink...
+
London is expensive. You love a good night out, but there's only so many times you can face waking up the next day, checking your bank account, and realising you were sinking £10 drinks all night. Thinking that perhaps it's time that you called time on your weekend drinking habit, you politely decline an invite to another raucous night out with your mates...
+
But what if there were free drinks?
+
+
Drinki have partnered with a whole host of London bars and nightclubs to offer you a free drink in each. It even features a handy map of participating bars, so you're free to hop between them and make the most of all the offers. What's more, the more friends you invite to the app, the more free drinks you get. You might just be on your way to the cheapest London night out you've ever had. Cheers!
7. The times when you need something to do on your commute...
+
As a Londoner, you're probably used to spending a lot of time on trains. But what are you meant to do when you're stuck on a delayed train, having exhausted your Spotify playlist and read the Evening Standard cover to cover? You could just sit and curse TfL for being unable to run an efficient public transport network...
+
Or you could try and run your own.
+
+
Mini Metro is a game of strategy that sees you run your own busy transit system by linking stations, directing trains and upgrading lines. With no two games playing alike, you'll probably get sucked in to spending many hours of your commute building the perfect commute. This is definitely one for all those who reckon they could do the whole train thing better than TfL. You think it's so easy, do you? We'll see about that.
+
Mini Metro is available on iOS £4.99 / Android £4.29
+
8. The times when TfL lets you down...
+
That said, we're not saying that TfL are perfect. There are, of course, times when you'll find yourself stranded without means to get home. Cancellations, delays and spotty network coverage all mean that sometimes you need to make alternative travel arrangements... unless of course, it was just your inability to read a Night Tube map (FYI, the Charing Cross branch of the Northern line does not run all hours...).
+
Uber has your back.
+
+
You probably have this app already, but it wouldn't be a list of top London apps without it. Now a familiar part of the London lexicon, many of us are already 'Ubering' across the city. You can request a car at the press of a button and track the location of your driver, and there's no need to carry cash either — you pay via the app. Result.
9. The times when you can't be bothered to get out of bed...
+
As a Londoner, you really enjoy getting out and sampling the delights of the city. But there are times when you're hungover stuck in bed, and you can't really face the prospect of trekking to your favourite eatery. If only *insert venue here* delivered, we hear you cry.
+
Well now they do.
+
+
Quiqup promises to shop, pickup and drop pretty much anything you can think of in central London. Why drag yourself to your favourite takeaway when you can drag your favourite takeaway to you? Of course, it's not just food — you might just want to get some last minute makeup delivered before a big night out. The live courier tracking on the app means you'll be sure it'll all arrive in time.
10. The times when you still can't get that table reservation...
+
London is a culinary capital, and with so many great restaurants to choose from, it's difficult to decide where to tantalise your tastebuds next. But deciding is only half the challenge — actually securing a table is the other. You've been caught short on a Friday night too many times, venturing into town to find that everyone had a reservation but you.
+
Now you can be the organised one.
+
+
Opentable helps you find and reserve tables at nearby restaurants, and the convenient cuisine categorisation makes it even easier to find what you're looking for. However, this is more than just a simple table booking app — there's special offers and a points system too, which you can exchange for vouchers. You'll be hard pressed to pay full price for a meal again, and you'll always have a seat too. Perfect.
11. The times when the air doesn't seem too fresh...
+
Some days, you find yourself wondering whether breathing the city air is doing you any good. Unfortunately, poor quality air is a major problem in London, and while there are efforts to mitigate the fumes, most would argue they do not go far enough.
+
Get yourself clued up.
+
+
Plume is a pollution monitor, allowing you to schedule your activities according to pollution levels. Is it the best time to go for a run? Should you go for a walk in the park with your children? Handy notifications keep you in the loop, and let you know the best time to get out and about.
Are there any other London problems you've fixed with an app? Let us know in the comments...
+
+]]>London's Transport Gets A Rainbow Makeover For Pridehttp://londonist.com/london/transport/london-s-transport-gets-a-rainbow-makeover-for-pridehttp://londonist.com/london/transport/london-s-transport-gets-a-rainbow-makeover-for-pride#commentsFri, 23 Jun 2017 10:22:15 +0100http://londonist.com/?p=3d36f0867e8a2ac0d1dd
+
+
Things are getting colourful at tube stations and cycle hire stations in central London, thanks to a makeover for Pride festival.
+
The regular roundels on platforms at Tottenham Court Road, Oxford Circus and Piccadilly Circus have been replaced with psychedelic counterparts, created especially to celebrate and show support for the LGBT+ community ahead of Pride in London.
+
+
The exterior of Tottenham Court Road has been wrapped with the Pride hashtag, #LoveIsLove. Elsewhere, 50 hire bikes now sport rainbow livery on their rear mudguards.
+
+
On the day of the Pride parade, bus stops in central London will be adorned with rainbow flags. Two bus stops in the Charing Cross area will remain permanently rainbowed.
+
In previous years, TfL has released rainbow-wrapped vehicles onto London's streets, including a bus, black taxi and DLR train, as well as installing the 'diversity traffic lights' around Trafalgar Square.
+
+
Sadiq Khan, Mayor of London, said:
+
Here in London, you’re free to love whoever you want to love and be whoever you want to be. That’s just one of the reasons why our city is seen as a beacon for the LGBT+ community and has such a vibrant, thriving scene – one that is bursting with colour, and contributes hugely to the life and soul of London.
+]]>Which London Animal Are You?http://londonist.com/london/great-outdoors/which-london-animal-are-youhttp://londonist.com/london/great-outdoors/which-london-animal-are-you#commentsFri, 23 Jun 2017 10:00:05 +0100http://londonist.com/?p=fd3e0e748b17b2189ca3
+
+
Click or tap for higher resolution.
+
+
Work your way through our flow chart to discover which London animal you most resemble.
+
+]]>Things To Do Today In London: Friday 23 June 2017http://londonist.com/london/things-to-do/things-to-do-today-in-london-friday-23-june-2017http://londonist.com/london/things-to-do/things-to-do-today-in-london-friday-23-june-2017#commentsThu, 22 Jun 2017 19:00:18 +0100http://londonist.com/?p=291bdc5aa5635c06e248
+
+
London Zoo is open late tonight (c) ZSL London Zoo
UNDER THE TRACKS: Photographer Ted Kinsey has been photographing London's many railway arches for years, not because of their architecture, but for what occupies them. From cinemas, to swimming pools, churches and even an aerial trapeze gym, witness a photographic record of the arches as they are today. The Underdog Gallery (London Bridge), free, just turn up, 23-25 June
+
CATHEDRAL OF THE PINES: For the first time,The Photographers' Gallery has devoted all three gallery spaces to one artist. Cathedral of the Pines exhibits Gregory Crewdson's exploration of human relations with natural environments. The Photographers' Gallery, free until noon, £4 thereafter, just turn up, until 8 October
+
COOKIE DOUGH: We walk past this one of a kind pop-up on the way home from work, and it's hard not to get drawn in. Today is your last chance to get your hands on some edible cookie dough, and with flavours like Unicorn Food and Nutting Better — you'll regret it if you don't. Old Street station, just turn up, 8am-8pm
+
DESIGN CAPITAL: We live in a global capital of built environment expertise, with an architecture sector alone recently valued at £1.7bn. As we negotiate our exit from the EU, a panel discusses how we can protect our legacy and ensure our continued global status. New London Architecture, free, book ahead, 8.30am-9.30am
MIDSUMMER FEST: Celebrate Midsummer's Eve at Aquavit in St James's Market. Live music, pop-up bar, food stands; all your favourite London festival entertainment in one place for a magical evening — as long as Puck doesn't turn up to cause mischief. Aquavit, free, book ahead, 5pm-10pm
+
ZOO NIGHTS: It's adults only as London Zoo stays open late for an evening of entertainment, and a chance to see the animals as you wouldn't normally. At dusk, they're more lively than in the daytime. Once they're in bed, take part in quizzes and games, or tuck into dinner at the street food market. ZSL London Zoo (Regent's Park), £17.50, book ahead, 6pm-10pm
+
+
+
+
SIXTY MINUTES: Tables turn on veteran political commentator Andrew Marr, as this time he's the one being asked the tough questions. With a string of high profile roles at the BBC, The Economist and The Independent, he's certainly one to learn from. China Exchange, £10, book ahead, 6.30pm-7.30pm
+
MR SPEAKER: The Speaker of the Commons, John Bercow, joins political commentator Steve Richards for a conversation about his political career. Why did he choose to be a Speaker rather than pursue a party political career? How much further does the Commons need to modernise? There will also be a chance to put your own questions to Bercow. Kings Place, £14.50-£29.50, book ahead, 7pm
+
+
LUCHA LIBRE: Iconic masked wrestling superheroes battle it out in this acrobatic, mythical, and often dangerous world of Mexican wrestling. Prepare to be transported from York Hall to a Mexican arena, and witness spectacular high-flying manoeuvres from this stellar lineup. York Hall, from £20, book ahead, 7pm
+
+
WOMEN IN POLITICS: The UK just elected a record number of female MPs to the House of Commons. Harriet Harman talks to Kirsty Lang about how the role of women in politics is changing, and what the future holds for Jeremy Corbyn's Labour Party. Kings Place, £15, book ahead,9.30pm
+
Art review: vivid photography
+
+
Image courtesy Annka Kultys gallery.
+
+
Fluorescent lights, escalators in Vegas, a flower in a puddle. All glow in bright neon colours in a photography exhibition designed for the Instagram generation. Beauty is found in consumerism and its byproducts. Signe Pierce: Faux Realities at Annka Kultys, 472 Hackney Road, E2 9EQ. Until 1 July, free. ★★★★☆ (Wednesday-Saturday)
+
Food review: summer, Jamaican-style
+
+
If it’s summer vibes you’re after, Jamaican burger shack Boom Burger is serving them up by the bucketload. The menu is small — burgers, salads, wings and fries — but these guys specialise in what they know. One bite of the Bacon Boom will have you craving that tangy melted cheese for weeks on end. The jerk sauce on the Boom Wings caters towards the tamer end of the market, and those looking for something a little spicier may be disappointed, but the sweet, fruity rum cocktails more than make up for it. Sitting proudly right under the Westway, this place gets busy on weekdays — we can only imagine what it’s like at weekends. Boom Burger, 272 Portobello Road, Notting Hill, W10 5TY ★★★☆☆ Laura Reynolds
+
Theatre review: on a hot summer night
+
+
Copyright Specular
+
+
Where better to get your teeth into operatic rock than the London Coliseum, home of the ENO? Jim Steinman was the genius behind many of Meat Loaf’s greatest hits and this jukebox musical showcases much of their finest work together, not least I’d Do Anything For Love, Dead Ringer For Love, Two Out Of Three Ain’t Bad and the foot-stomping title track. The storyline is micro-thin; some of the scenes and songs are pure filler and the acting is extremely over the top, but the singing is thrilling and there’s a superb set design which makes great use of one of the largest indoor stages around. Ultimately, it all comes down to the songs and, over the three hour running time, those with a deep love for 1980s soft rock will be in seventh heaven here. Bat Out Of Hell The Musical. The Coliseum, St. Martin's Lane, WC2. £15-£275.Until 22 August. ★★★★☆ FM
+
Good cause for the day
+
BUSH HALL DOES GLASTO: Those of us without tickets to Glastonbury can stop wallowing, as the fields of Dairy Ground and the artists of The Other Stage come to this sunny west London terrace, complete with cold drinks and burgers. In light of the recent Grenfell Tower tragedy, there will also be a fundraiser for the victims.Bush Hall, £3/£5, book ahead, 5pm-1am
+
+
Funzing
+
Fun things to do with our friends and sponsor Funzing.
Scientific research is resuming on how psychedelics affect the weirder aspects of human consciousness. This talk from Dr David Luke engages in current study into pyschedelics and their historical use in shamanic rituals. Be prepared, you might leave with more questions than answers. Get tickets
+
Every January you do the same thing. You make a New Year's resolution to lose weight, be thriftier, quit smoking or possibly even to start exercising. Yet how many of us find ourselves in the exact spot we started in once the month is up? This talk by Dr Gabija Toleikyte, explains why the brain resists changing habits of a lifetime. She'll also explain how to create long lasting change, by working with your brain rather than against it. Get tickets
+
What would you say face-to-face to Saddam Hussein? How would you feel digging up the mass graves of Kosovo? Jonathan Tait-Harris will share experiences from his jobs as a policeman, soldier, war-crimes investigator and adviser to UK and Iraqi governments. £10 Get tickets
+
+
+
+
+]]>Thermal Images Show Just How Hot The Tube Got Yesterdayhttp://londonist.com/london/transport/thermal-images-of-the-tube-in-the-heatwavehttp://londonist.com/london/transport/thermal-images-of-the-tube-in-the-heatwave#commentsThu, 22 Jun 2017 16:16:16 +0100http://londonist.com/?p=4a70f0de84bc93091868
+
+
If you thought the tube was hot in yesterday's heatwave, here are the photos to prove it. They're thermal images of the tube, taken on 21 June, the hottest day day of the year so far.
+
The images were taken on a Cat S60 smartphone and show a train pulling into Bank station, where the temperature reached 36.5ºc on the tracks.
+
+
If you thought that was hot, it reached 42.3ºc inside the tube carriage — which won't come as any sort of a surprise to you if, like us, you were on the Central line between 5 and 6pm on the hottest day of the year.
+
+
Unfortunately, there aren't any thermal images on a regular, non-heatwave day to compare them to, but rest assured that while you were sweltering in a tin can 20m below ground, pretty pictures were being created.
It seems like every time you look up there's a new building battling for attention on London's skyline, and the plethora of cranes signal that this trend certainly isn't slowing. We've gathered some of our favourite pictures of the skyline through time — it's good to see some old favourites still standing their ground alongside the modern giants.
+]]>Vibrant Watercolours From Around The World In Dulwichhttp://londonist.com/london/art-and-photography/fresh-and-vibrant-watercolours-in-dulwichhttp://londonist.com/london/art-and-photography/fresh-and-vibrant-watercolours-in-dulwich#commentsThu, 22 Jun 2017 15:00:00 +0100http://londonist.com/?p=da8ff1c4325247d45f32
+
A Venetian palace gleams as the sun reflects off its white walls. Look down at the beautiful blue water lapping at the building's edge, and then up again to the grimy mossy walls where the two meet. The colours are so vivid that it makes us wish we really were in Venice.
+
+
Anglo-American painter John Singer Sargent is best known as a portrait painter, capturing the who's who of his time. In truth we're rather apathethic towards his portraiture as it's more celeb spotting than a true appreciation of painting.
This exhibition at Dulwich Picture Gallery looks at his watercolours, where he painted everything from the dusky colours of the dead sea to bright blue skies and water in Majorca, dissected by the sun-bleached white of some sailboats.
+
It's great to see a freer side to Sargent, less concerned with commissions and capturing likeness, and more about expressive brushstrokes and opting for colour over accuracy.
+
+
The greens are just as captivating as the blues. Courtesy Aberdeen Art Gallery & Museums Collections
+
+
His landscapes are breathtaking and his animals surreal. The final room of portraiture is where this exhibition unravels a little, as the loose style and lack of detail simply doesn't suit portraiture. Thankfully the landscapes dominate the show and that's what visitors should spend the most time on as they are superb.
+
This is an aspect of the artist's portfolio we weren't familiar with, and we're glad to see this sparkling sumptuous side to Sargent.
+
+
Sargent captures how Spanish sunlight is different to Venetian.
+
+
Sargent: The Watercolours at Dulwich Picture Gallery is on until 8 October. Tickets are £15.50 for adults, concessions available.
+]]>Food Review: A Dose Of Sunshine In Southwarkhttp://londonist.com/london/food/food-review-a-dose-of-sunshine-in-southwarkhttp://londonist.com/london/food/food-review-a-dose-of-sunshine-in-southwark#commentsThu, 22 Jun 2017 14:00:09 +0100http://londonist.com/?p=0749626a68472168326f
+
+
Flat Iron Square just keeps getting better. Already an incubator for box-fresh streetfood businesses, the clump of railway arches and covered market are now attracting seriously good, permanent restaurants.
+
Among them, Lupins. Serving up small plates of what they call 'sunshine food', the snacks alone would be worth a visit: white bean and lemon crostini, and croquetas stuffed with ricotta and chilli, drizzled with honey. And that's just a precursor to a series of faultless dishes, bright with summery flavours. British and Mediterranean elements jostle to rich, lovely effect in the hake and 'nduja risotto, and the crab thermidor scattered with radish shavings is easily the best we've found in London.
+
Lupins: less take-a-chance-on-this-newcomer than grab-any-chance-you-get.
+
+
Lupins, 66 Union Street, SE1 1SG. Open for lunch and dinner Tuesday to Saturday, and just lunch Sunday to Monday
+
+]]>The Five Best South London Novelshttp://londonist.com/london/books-and-poetry/the-five-best-south-london-novelshttp://londonist.com/london/books-and-poetry/the-five-best-south-london-novels#commentsThu, 22 Jun 2017 12:00:00 +0100http://londonist.com/?p=ef60513c9f947099c576
+
What is London? I don’t know. I don’t believe anyone does. That’s why it makes such an exciting place to visit in both life and in writing. But besides the bulk of well-known novels set in Soho and Westminster and Islington and Hampstead, there are a significant minority of great London novels set south of the river.
+
My novel, All The Good Things, is mostly set there; I cannot imagine it happening anywhere else. The protagonist is a young woman with no family support and little idea of who or what she is; being part of the shambolic crush that is daily life on, say, the 333 bus, helps her to feel that it is ok to be an outsider. When she goes running through her local park, she sees not strangers, but a range of possible ways to live.
+
+
All The Good Things explores daily life in south London. Photo: Bob Lear
+
+
+
1. The Walworth Beauty by Michele Roberts
+
The connections between south London past and present are subtly teased out by this dual narrative novel, which is set between 2011 and 1851. The contemporary narrative follows an older woman, Madeleine, who relocates to Walworth from the City after losing her job. There she makes new and unorthodox connections, both with the present inhabitants of her street and with the distant echoes of the past.
+
+
Walworth, setting off The Walworth Beauty. Photo: Chris Guy
+
+
+
The Victorian narrative follows Joseph Benson, who must contribute to Henry Mayhew’s research into the living conditions of the poor by interviewing Walworth prostitutes. Both Joseph and Madeleines' lives are overturned by their encounters with the area; the two narratives twist and turn around one another, never neatly aligning as they might in the work of a lesser writer. Roberts’ prose is unbelievably sensuous; you can almost eat it. A wonderful exploration of the different sorts of connections and identities that can be forged in a big city, and the ways in which the present and past interact.
+
2. The Lonely Londoners by Sam Selvon
+
One grim winter evening, when it had a kind of unrealness about London, with a fog sleeping restlessly over the city and the lights showing in the blur as if it is not London at all but some strange place on another planet, Moses Aloetta hop on a number 46 bus…
+
So begins the novel that perhaps best captures the genesis of what we now think of as London. We follow a young West Indian immigrant, Moses, and his friends, as they make their lives in the city. It’s not, strictly speaking, a south London novel; it hops back and forth across the river, much like Moses, on his way to and from Waterloo. The London of this novel is messy, at turns kind, cruel, welcoming, rude; life for the newcomer is a constant recalibration of reality and dream. Written in a poetic, patois-infused prose, it is both funny and poignant, capturing both a specific moment in the city’s history and the feelings of love, hope, despair, and, of course, loneliness, that will be familiar to anyone who’s ever moved to a new and unknown place.
+
3. The Colour of Memory by Geoff Dyer
+
If you’ve never encountered Dyer’s writing, there’s a chance you'll be put off by the premise of this novel: a bunch of semi-destitute twenty-somethings bum around 1980s Brixton, listening to jazz, getting drunk and stoned and laid and lost. Reading about such a lifestyle in the contemporary climate, it’s hard not to get irritated; these lay-about bohemians wouldn’t last five minutes in a Job Centre, while their council flat is probably now on sale for half a million pounds. But — and if you’ve read his work you’ll know this — Dyer writes so well about people doing so little that you don’t mind. This is a vivid and humorous snapshot of a disappeared way of life and an exploration of sex, love, art and identity.
+
4. Serious Sweet by A.L. Kennedy
+
+
Telegraph Hill features in Serious Sweet. Photo: Ben Brown
+
+
+
This novel contains some of the most astute and moving observations of urban life that I’ve read in recent years. Set over a single day, it is an unconventional love story between Jon, a recently-divorced civil servant who hates his job, and Meg, a bankrupt accountant and ex-alcoholic. The narrative meanders from past to present and back again, from one side of the river to the other, with some rapturous descriptions of the view from Telegraph Hill. Kennedy’s skilful unfolding of each character’s self and history are interspersed with short, snappy descriptions of seemingly irrelevant scenes; a family on a tube train, a stranger leaving a cafe. Slowly, the meaning and significance of these sections become clear; the central character is perhaps the city itself, which, in providing us with so many small windows of observation into strangers’ lives, can change us in big ways.
+
5. Up the Junction by Nell Dunn
+
Like Lonely Londoners, this book provides an insight into post-war London rather different from the nostalgic swinging sixties programmes and popular histories with which you will no doubt be familiar. Nell Dunn was an upper class woman who, as a young mother, went to live in working class Battersea. She worked in local factories and made friends with other young women. The result is a book of linked short stories where fiction, memoir and reportage are playfully merged; reading them is like sitting down for a long, riotous drink with close friends.
+
Clare Fisher’s debut novel All the Good Things is published by Viking. Clare will be speaking alongside Michele Roberts at the Review Bookshop, Peckham on 6 July, 7pm.
+
+]]>
\ No newline at end of file
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_mediarss.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_mediarss.xml
new file mode 100644
index 000000000..e15ac975a
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_mediarss.xml
@@ -0,0 +1,662 @@
+
+Видеоролики Телеканал ТНТ на Rutubehttps://rutube.ru/video/person/11234072/Смотрите все видео, добавленное Телеканал ТНТ на rutube.ruКамеди Клаб: «3 сентября»Всё, что нужно знать про современное искусство.
+ Эфир от 13.02.2015
+
+ Мы в соцсетях:
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+ VK: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ Rutube: https://rutube.ru/channel/11234072/
+
+ Резиденты в соцсетях:
+ Гарик Харламов
+ https://t.me/garbul
+ https://vk.com/garikharlamov
+
+ Андрей Скороход
+ https://t.me/andrei_skorohod
+ https://vk.com/iskorohod
+
+ Производство: Comedy Club Productionhttps://rutube.ru/video/d10dd7dac4b73e4797cb9967ff1683cf/2022-09-03 09:37:11+03:00Камеди Клаб: «3 сентября»Всё, что нужно знать про современное искусство.
+ Эфир от 13.02.2015
+
+ Мы в соцсетях:
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+ VK: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ Rutube: https://rutube.ru/channel/11234072/
+
+ Резиденты в соцсетях:
+ Гарик Харламов
+ https://t.me/garbul
+ https://vk.com/garikharlamov
+
+ Андрей Скороход
+ https://t.me/andrei_skorohod
+ https://vk.com/iskorohod
+
+ Производство: Comedy Club ProductionКамеди Клаб «Картина» Гарик Харламов, Андрей СкороходВсё, что нужно знать про современное искусство.
+ Эфир от 13.02.2015
+
+ Мы в соцсетях:
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+ VK: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ Rutube: https://rutube.ru/channel/11234072/
+
+ Резиденты в соцсетях:
+ Гарик Харламов
+ https://t.me/garbul
+ https://vk.com/garikharlamov
+
+ Андрей Скороход
+ https://t.me/andrei_skorohod
+ https://vk.com/iskorohod
+
+ Производство: Comedy Club Productionhttps://rutube.ru/video/9f633529f14da1741a7060f378ced20e/2022-08-26 11:22:32+03:00Камеди Клаб «Картина» Гарик Харламов, Андрей СкороходВсё, что нужно знать про современное искусство.
+ Эфир от 13.02.2015
+
+ Мы в соцсетях:
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+ VK: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ Rutube: https://rutube.ru/channel/11234072/
+
+ Резиденты в соцсетях:
+ Гарик Харламов
+ https://t.me/garbul
+ https://vk.com/garikharlamov
+
+ Андрей Скороход
+ https://t.me/andrei_skorohod
+ https://vk.com/iskorohod
+
+ Производство: Comedy Club ProductionКамеди Клаб «Свободные отношения» Андрей БебуришвилиБебуришвили про свободные отношения.
+ Эфир от 23.03.2018
+
+ Мы в соцсетях:
+ Rutube: https://rutube.ru/metainfo/tv/10/
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+ VK: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ Rutube: https://rutube.ru/channel/11234072/
+
+ Андрей Бебуришвили в соцсетях:
+ https://t.me/beburprime
+
+ Производство: Comedy Club Productionhttps://rutube.ru/video/b98da6953328cbdacfd374ca0b8bc97e/2022-08-19 17:10:03+03:00Камеди Клаб «Свободные отношения» Андрей БебуришвилиБебуришвили про свободные отношения.
+ Эфир от 23.03.2018
+
+ Мы в соцсетях:
+ Rutube: https://rutube.ru/metainfo/tv/10/
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+ VK: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ Rutube: https://rutube.ru/channel/11234072/
+
+ Андрей Бебуришвили в соцсетях:
+ https://t.me/beburprime
+
+ Производство: Comedy Club ProductionОднажды в России: больничный апокалипсисРемонт в больнице оказался катастрофой.
+
+ Смотри шоу #ОднаждывРоссии по пятницам в 19:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ Однажды в России в соц. сетях:
+ Youtube: https://www.youtube.com/channel/UCE8VbbggYJ3GpGz6tbq1UWQ
+ Vk: https://vk.com/odnajdi_v_rossii
+ Telegram: https://t.me/ovrshowhttps://rutube.ru/video/88449880db5391821358369270d0317b/2022-08-17 13:20:01+03:00Однажды в России: больничный апокалипсисРемонт в больнице оказался катастрофой.
+
+ Смотри шоу #ОднаждывРоссии по пятницам в 19:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ Однажды в России в соц. сетях:
+ Youtube: https://www.youtube.com/channel/UCE8VbbggYJ3GpGz6tbq1UWQ
+ Vk: https://vk.com/odnajdi_v_rossii
+ Telegram: https://t.me/ovrshowStand Up: Евгений Чебатков - мужские страхиЕвгений Чебатков - О мужских страхах, выпивших женщинах, иностранном языке и негативе.
+
+ Актуальный график выхода шоу #StandUp в эфире ТНТ можно найти здесь: https://standup.tnt-online.ru/
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ StandUp в соц. сетях:
+ Vk: https://vk.com/brandnewshow
+ Telegram: https://t.me/stndptnt
+ YouTube: https://www.youtube.com/c/standupshowhttps://rutube.ru/video/103f3273fb7909feee2eb2ec98d7214f/2022-08-17 13:15:01+03:00Stand Up: Евгений Чебатков - мужские страхиЕвгений Чебатков - О мужских страхах, выпивших женщинах, иностранном языке и негативе.
+
+ Актуальный график выхода шоу #StandUp в эфире ТНТ можно найти здесь: https://standup.tnt-online.ru/
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ StandUp в соц. сетях:
+ Vk: https://vk.com/brandnewshow
+ Telegram: https://t.me/stndptnt
+ YouTube: https://www.youtube.com/c/standupshowКамеди Клаб «Витя Альварес в Сочи» Карибидис, Батрутдинов, Кошкина, Аверин, Матуа, СорокинВсе люди как люди, а он Витя Альварес!
+ Эфир от 27.09.2019
+
+ Мы в соцсетях:
+ Rutube: https://rutube.ru/metainfo/tv/10/
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+ VK: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ Rutube: https://rutube.ru/channel/11234072/
+
+ Резиденты в соцсетях:
+ Демис Карибидис
+ https://t.me/KaribidisDemis
+ https://vk.com/demiskaribidis
+
+ Тимур Батрутдинов
+ https://t.me/batrtimur
+ https://vk.com/batr
+
+ Дмитрий Сорокин
+ https://t.me/sorokinroll
+
+ Андрей Аверин
+ https://t.me/averinandrei
+ https://m.vk.com/id6389178
+
+ Зураб Матуа
+ https://m.vk.com/matua_zurab
+
+ Производство: Comedy Club Productionhttps://rutube.ru/video/927736c5e8918ae0ce67dc367918f153/2022-08-04 13:34:45+03:00Камеди Клаб «Витя Альварес в Сочи» Карибидис, Батрутдинов, Кошкина, Аверин, Матуа, СорокинВсе люди как люди, а он Витя Альварес!
+ Эфир от 27.09.2019
+
+ Мы в соцсетях:
+ Rutube: https://rutube.ru/metainfo/tv/10/
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+ VK: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ Rutube: https://rutube.ru/channel/11234072/
+
+ Резиденты в соцсетях:
+ Демис Карибидис
+ https://t.me/KaribidisDemis
+ https://vk.com/demiskaribidis
+
+ Тимур Батрутдинов
+ https://t.me/batrtimur
+ https://vk.com/batr
+
+ Дмитрий Сорокин
+ https://t.me/sorokinroll
+
+ Андрей Аверин
+ https://t.me/averinandrei
+ https://m.vk.com/id6389178
+
+ Зураб Матуа
+ https://m.vk.com/matua_zurab
+
+ Производство: Comedy Club ProductionЖенский стендап: Надя Джабраилова - полезные связиНадя Джабраилова про женскую косметичку и полезных людей.
+
+ Смотри шоу #ЖенскийСтендап по воскресеньям в 23:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ Женский стендап в соц. сетях:
+ VK: https://vk.com/standupfemale
+ Telegram: https://t.me/femalestandup_officialhttps://rutube.ru/video/13ba9f4909cbbeac224388391a611abe/2022-08-01 20:45:01+03:00Женский стендап: Надя Джабраилова - полезные связиНадя Джабраилова про женскую косметичку и полезных людей.
+
+ Смотри шоу #ЖенскийСтендап по воскресеньям в 23:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ Женский стендап в соц. сетях:
+ VK: https://vk.com/standupfemale
+ Telegram: https://t.me/femalestandup_officialЖенский стендап: Ирина Мягкова - мужская романтикаИрина Мягкова про возраст.
+
+ Смотри шоу #ЖенскийСтендап по воскресеньям в 23:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ Женский стендап в соц. сетях:
+ VK: https://vk.com/standupfemale
+ Telegram: https://t.me/femalestandup_officialhttps://rutube.ru/video/4ef9390b397785c1b370cd5de1978273/2022-07-28 07:55:01+03:00Женский стендап: Ирина Мягкова - мужская романтикаИрина Мягкова про возраст.
+
+ Смотри шоу #ЖенскийСтендап по воскресеньям в 23:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ Женский стендап в соц. сетях:
+ VK: https://vk.com/standupfemale
+ Telegram: https://t.me/femalestandup_officialОднажды в Росси: Мэр в отпускеМэр думает где отдохнуть летом.
+
+ Смотри шоу #ОднаждывРоссии по пятницам в 19:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ Однажды в России в соц. сетях:
+ Youtube: https://www.youtube.com/channel/UCE8VbbggYJ3GpGz6tbq1UWQ
+ Vk: https://vk.com/odnajdi_v_rossii
+ Telegram: https://t.me/ovrshowhttps://rutube.ru/video/fa9579160c333d2e2a70ff6e5995c3f9/2022-07-27 19:40:01+03:00Однажды в Росси: Мэр в отпускеМэр думает где отдохнуть летом.
+
+ Смотри шоу #ОднаждывРоссии по пятницам в 19:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ Однажды в России в соц. сетях:
+ Youtube: https://www.youtube.com/channel/UCE8VbbggYJ3GpGz6tbq1UWQ
+ Vk: https://vk.com/odnajdi_v_rossii
+ Telegram: https://t.me/ovrshowИмпровизация: шокирующий ремонтАнтон Шастун пришёл в магазин к Арсению Попову за стройматериалами.
+
+ Смотри новые выпуски шоу #Импровизация по пятницам в 22:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ VK: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ Импровизация в соц. сетях:
+ Telegram: https://t.me/Improvisation_tnt
+ VK: https://vk.com/improvisationtnt
+ TikTok: https://vm.tiktok.com/ZSesJxHTj/
+ YouTube: https://www.youtube.com/channel/UCOfVHvuOx5SanXGv29_yY-Ahttps://rutube.ru/video/72b89a0d710d1cf16e643594d62b2908/2022-07-27 19:00:01+03:00Импровизация: шокирующий ремонтАнтон Шастун пришёл в магазин к Арсению Попову за стройматериалами.
+
+ Смотри новые выпуски шоу #Импровизация по пятницам в 22:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ VK: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ Импровизация в соц. сетях:
+ Telegram: https://t.me/Improvisation_tnt
+ VK: https://vk.com/improvisationtnt
+ TikTok: https://vm.tiktok.com/ZSesJxHTj/
+ YouTube: https://www.youtube.com/channel/UCOfVHvuOx5SanXGv29_yY-AStand UP: Артём Винокур - неожиданное предложениеАртём Винокур - как сделать девушке предложение выйти замуж.
+
+ Актуальный график выхода шоу #Stand Up в эфире ТНТ можно найти здесь: https://standup.tnt-online.ru/
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ StandUp в соц. сетях:
+ Vk: https://vk.com/brandnewshow
+ Telegram: https://t.me/stndptnt
+ YouTube: https://www.youtube.com/c/standupshowhttps://rutube.ru/video/cb18e95bba806a41bdd4520b00c551b7/2022-07-27 17:45:01+03:00Stand UP: Артём Винокур - неожиданное предложениеАртём Винокур - как сделать девушке предложение выйти замуж.
+
+ Актуальный график выхода шоу #Stand Up в эфире ТНТ можно найти здесь: https://standup.tnt-online.ru/
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ StandUp в соц. сетях:
+ Vk: https://vk.com/brandnewshow
+ Telegram: https://t.me/stndptnt
+ YouTube: https://www.youtube.com/c/standupshowИмпровизация - знаменитый тусовщикЗнаменитый тусовщик Арсений Попов позвал на вечеринку Антона Шастуна, Сергея Матвиенко и Дмитрия Позова.
+
+ Смотри новые выпуски шоу #Импровизация по пятницам в 22:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ VK: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ Импровизация в соц. сетях:
+ Telegram: https://t.me/Improvisation_tnt
+ VK: https://vk.com/improvisationtnt
+ TikTok: https://vm.tiktok.com/ZSesJxHTj/
+ YouTube: https://www.youtube.com/channel/UCOfVHvuOx5SanXGv29_yY-Ahttps://rutube.ru/video/add764f39177facc00511d93992dff2b/2022-07-27 16:25:01+03:00Импровизация - знаменитый тусовщикЗнаменитый тусовщик Арсений Попов позвал на вечеринку Антона Шастуна, Сергея Матвиенко и Дмитрия Позова.
+
+ Смотри новые выпуски шоу #Импровизация по пятницам в 22:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ VK: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+ YouTube Shorts: https://www.youtube.com/channel/UCmVoIfd7II6lVCTovtncaNQ
+
+ Импровизация в соц. сетях:
+ Telegram: https://t.me/Improvisation_tnt
+ VK: https://vk.com/improvisationtnt
+ TikTok: https://vm.tiktok.com/ZSesJxHTj/
+ YouTube: https://www.youtube.com/channel/UCOfVHvuOx5SanXGv29_yY-AКамеди Клаб «Бывшие» Иван ПоловинкинВот и откровения подъехали. Ваня Половинкин про бывших
+ Эфир от 08.10.2021
+
+ Смотри Comedy Club по пятницам в 21:00 на ТНТ.
+
+ Мы в соцсетях:
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ Rutube: https://rutube.ru/channel/11234072/
+ Telegram: https://t.me/TNT_television
+ ВКонтакте: https://vk.com/tnt
+
+ Иван Половинкин в соцсетях:
+ https://t.me/IvanPolovinki1
+ vk.com/ivan_polovinkin
+
+ Производство: Comedy Club Productionhttps://rutube.ru/video/2fd04c5380cea94deaef452acdfe1594/2022-07-22 15:01:49+03:00Камеди Клаб «Бывшие» Иван ПоловинкинВот и откровения подъехали. Ваня Половинкин про бывших
+ Эфир от 08.10.2021
+
+ Смотри Comedy Club по пятницам в 21:00 на ТНТ.
+
+ Мы в соцсетях:
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ Rutube: https://rutube.ru/channel/11234072/
+ Telegram: https://t.me/TNT_television
+ ВКонтакте: https://vk.com/tnt
+
+ Иван Половинкин в соцсетях:
+ https://t.me/IvanPolovinki1
+ vk.com/ivan_polovinkin
+
+ Производство: Comedy Club ProductionОднажды в России: Экзамен в ГИБДДПолучение водительских прав.
+
+ Смотри шоу #ОднаждывРоссии по пятницам в 20:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+
+ Однажды в России в соц. сетях:
+ Youtube: https://www.youtube.com/channel/UCE8VbbggYJ3GpGz6tbq1UWQ
+ Vk: https://vk.com/odnajdi_v_rossii
+ Telegram: https://t.me/ovrshowhttps://rutube.ru/video/c23c78fce777d712f9ddfb8cccf5aa8c/2022-07-20 19:10:01+03:00Однажды в России: Экзамен в ГИБДДПолучение водительских прав.
+
+ Смотри шоу #ОднаждывРоссии по пятницам в 20:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Telegram: https://t.me/TNT_television
+
+ Однажды в России в соц. сетях:
+ Youtube: https://www.youtube.com/channel/UCE8VbbggYJ3GpGz6tbq1UWQ
+ Vk: https://vk.com/odnajdi_v_rossii
+ Telegram: https://t.me/ovrshowStand Up: Павел Дедищев - школьная занудаПавел Дедищев про школьные годы и алкоголь.
+
+ Актуальный график выхода шоу #Stand Up в эфире ТНТ можно найти здесь: https://standup.tnt-online.ru/
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Teleg: https://t.me/TNT_television
+
+ StandUp в соц. сетях:
+ Vk: https://vk.com/brandnewshow
+ Teleg: https://t.me/stndptnt
+ YouTube: https://www.youtube.com/c/standupshowhttps://rutube.ru/video/39b0cce72b43d14889020f2c1c25a0ab/2022-07-20 16:35:01+03:00Stand Up: Павел Дедищев - школьная занудаПавел Дедищев про школьные годы и алкоголь.
+
+ Актуальный график выхода шоу #Stand Up в эфире ТНТ можно найти здесь: https://standup.tnt-online.ru/
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Teleg: https://t.me/TNT_television
+
+ StandUp в соц. сетях:
+ Vk: https://vk.com/brandnewshow
+ Teleg: https://t.me/stndptnt
+ YouTube: https://www.youtube.com/c/standupshowИмпровизация: Бар у АзаматаВ бар к Азамату Мусагалиеву пришли выпить Антон Шастун, Арсений Попов, Дмитрий Позов и Сергей Матвиенко.
+
+ Смотри новые выпуски шоу #Импровизация по пятницам в 22:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Teleg: https://t.me/TNT_television
+
+ Импровизация в соц. сетях:
+ Telegram: https://t.me/Improvisation_tnt
+ VK: https://vk.com/improvisationtnt
+ TikTok: https://vm.tiktok.com/ZSesJxHTj/
+ YouTube: https://www.youtube.com/channel/UCOfVHvuOx5SanXGv29_yY-Ahttps://rutube.ru/video/805d3d086cd680ac03acf70b4cc6923d/2022-07-15 17:10:46+03:00Импровизация: Бар у АзаматаВ бар к Азамату Мусагалиеву пришли выпить Антон Шастун, Арсений Попов, Дмитрий Позов и Сергей Матвиенко.
+
+ Смотри новые выпуски шоу #Импровизация по пятницам в 22:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Teleg: https://t.me/TNT_television
+
+ Импровизация в соц. сетях:
+ Telegram: https://t.me/Improvisation_tnt
+ VK: https://vk.com/improvisationtnt
+ TikTok: https://vm.tiktok.com/ZSesJxHTj/
+ YouTube: https://www.youtube.com/channel/UCOfVHvuOx5SanXGv29_yY-AЖенский стендап: Варвара Щербакова - страх спитьсяВарвара Щербакова про алкоголь и свою маму.
+
+ Смотри шоу #ЖенскийСтендап по воскресеньям в 23:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Teleg: https://t.me/TNT_television
+
+ Женский стендап в соц. сетях:
+ Vk: https://vk.com/standupfemale
+ Teleg: https://t.me/femalestandup_officialhttps://rutube.ru/video/0f514288df81db9612ba3d8879cc58c5/2022-07-13 14:00:01+03:00Женский стендап: Варвара Щербакова - страх спитьсяВарвара Щербакова про алкоголь и свою маму.
+
+ Смотри шоу #ЖенскийСтендап по воскресеньям в 23:00 на #ТНТ
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Teleg: https://t.me/TNT_television
+
+ Женский стендап в соц. сетях:
+ Vk: https://vk.com/standupfemale
+ Teleg: https://t.me/femalestandup_officialКамеди Клаб «Неравный брак» Гарик Харламов, Александр РевваНемного про семейные ценности. Эфир от 15.05.2015
+
+ Смотри Comedy Club по пятницам в 21:00 на ТНТ.
+
+ Мы в соцсетях:
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ Rutube: https://rutube.ru/channel/11234072/
+ Telegram: https://t.me/TNT_television
+ ВКонтакте: https://vk.com/tnt
+
+ Производство: Comedy Club Production
+ Гарик Харламов
+ https://t.me/garbul
+ https://vk.com/garikharlamov
+
+ Александр Ревва
+ https://t.me/arthurpirozhkov1https://rutube.ru/video/b8b7aef90da9eb02f688e5331ee4daa8/2022-07-08 11:17:25+03:00Камеди Клаб «Неравный брак» Гарик Харламов, Александр РевваНемного про семейные ценности. Эфир от 15.05.2015
+
+ Смотри Comedy Club по пятницам в 21:00 на ТНТ.
+
+ Мы в соцсетях:
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ Rutube: https://rutube.ru/channel/11234072/
+ Telegram: https://t.me/TNT_television
+ ВКонтакте: https://vk.com/tnt
+
+ Производство: Comedy Club Production
+ Гарик Харламов
+ https://t.me/garbul
+ https://vk.com/garikharlamov
+
+ Александр Ревва
+ https://t.me/arthurpirozhkov1Stand Up: Гурам Амарян - бедные парниГурам Амарян про нехватку денег у парней.
+
+ Актуальный график выхода шоу #Stand Up в эфире ТНТ можно найти здесь: https://standup.tnt-online.ru/
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Teleg: https://t.me/TNT_television
+
+ StandUp в соц. сетях:
+ Vk: https://vk.com/brandnewshow
+ Teleg: https://t.me/stndptnt
+ YouTube: https://www.youtube.com/c/standupshowhttps://rutube.ru/video/bddf716fcf294bd2c7cde293c0bd0ee6/2022-06-24 13:25:01+03:00Stand Up: Гурам Амарян - бедные парниГурам Амарян про нехватку денег у парней.
+
+ Актуальный график выхода шоу #Stand Up в эфире ТНТ можно найти здесь: https://standup.tnt-online.ru/
+
+ Производство: Comedy Club Production
+
+ Телеканал ТНТ в соц. сетях:
+ Vk: https://vk.com/tnt
+ Teleg: https://t.me/TNT_television
+
+ StandUp в соц. сетях:
+ Vk: https://vk.com/brandnewshow
+ Teleg: https://t.me/stndptnt
+ YouTube: https://www.youtube.com/c/standupshowКамеди Клаб «Выпускной» Андрей БебуришвилиВыпускники, для вас!
+ Эфир от 26.05.2017
+
+ Смотри Comedy Club по пятницам в 21:00 на ТНТ.
+
+ Мы в соцсетях:
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ Rutube: https://rutube.ru/channel/11234072/
+ Telegram: https://t.me/TNT_television
+ ВКонтакте: https://vk.com/tnt
+
+ Производство: Comedy Club Production
+ Андрей Бебуришвили: https://t.me/beburprimehttps://rutube.ru/video/4926075a8c04e82e2b759d05f1e6a696/2022-06-23 17:26:28+03:00Камеди Клаб «Выпускной» Андрей БебуришвилиВыпускники, для вас!
+ Эфир от 26.05.2017
+
+ Смотри Comedy Club по пятницам в 21:00 на ТНТ.
+
+ Мы в соцсетях:
+ Telegram: https://t.me/comedyclubru
+ ВКонтакте: https://vk.com/comedyclubru
+ Одноклассники: https://ok.ru/comedyclubru
+
+ Телеканал ТНТ в соцсетях:
+ Rutube: https://rutube.ru/channel/11234072/
+ Telegram: https://t.me/TNT_television
+ ВКонтакте: https://vk.com/tnt
+
+ Производство: Comedy Club Production
+ Андрей Бебуришвили: https://t.me/beburprime
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_morningpaper.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_morningpaper.xml
new file mode 100644
index 000000000..ab232d45b
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_morningpaper.xml
@@ -0,0 +1,1265 @@
+
+
+
+ the morning paper
+
+ https://blog.acolyer.org
+ an interesting/influential/important paper from the world of CS every weekday morning, as selected by Adrian Colyer
+ Tue, 07 Mar 2017 16:53:21 +0000
+ en
+ hourly
+ 1
+ http://wordpress.com/
+
+
+ https://secure.gravatar.com/blavatar/09326a066a08237015d6b84f026d36ae?s=96&d=https%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png
+ the morning paper
+ https://blog.acolyer.org
+
+
+
+
+ Thou shalt not depend on me: analysing the use of outdated JavaScript libraries on the web
+ https://blog.acolyer.org/2017/03/07/thou-shalt-not-depend-on-me-analysing-the-use-of-outdated-javascript-libraries-on-the-web/
+ https://blog.acolyer.org/2017/03/07/thou-shalt-not-depend-on-me-analysing-the-use-of-outdated-javascript-libraries-on-the-web/#comments
+ Tue, 07 Mar 2017 06:00:00 +0000
+
+
+
+ http://adriancolyer.wordpress.com/?p=4116
+ ]]>
+ Thou shalt not depend on me: analysing the use of outdated JavaScript libraries on the web Lauinger et al., NDSS 2017
+
Just based on the paper title alone, if you had to guess what the situation is with outdated JavaScript libraries on the web, you’d probably guess it was pretty bad. It turns out it’s very bad indeed, and we’ve created a huge mess with nowhere near enough attention being paid to the issue. The first step towards better solutions is recognising that we have a problem, and Lauinger et al., do a tremendous job in that regard.
+
+ In this paper, we conduct the first comprehensive study of client-side JavaScript library usage and the resulting security implications across the Web. Using data from over 133K websites, we show that 37% of them include at least one library with a known vulnerability; the time lag behind the newest release of a library is measured in the order of years.
+
+
For example, 36.7% of jQuery includes, 40.1% of Angular, and an astonishing 86.6% of Handlebars includes use a vulnerable version. Those are headline grabbing numbers, but when you go deeper it turns out there’s no quick fix in sight because the root causes are systemic in the JavaScript ecosystem:
+
+ Perhaps our most sobering finding is practical evidence that the JavaScript library ecosystem is complex, unorganised, and quite “ad hoc” with respect to security. There are no reliable vulnerability databases, no security mailing lists maintained by library vendors, few or no details on security issues in release notes, and often, it is difficult to determine which versions of a library are affected by a specific reported vulnerability.
+
+
Let’s briefly look at how the authors collected their data before diving deeper into what the results themselves tell us.
+
Data gathering methodology
+
The team crawled the Alexa Top 75K websites (ALEXA) and also a random sample of 75K websites drawn from the .com domain (COM). This enables a comparison of JavaScript usage across popular and unpopular websites.
+
Figuring out which JavaScript libraries were actually in use, and their versions, took quite a bit of work. As did figuring out which versions contain vulnerabilities. Details of the tools and techniques used for this can be found in the paper, in brief it involved:
+
+
Manually constructing a catalogue of all releases versions of the 72 most popular open source libraries (using popularity statistics from Bower and Wappalyzer).
+
Using static and dynamic analysis techniques to cope with the fact that developers often reformat, restructure, or append code making it difficult to detect library usage in the wild
+
Implementing an in-browser causality tracker to understand why specific libraries are loaded by a given site.
+
+
Vulnerabilities
+
+ The last step towards building our catalogue is aggregating vulnerability information for our 72 JavaScript libraries. Unfortunately, there is no centralised database of vulnerabilities in JavaScript libraries; instead, we manually compile vulnerability information from the Open Source Vulnerability Database (OSVDB), the National Vulnerability Database (NVD), public bug trackers, GitHub comments, blog posts, and the vulnerabilities detected by Retire.js. Overall, we are able to obtain systematically documented details of vulnerabilities for 11 of the JavaScript libraries in our catalogue.
+
+
+
Causality trees
+
To figure out why a certain library is being loaded, the authors develop a causality tree chrome extension. Nodes in the tree are snapshots of elements in the DOM at a specific point in time, and edges denote “created by” relationships.
+
For example:
+
+
and
+
+
The median causality tree in ALEXA contains 133 nodes, and the median depth is 4 inclusions.
+
JavaScript library market share
+
jQuery remains by far the most popular library, found on 84.5% of ALEXA sites. Note also SWFObject (Adobe Flash) still used on 10.7% of ALEXA sites despite being discontinued in 2013.
+
+
When externally loaded, scripts are mostly loaded from CDNs (note also the domain parking sites popping up in the long tail of the COM sites):
+
+
Overall though, there seems to be a pretty even split between internally hosted and CDN-delivered script libraries:
+
+
Distribution of vulnerable libraries
+
37.8% of ALEXA sites use at least one library version known to the authors to be vulnerable.
+
+ Highly-ranked websites tend to be less likely to include vulnerable libraries, but they are also less likely to include any detected library at all. Towards the lower ranks, both curves increase at a similar pace until they stabilise. While only 21 % of the Top 100 websites use a known vulnerable library, this percentage increases to 32.2 % in the Top 1 k before it stabilises in the Top 5 k and remains around the overall average of 37.8 % for all 75 k websites.
+
+
+
37.4% of the COM sites use at least one vulnerable library. Within the ALEXA grouping, financial and government sites are the worst, with 52% and 50% of sites containing vulnerable libraries respectively.
+
The following table shows the percentage of vulnerable copies in the wild for jQuery, jQ-UI, Angular, Handlebars, and YUI 3.
+
(Click for larger view)
+
+ In ALEXA, 36.7% of jQuery inclusions are known vulnerable, when at most one inclusion of a specific library version is counted per site. Angular has 40.1% vulnerable inclusions, Handlebars has 86.6%, and YUI 3 has 87.3% (it is not maintained any more). These numbers illustrate that inclusions of known vulnerable versions can make up even a majority of all inclusions of a library.
+
+
Many libraries it turns out are not directly included by the site, but are pulled in by other libraries that are. “Library inclusions by ad, widget, or tracker code appear to be more vulnerable than unrelated inclusions.”
+
Another interesting analysis is the age of the included libraries – the data clearly shows that the majority of web sites use library versions released a long time ago, suggesting that developers rarely update their library dependencies once they have deployed a site. 61.7% of ALEXA sites are at least one patch version behind on one of their included libraries, and the median ALEXA site uses a version released 1,177 days before the newest release of the library. Literally years out of date.
+
Duplicate inclusions
+
If you like a little non-determinism in your web app (I find it always make debugging much more exciting ), then another interesting find is that many sites include the same libraries (and multiple versions thereof) many times over!
+
+ We discuss some examples using jQuery as a case study. About 20.7 % of the websites including jQuery in ALEXA (17.2 % in COM) do so two or more times. While it may be necessary to include a library multiple times within different documents from different origins, 4.2 % of websites using jQuery in ALEXA include the same version of the library two or more times into the same document (5.1 % in COM), and 10.9 % (5.7 %) include two or more different versions of jQuery into the same document. Since jQuery registers itself as a window-global variable, unless special steps are taken only the last loaded and executed instance can be used by client code. For asynchronously included instances, it may even be difficult to predict which version will prevail in the end.
+
+
What can be done?
+
So where does all this leave us?
+
+ From a remediation perspective, the picture painted by our data is bleak. We observe that only very small fraction of potentially vulnerable sites (2.8 % in ALEXA, 1.6 % in COM) could become free of vulnerabilities by applying patch-level updates, i.e., an update of the least significant version component, such as from 1.2.3 to 1.2.4, which would generally be expected to be backwards compatible. The vast majority of sites would need to install at least one library with a more recent major or minor version, which might necessitate additional code changes due to incompatibilities.
+
+
Version aliasing could potentially help (specifying only a library prefix, and allowing the CDN to return the latest version), but only a tiny percentage of sites use it (would you trust the developers of those libraries not to break your site, completely outside of your control?). Note that:
+
+ Google recently discontinued this service, citing caching issues and “lack of compatibility between even minor versions.”
+
+
We need proper dependency management which makes it clear which versions of libraries are being used, coupled with knowledge within the supply chain of vulnerabilities. “This functionality would ideally be integrated into the dependency management system of the platform so that a warning can be shown each time a developer includes a known vulnerable component from the central repository.”
+
Of course, that can only work if we have some way of figuring out which libraries are vulnerable in the first place. The state of the practice here is pretty damning :
+
+ Unfortunately, security does not appear to be a priority in the JavaScript library ecosystem. Popular vulnerability databases contain nearly no entries regarding JavaScript libraries. During this entire work, we did not encounter a single popular library that had a dedicated mailing list for security announcements (in fact, most libraries we investigated did not have a mailing list for announcements at all). Furthermore, only a few JavaScript library developers provide a dedicated email address where users can submit vulnerability reports….
+
+
Consider jQuery, one of the most widely used libraries:
+
+ Although jQuery is an immensely popular library, the fact that searching for “security” or “vulnerability” in the official learning centre returns “Apologies, but nothing matched your search criteria” is an excellent summary of the state of JavaScript library security on the Internet, circa August 2016
+
+
Since we also know that many libraries are only indirectly loaded by web sites, and are brought in through third-party components such as advertising, tracking, and social media code, even web developers trying to stay on top of the situation may be unaware that they are indirectly introducing vulnerable code into their websites.
If you’re working with big data and Hadoop, this one paper could repay your investment in The Morning Paper many times over (ok, The Morning Paper is free – but you do pay with your time to read it). You know that moment when you’re working on a code base and someone says “why don’t we replace all this complex home-grown code and infrastructure with this pre-existing solution…?” That!
+
Here’s the big idea – for large HDFS installations, the single node in-memory metadata service is the bottleneck. So why not replace the implementation with a NewSQL database and spread the load across multiple nodes? In this instance, MySQL Cluster was used, but that’s pluggable. Of course, there will be some important design issues to address, but the authors do a neat job of solving these. I especially like that the paper is grounded in real world workloads from Spotify (and we get some nice insights into the scale of data at Spotify too as a bonus).
+
All very nice, but what difference does HopFS (a drop-in replacement) make in the real world? How about:
+
+
Enabling an order-of-magnitude larger clusters
+
Improving cluster throughput by an order-of-magnitude (16x – 37x)
+
Lower latency when using large numbers of concurrent clients
+
No downtime during failover
+
+
Think of the capital and operational costs of having to stand up a second large-scale Hadoop cluster because your existing one is capacity or throughput limited. HopFS is a huge win if it eliminates your need to do that.
+
NameNodes in Apache Hadoop vs HopFS
+
In vanilla Apache Hadoop, HDFS metadata is stored on the heap of a single Java process, the Active NameNode (ANN). The ANN logs changes to journal servers using quorum based replication. The change log is asynchronously replicated to a Standby NameNode. ZooKeeper is used to determine which node is active, and to coordinate failover from the active to the standby namenode. Datanodes connect to both active and standby namenodes.
+
+ In HDFS the amount of metadata is quite low relative to file data. There is approximately 1 gigabyte of metadata for every petabyte of file system data. Spotify’s HDFS cluster has 1600+ nodes, storing 60 petabytes of data, but its metadata fits in 140 gigabytes Java Virtual Machine (JVM) heap. The extra heap space is taken by temporary objects, RPC request queues and secondary metadata required for the maintenance of the file system. However, current trends are towards even larger HDFS clusters (Facebook has HDFS clusters with more than 100 petabytes of data), but current JVM garbage collection technology does not permit very large heap sizes, as the application pauses caused by the JVM garbage collector affects the operations of HDFS. As such, JVM garbage collection technology and the monolithic architecture of the HDFS namenode are now the scalability bottlenecks for Hadoop.
+
+
HopFS is a drop-in replacement for HDFS, based on HDFS v2.0.4. Instead of a single in-memory process, it provides a scale-out metadata service. Multiple stateless namenode processes handle client requests and store data in an external distributed database, MySQL Cluster. References to NDB throughout the paper refer to the Network DataBase storage engine for MySQL Cluster.
+
+
Partitioning
+
HDFS metadata contains information on inodes, blocks, replicas, quotas, leases and mappings (dirs to files, files to blocks, blocks to replicas).
+
+ When metadata is distributed, an application defined partitioning scheme is needed to shard the metadata and a consensus protocol is required to ensure metadata integrity for operations that cross shards.
+
+
The chosen partition scheme is based on a study of the relative frequency of operations in production deployments. Common file system operations (primary key, batched primary key, and partition pruned index scans) can be implemented using only low cost database operations.
+
+
File system metadata is stored in tables, with a directory inode represented by a single row in the Inode table. File inodes have more associated metadata, that is stored in a collected of related tables.
+
+ With the exception of hotspots, HopFS partitions inodes by their parents’ inode IDs, resulting in inodes with the same parent inode being stored on the same database shard.
+
+
A hinting mechanism allows e.g., the transaction for listing files in a directory to be initiated on a transaction coordinator on the shard holding the child inodes for the directory.
+
Hotspots are simply inodes that receive a high proportion of file system operations. The root inode is immutable and cached at all namenodes. The immediate children of top level directories receive special treatment to avoid them becoming hotspots – they are pseudo-randomly partitioned by hashing the names of the children. By default just the first two levels of the hierarchy receive this treatment.
+
Transactions
+
HopFS uses transactions for all operations, coupled with row-level locking to serialize conflicting inode operations. Taking multiple locks in a transaction can lead to deadlocks and timeouts unless care is take to avoid cycles and upgrade deadlocks.
+
To avoid cycle deadlocks, HopFS reimplemented all inode operations to acquire locks on the metadata in the same total order. (Root to leaves, left-ordered depth-first search). Upgrade deadlocks are prevented by acquiring all locks at the start of the transaction.
+
+ In HDFS, many inode operations contain read operations followed by write operations on the same metadata. When translated into database operations within the same transaction, this results in deadlocking due to lock upgrades from read to exclusive locks. We have examined all locks acquired by the inode operations, and re-implemented them so that all data needed in a transaction is read only once at the start of the transaction at the strongest lock level that could be needed during the transaction, thus preventing lock upgrades.
+
+
Inode operations proceed in three phases: lock, execute, and update.
+
+
Operations on large directories (e.g, containing millions of inodes) are too large to fit in a single transaction. A subtree operations protocol instead performs such operations incrementally in a series of transactions.
+
+ We serialize subtree operations by ensuring that all ongoing inode and subtree operations in a subtree complete before a newly requested subtree operation is executed. We implement this serialization property by enforcing the following invariants: (1) no new operations access the subtree until the operation completes, (2) the subtree is quiesced before the subtree operation starts, (3) no orphaned inodes or inconsistencies arise if failures occur.
+
+
+
Evaluation
+
For the evaluation, HopFS used NDB v7.5.3 deployed on 12 nodes configured to run 22 threads each, and with data replication degree 2. HDFS namenode suport was deployed on 5 servers: one active namenode, one standby namenode, and three journal nodes colocated with three ZooKeeper nodes. The benchmark used traces from Spotify’s 1600+ node cluster containing 60 Petabytes of data, 13 million directories, and 218 million files. This cluster runs on average 40,000 jobs a day from a variety of applications.
+
+ Figure 6 (below) shows that, for our industrial workload, using 60 namenodes and 12 NDB nodes, HopsFS can perform 1.25 million operations per second delivering 16 times the throughput of HDFS. As discussed before in medium to large Hadoop clusters 5 to 8 servers are required to provide high availability for HDFS. With equivalent hardware (2 NDB nodes and 3 namenodes), HopsFS delivers ≈10% higher throughput than HDFS. HopsFS performance increases linearly as more namenodes nodes are added to the system
+
+
+
HDFS reaches a file limit of about 470 million files due to constraints on the JVM heap size. HopFS needs about 1.5 times more memory in aggregate than HDFS to store metadata that is highly available, but it can scale to many more files…
+
+
A saturation test explored the maximum throughput and scalability of each file system operation. “In real deployments, the namenode often receives a deluge of the same file system operation type, for example, a big job that reads large amounts of data will generate a huge number of requests to read files and list directories.”
+
In the results below, HopFS’ results are displayed as a bar chart of stacked rectangles, each representing the increase in throughput when five new namenodes are added:
+
+
+ HopFS outperforms HDFS for all file system operations and has significantly better performance than HDFS for the most common file system operations.
+
+
When it comes to latency, it is true that HopFS is slower than HDFS for single filesystem operations on unloaded namenodes. But start to scale up the workload and you can quickly see HopFS has the advantage:
+
+
+ Large HDFS deployments may have tens of thousands of clients and the end-to-end latency observed by the clients increases as the file system operations wait in RPC call queues at the namenode. In contrast, HopFS can handle more concurrent clients while keeping operation latencies low.
+
+
HopFS provides much faster failover with no downtime too:
+
+
Surely there is some downside to HopFS?? Well, yes there is one: HopFS can only process about 30 block reports a second, whereas HDFS does 60. But HopFS doesn’t need block reports as often as HDFS does, and with datanodes sending block reports every six hours it can still scale to exabyte sized clusters.
+
The bottom line:
+
+ HopsFS is an open-source, highly available file system that scales out in both capacity and throughput by adding new namenodes and database nodes. HopsFS can store 37 times more metadata than HDFS and for a workload from Spotify HopsFS scales to handle 16 times the throughput of HDFS. HopsFS also has lower average latency for large number of concurrent clients, and no downtime during failover. Our architecture supports a pluggable database storage engine, and other NewSQL databases could be used.
+
]]>
+ https://blog.acolyer.org/2017/03/06/hopfs-scaling-hierarchical-file-system-metadata-using-newsql-databases/feed/
+ 5
+
+
+ adriancolyer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RNN models for image generation
+ https://blog.acolyer.org/2017/03/03/rnn-models-for-image-generation/
+ https://blog.acolyer.org/2017/03/03/rnn-models-for-image-generation/#comments
+ Fri, 03 Mar 2017 06:00:00 +0000
+
+
+
+
+ http://adriancolyer.wordpress.com/?p=4061
+ ]]>
+ Today we’re looking at the remaining papers from the unsupervised learning and generative networks section of the ‘top 100 awesome deep learning papers‘ collection. These are:
+
DRAW: A recurrent neural network for image generation
+
The networks we looked at yesterday generate a complete image all at once. This “one shot” approach is hard to scale to large images. If you ask a person to draw some visual scene, they will typically do so in a sequential iterative fashion, working from rough outlines to detail, first on one part, then on another.
+
+ The Deep Recurrent Attentive Writer (DRAW) architecture represents a shift towards a more natural form of image construction, in which parts of a scene are created independently from others, and approximate sketches are successively refined.
+
+
At its core, DRAW is a variational autoencoder (an autoencoder making use of variational inference techniques). The encoder and decoder however are both RNNs (LSTMs):
+
+ … a sequence of code samples is exchanged between them; moreover, the encoder is privy to the decoder’s previous outputs, allowing it to tailor the codes it sends according to the decoder’s behavior so far.
+
+
+
The decoder’s outputs are successively added to the distribution that will ultimately generate the data, as opposed to emitting it in a single step. This much takes care of the iterative part of human image construction. To model the phenomenon of working first on one part of the image, and then on another, an attention mechanism is used to restrict both the input region observed by the encoder, and the output region modified by the decoder.
+
+ In simple terms, the network decides at each time-step “where to read” and “where to write” as well as “what to write”.
+
+
The attention mechanism resembles the selective read and write operations of the Neural Turing Machine that we looked at last year, however it works in 2D. An array of 2D Guassian filters is applied to the image, which yields image patches of smoothly varying location and zoom.
+
+ As illustrated [below], the N ×N grid of Gaussian filters is positioned on the image by specifying the co-ordinates of the grid centre and the stride distance between adjacent filters. The stride controls the ‘zoom’ of the patch; that is, the larger the stride, the larger an area of the original image will be visible in the attention patch, but the lower the effective resolution of the patch will be.
+
+
+
Once a DRAW network has been trained, an image can be generated by iteratively picking latent samples and running the decoder to update the canvas matrix. Here we can see how images evolve when a trained DRAW network generates MNIST digits:
+
+
The final generated digits are pretty much indistinguishable from the originals.
+
+
Here’s another set of generated images, this time from a network trained on a multi-digit Street View House Numbers dataset:
+
+
Pixel recurrent neural networks
+
In contrast to DRAW, Pixel RNNs use a distinctly un-human approach: they model the probability of raw pixel values. The goal of the work is to be able to model natural images on a large scale, but the authors also evaluated Pixel RNNs on good old MNIST, and reported the best result so far (including against DRAW). There are two variations of the basic idea in the paper, a full-fat Pixel RNN architecture, and a simpler Pixel CNN one – both are substantial.
+
A Pixel RNN network has up to twelve two-dimensional LSTM layers:
+
+ These layers use LSTM units in their state and adopt a convolution to compute at once all the states along one of the spatial dimensions of the data.
+
+
To generate pixel , Pixel conditions on all the previously generated pixels left and above it.
+
+
There are two types of these layers: Row LSTM layers apply the convolution along each row of pixels; Diagonal BiLSTM layers apply the convolution along the diagonals of the image (like a bishop moving on a chessboard).
+
Here’s an illustration of the Row LSTM convolution with a kernel size of 3 (3 pixels wide). Notice how it fails to reach pixels on the far sides of the image in rows close to .
+
+
In contrast, the Diagonal BiLSTM’s dependency field covers the entire available context in the image:
+
+
A Pixel CNN network is fully convolution and has up to fifteen layers, “We observe that CNNs can also be used as a sequence model with a fixed dependency range, by using Masked convolutions.”
+
With Masked Convolution the R,G,B channels for the current pixel are predicted separately. When predicting the R channel, only the pixels left and above can be used for conditioning. But when we predict the G channel, we can also use the predicted value for R at the current pixel. And when we predict the B value, we can use the predicted values for both R and G.
+
+ To restrict connections in the network to these dependencies, we apply a mask to the input-to-state convolutions and to other purely convolutional layers in a PixelRNN. We use two types of masks that we indicate with mask A and mask B, as shown [below]. Mask A is applied only to the first convolutional layer in a PixelRNN and restricts the connections to those neighboring pixels and to those colors in the current pixels that have already been predicted. On the other hand, mask B is applied to all the subsequent input-to-state convolutional transitions and relaxes the restrictions of mask A by also allowing the connection from a color to itself.
+
+
+
The Pixel CNN is the fastest architecture, whereas Pixel RNNs with Diagonal BiLSTM layers perform the best in terms of generating likely images. For generation of larger images, Multiscale Pixel RNNs do even better.
+
+ The Multi-Scale PixelRNN is composed of an unconditional PixelRNN and one or more conditional PixelRNNs. The unconditional network first generates a smaller s × s image just like a standard PixelRNN described above, where s is a smaller integer that divides n. The conditional network then takes the s × s image as an additional input and generates a larger n × n image.
+
+
+
One fun experiment that shows the power of the method is to occlude the lower part of an image, and then ask a PixelRNN to complete the image. Here are some example generated completions (with the original in the right-hand column for comparison):
+
+
+ Based on the samples and completions drawn from the models we can conclude that the PixelRNNs are able to model both spatially local and long-range correlations and are able to produce images that are sharp and coherent. Given that these models improve as we make them larger and that there is
+ practically unlimited data available to train on, more computation and larger models are likely to further improve the results.
+
+
Auto-encoding variational Bayes
+
The auto-encoding paper is short and dense, and I don’t feel able to add much value to it, so here’s a very short summary of what to expect if you go on to read it. The opening sentence sets the tone:
+
+ How can we perform efficient approximate inference and learning with directed probabilistic models whose continuous latent variables and/or parameters have intractable posterior distributions? [Oh, and we want to do it with large datasets].
+
+
I bet you were wondering exactly that in the shower this morning! Let’s unpack this sentence to see what it’s all about:
+
+
‘efficient approximate inference and learning’ simply says that we want a training approach which is not too costly to compute.
+
‘directed probabilistic models‘ are graph models where the probability at some node is conditioned on the probabilities of other nodes, with directed edges in the graph from cause nodes to affected nodes.
+
‘continuous latent variables‘ suggests that there are true hidden causes for the observed behaviour, which are not directly represented in our model (latent). These are real-valued (i.e., not discrete).
+
‘intractable posterior distributions‘ means that we can’t calculate an exact answer for the output probability distribution, so we’ll need to approximate it.
+
The use of large datasets further stresses the need for efficiency.
+
+
The authors demonstrate a simple and efficient differentiable (i.e., easily trainable) estimator that fits the bill, which they call Stochastic Gradient Variational Bayes (SGVB). Using this in an autoencoder leads to Auto-Encoding Variational Bayes (AEVB).
+
If you’re feeling brave and want to dig in (or your knowledge of variational Bayesian methods is better than mine!), then these wikipedia entries on Variational Bayesian methods and Kullback-Leibler divergence might come in handy.
]]>
+ https://blog.acolyer.org/2017/03/03/rnn-models-for-image-generation/feed/
+ 1
+
+
+ adriancolyer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unsupervised learning and GANs
+ https://blog.acolyer.org/2017/03/02/unsupervised-learning-and-gans/
+ https://blog.acolyer.org/2017/03/02/unsupervised-learning-and-gans/#comments
+ Thu, 02 Mar 2017 06:00:00 +0000
+
+
+
+ http://adriancolyer.wordpress.com/?p=4059
+ ]]>
+ Continuing our tour through some of the ‘top 100 awesome deep learning papers,’ today we’re turning our attention to the unsupervised learning and generative networks section. I’ve split the papers here into two groups. Today we’ll be looking at:
+
Building high-level features using large-scale unsupervised learning
+
This is a fascinating paper. Consider an unsupervised learning scenario in which a deep autoencoder is fed a large number of images (the authors construct a training dataset by sampling frames from 10 million YouTube videos). Do the features learned by the encoder correspond in any way to the things that you and I might recognise as features? And are there even neurons that specialise for recognising certain types of object? If so, that would not only be really interesting in and of itself, but we could also figure out which objects fire in response to which objects, and so build a classifier.
+
+ This work investigates the feasibility of building high-level features from only unlabeled data. A positive answer to this question will give rise to two significant results. Practically, this provides an inexpensive way to develop features from unlabeled data. But perhaps more importantly, it answers an intriguing question as to whether the specificity of the “grandmother neuron” could possibly be learned from unlabeled data. Informally, this would suggest that it is at least in principle possible that a baby learns to group faces into one class because it has seen many of them and not because it is guided by supervision or rewards.
+
+
After training, the authors use a test set of 37,000 images sampled from the ‘Labeled faces in the Wild’ dataset and from ImageNet. These images are fed to the encoder, and the performance of each output neuron in classifying faces is measured…
+
+ Surprisingly, the best neuron in the network performs very well in recognizing faces, despite the fact that no supervisory signals were given during training. The best neuron in the network achieves 81.7% accuracy in detecting faces.
+
+
It’s worth letting that sink in for a moment – just by repeatedly showing the network bunches of pixels, it has learned to encode a feature that represents the pattern of a face, without ever even knowing that there is such a thing as a face a priori.
+
Here are the 48 test images that most strongly stimulate the ‘face’ neuron:
+
+
Definitely faces!
+
And somewhat creepily, here’s the ghost face that emerges when searching for the input that maximizes the firing of the neuron:
+
+
The neuron also turns out to be robust against ‘complex and difficult to hard-wire’ invariances such as out-of-phase rotation and scaling.
+
+ Having achieved a face-sensitive neuron, we would like to understand if the network is also able to detect other high-level concepts. For instance, cats and body parts are quite common in YouTube. Did the network also
+ learn these concepts?
+
+
A question of central importance to the Internet I’m sure you’ll agree, ‘is there a cat neuron, and if so what does the prototypical cat look like?’ And yes, there is a learned cat neuron, and there is a human body neuron too! Although the maximal stimulation ghost images aren’t as impressive as the face one. The human body shape you can just about make out. The cat face I swear I could see at one point, but as of this time of writing it’s gone again! A bit like one of those optical illusions you have to stare at until you suddenly ‘see’ it.
+
+
If you take a trained encoder and add a one-vs-all logistic classifier on top of the highest layer of the network, you have yourself a classifier…
+
Generative adversarial nets (GANs)
+
+ So far, the most striking successes in deep learning have involved discriminative models, usually those that map a high-dimensional, rich sensory input to a class label. These striking successes have primarily been based on the backpropagation and dropout algorithms, using piecewise linear units which have a particularly well-behaved gradient . Deep generative models have had less of an impact, due to the difficulty of approximating many intractable probabilistic computations that arise in maximum likelihood estimation and related strategies, and due to difficulty of leveraging the benefits of piecewise linear units in the generative context. We propose a new generative model estimation procedure that sidesteps these difficulties.
+
+
The core idea is simple to understand (the theoretical results showing why it works, a little less so!). Take a generator model G that generates (for example) images from noise. Pit it against a discriminator model D whose task it is to classify the image as either coming from the generator, or from the real data distribution.
+
+ The generative model can be thought of as analogous to a team of counterfeiters, trying to produce fake currency and use it without detection, while the discriminative model is analogous to the police, trying to detect the counterfeit currency. Competition in this game drives both teams to improve their methods until the counterfeits are indistiguishable from the genuine articles.
+
+
If the generative model and discriminative model are both multilayer perceptrons then both models can be trained using backpropagation and dropout. This special case is termed adversarial nets. We are searching for a solution where G recovers the training data distribution, and D is equal to 1/2 everywhere. Training alternates between k steps of optimizing D, and one step of optimizing G. “This results in D being maintained near its optimal solution, so long as G changes slowly enough.”
+
We want to learn the generator’s distribution over data . Given input noise variables , let be a differential function representation by a multilayer perceptron, with parameters . Let be a second multilayer perceptron outputting a single scalar representing the probability that came from the data rather than from .
+
+ We train D to maximize the probability of assigning the correct label to both training examples and samples from G. We simultaneously train G to minimize log(1 – D(G(z)).
+
+
+
Below are examples of samples generated using this technique from the MNIST and TFD datasets. The rightmost column is the nearest training example of the neighbouring sample.
+
+
Unsupervised representation learning with deep convolutional generative adversarial networks
+
In the first two papers we looked at unsupervised learning of image features and at GANs. Now we get to put the two together…
+
+ In this work, we hope to help bridge the gap between the success of CNNs for supervised learning and unsupervised learning. We introduce a class of CNNs called deep convolutional generative adversarial networks (DCGANs), that have certain architectural constraints, and show that they are a strong candidate for unsupervised learning.
+
Here’s the core idea: we can train a GAN (unsupervised learning), which must somewhere internally encode representations useful for images, and then reuse parts of the generator and discriminator networks as feature extractors for supervised tasks.
+
There’s a small catch though, previous attempts to scale up GANs using CNNs met with limited success, often being unstable to train and resulting in generators that produce nonsensical outputs.
+
+ … after extensive model exploration we identified a family of architectures that resulted in stable training across a range of datasets and allowed for training higher resolution and deeper generative models.
+
+
Here are the guidelines for training DCGANs:
+
+
Replace any pooling layers with strided convolutions – this allows the network to learn its own spatial downsampling.
+
Remove any fully connected hidden layers on top of convolutional features. The authors found that connecting the highest convolutional features to the input and output respectively of the generator and discriminator worked well.
+
Use batch normalization, which stabilizes learning by normalizing the input to each unit to have zero mean and unit variance.
+
Use ReLU activation for all generator layers, except for the final output layer where tanh works better
+
Use Leaky ReLU activation for all discriminator layers. (We can update that advice to PReLUs now).
+
+
+
DCGANs were trained on the Large-scene understanding (LSUN), ImageNet-1K and a Faces dataset. Here are examples of bedrooms generated after five epochs of training:
+
+
The discriminator network can then be used to build a supervised classifier:
+
+ To evaluate the quality of the representations learned by DCGANs for supervised tasks, we train on Imagenet-1k and then use the discriminator’s convolutional features from all layers, maxpooling each layers representation to produce a 4 × 4 spatial grid. These features are then flattened and concatenated to form a 28672 dimensional vector and a regularized linear L2-SVM classifier is trained on top of them. This achieves 82.8% accuracy, out performing all K-means based approaches.
+
+
Section 6 of the paper is the really fun part though. This is where the authors set out to investigate what kinds of features the network has learned.
+
+ If walking in the latent space results in semantic changes to the image generations (such as objects being added and removed), we can reason that the model has learned relevant and interesting representations…
+
+
And here a couple of compelling demonstrations that indicate this is indeed the case: a room without a window slowing being transformed into a room with a large window, and a TV slowly being transformed into a window.
+
+
+
+ We demonstrate that an unsupervised DCGAN trained on a large image dataset can also learn a hierarchy of features that are interesting. Using guided backpropagation as proposed by (Springenberg et al., 2014), we show in Fig.5 that the features learnt by the discriminator activate on typical parts of a bedroom, like beds and windows.
+
+
+
To see whether the generator learns specific object representations (as we saw in our first paper today) , the authors perform a similar analysis to find the neurons with the strongest activation in the presence of windows. Then random new samples are generated with (top row) and without (bottom row) these features included.
+
+
And now the moment you’ve been waiting for…
+
+ In the context of evaluating learned representations of words (Mikolov et al., 2013) demonstrated that simple arithmetic operations revealed rich linear structure in representation space. One canonical example demonstrated that the vector(”King”) – vector(”Man”) + vector(”Woman”) resulted in a vector whose nearest neighbor was the vector for Queen. We investigated whether similar structure emerges in the Z representation of our generators. We performed similar arithmetic on the Z vectors of sets of exemplar samples for visual concepts. Experiments working on only single samples per concept were unstable, but averaging the Z vector for three examplars showed consistent and stable generations that semantically obeyed the arithmetic.
+
+
In the picture below, the three top pictures in each column (Z vectors) were averaged to produce the picture (Z vector) you see below them, and then the vector operations were applied. The result is the center image in the box of nine that you see on the right-hand side, the other images surrounding it have small amounts of noise added.
+
+
And if you’ll indulge me one more time, here’s the extraction of a ‘turn’ vector by differencing left-facing and right-facing faces. When you apply it to new face images, you can change the pose!
+
+
Improved techniques for training GANs
+
This paper focuses on the use of GANs for semi-supervised learning and image generation, but along the way (as the title suggests), it makes key contributions in two areas: how to efficiently train GANs, and how to evaluate the quality of generated images.
+
+ … training GANs requires finding a Nash equilibrium of a non-convex game with continuous, high-dimensional parameters. GANs are typically trained using gradient descent techniques that are designed to find a low value of a cost function, rather than to find the Nash equilibrium of a game. When used to seek for a Nash equilibrium, these algorithms may fail to converge.
+
+
There are five heuristics for improving training.
+
+
Instead of directly maximising the output of the generator, require the generator to generate data matching the statistics of the real data. “Specifically, we train the generator to match the expected value of the features on an intermediate layer of the discriminator. This is a natural choice of statistics for the generator to match, since by training the discriminator we ask it to find those features that are most discriminative of real data versus data generated by the current model.” This process is called feature matching.
+
Use mini-batching to look at multiple data examples in combination. This help to prevent the generator collapsing to a mode where it always emits the same point.
+
Use historical averaging by adding a term to each player’s cost function that looks at the difference between the current parameter values and those over the last t time steps. ‘This approach is loosely inspired by the fictitious play algorithm that can find equilibria in other kinds of games.‘
+
Use one-side label smoothing. This is the idea of replacing 0 and 1 targets for a classifier with smoothed values, as we saw with distillation. Best results are obtained when smoothing only positive labels, leaving negative labels set to zero (hence ‘one-sided’).
+
Use virtual batch normalization. Chose a fixed reference set of examples at the start of training, and normalize this set using its own statistics. Then during training each example is normalized based on the statistics from this reference batch.
+
+
Now we turn our attention to the question of how to figure out whether the generated images are any good.
+
+ Generative adversarial networks lack an objective function, which makes it difficult to compare performance of different models.
+
+
One option is to use human judges (e.g. via Amazon Mechanical Turk) – this is comparatively slow though, and its hard to get consistent ratings. Seeking an automatic method to evaluate samples, the authors apply the Inception model to every generated image to get the conditional label distribution . If the generated image contains meaningful objects, we should expect the label distribution to have low entropy (i.e., to show strong preference for one or a small number of class labels because it is something that the Inception network recognises). And since we also want the model to generate varied images, then looking at the label distributions across a whole set of images should show high entropy (i.e., the generated images contain a variety of different objects). These two requirements are combined to create the Inception Score metric.
+
Now that we can train GANs efficiently, and we know how to evaluate the generator, we can use GAN generators during semi-supervised learning. The generated images are used to extend the training dataset (e.g. 50% real images, and 50% generated). It works like this:
+
+
Take any classifier, making predictions across K classes.
+
Increase the dimension of the classifier output by one, to make K+1 dimensions, this new generated class will represent generated images.
+
is therefore the probability assigned to being a generated image. This corresponds to in the original GAN framework.
+
We can now learn from both labeled and unlabeled data. Given unlabeled data we can use it for classifier training so long as the predicted class is not ‘generated.’
+
The loss function for training the classifier becomes .
+
+
+ In practice, Lunsupervised will only help if it is not trivial to minimize for our classifier and we thus need to train G to approximate the data distribution. One way to do this is by training G to minimize the GAN game-value, using the discriminator D defined by our classifier. This approach introduces an interaction between G and our classifier that we do not fully understand yet, but empirically we find that optimizing G using feature matching GAN works very well for semi-supervised learning, while training G using GAN with minibatch discrimination does not work at all.
+
+
When used purely for image generation though, minibatch discrimination yields better results, as can be seen in these generated MNIST digits:
+]]>
+ https://blog.acolyer.org/2017/03/02/unsupervised-learning-and-gans/feed/
+ 2
+
+
+ adriancolyer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Optimisation and training techniques for deep learning
+ https://blog.acolyer.org/2017/03/01/optimisation-and-training-techniques-for-deep-learning/
+ https://blog.acolyer.org/2017/03/01/optimisation-and-training-techniques-for-deep-learning/#respond
+ Wed, 01 Mar 2017 06:00:00 +0000
+
+
+
+ http://adriancolyer.wordpress.com/?p=4057
+ ]]>
+ Today we’re looking at the ‘optimisation and training techniques’ section from the ‘top 100 awesome deep learning papers’ list.
+
A machine learning model is itself parameterised by a large number of different parameters (e.g., learning rate, number of hidden units, strength of weight regularization). How you set these hyper-parameters can have a big impact on the overall results achieved, but finding an optimal set of hyper-parameters is far from easy. Essentially it boils down to picking some sets of parameters and trying them to see how well they work. How do you choose which sets to pick though? Even with a relatively small number of parameters it’s impossible to do an exhaustive search as the search space grows exponentially with the number of hyper-parameters. Furthermore, each trial is expensive – you have to train the full model using the hyper-parameters and see how well it performs, so practically you can’t do too many of them. In fact, it’s plain to see that you can only cover a tiny fraction of the overall search space.
+
Two common approaches for finding good hyper-parameter values as of 2012 were human intuition guided search, and a grid search in which you explore points in an evenly spaced grid laid over the search space.
+
+ A major drawback of manual search is the difficulty in reproducing results. This is important both for the progress of scientific research in machine learning as well as for ease of application of learning algorithms by non-expert users. On the other hand, grid search along does very poorly in practice (as discussed here).
+
+
What the authors show, is that a random search turns out to be a surprisingly effective technique, while also being just as easy to implement as a parallel search. The reason random search turns out to work so well is due to two key properties:
+
+
It turns out that the parameter space has a low effective dimensionality . That is, some parameters matter much more than others when it comes to finding good settings.
+
Which parameters those are varies according to the dataset (i.e., you can’t just find the two most important parameters for some model architecture and then always optimise based on just those).
+
+
If a researcher could know ahead of time which subspaces are important, then they could design an appropriate grid. But when they can’t know this, grid search fails. Consider the following simple illustration in 2-dimensional space. We have one parameter that turns out to be important (on the x-axis) and one that turns out to be unimportant (on the y-axis).
+
+
The grid search only touches three points along the important dimension, whereas the random search tests nine points – thus the random search has a much better chance of finding a good setting along this dimension.
+
To study the effects with real networks the authors plot random experiment efficiency curves, which look like this:
+
+
At each point x on the x-axis, you are seeing the results of exploring multiple hyper-parameter optimisation experiments, where each experiment trialled x different hyper-parameter sets. Thus on the y-axis we see the accuracy you could expect to achieve if running a hyper-parameter search with x trials.
+
+ There are two general trends in random experiment efficiency curves, such as the one in Figure 2: a sharp upward slope of the lower extremes as experiments grow, and a gentle downward slope of the upper extremes. The sharp upward slope occurs because when we take the maximum over larger subsets of the S trials, trials with poor performance are rarely the best within their subset. It is natural that larger experiments find trials with better scores. The shape of this curve indicates the frequency of good models under random search, and quantifies the relative volumes (in search space) of the various levels of performance.
+
+
Now that we know how to interpret those curves, here are the results of neural network hyper-parameter optimisation experiments using random search, as compared to grid search (the blue line):
+
+
And this plot reinforces the point that only a small number of parameters are significant in each case, but the relative important of each individual hyper-parameter varies from one dataset to the next:
+
+
Deep networks have way more hyper-parameters, and we’d expect manual search to have more impact here. Experiments with a Deep Belief Network (DBN) with 32 hyper-parameters across 8 different datasets showed that random search found a better model than manual search for one dataset, an equally good model in four, and an inferior model in three.
+
+ In this more challenging optimization problem, random search is still effective, but not superior as it was in the case of neural network optimisation.
+
+
There is a huge body of work on global optimisation, much of which could be applied to hyper-parameter optimisation. However, grid search and random search have the advantage of being very simple to understand and implement.
+
+ With so many sophisticated algorithms to draw on, it may seem strange that grid search is still widely used, and, with straight faces, we now suggest using random search instead. We believe the reason for this state of affairs is a technical one. Manual optimization followed by grid search is easy to implement: grid search requires very little code infrastructure beyond access to a cluster of computers. Random search is just as simple to carry out, uses the same tools, and fits in the same workflow. Adaptive search algorithms on the other hand require more code complexity. They require client-server architectures in which a master process keeps track of the trials that have completed, the trials that are in progress, the trials that were started but failed to complete.
+
+
Improving neural networks by preventing co-adaptation of feature detectors
+
This short paper presents a very simple technique to reduce overfitting when training networks. For each training example presented to the network, each hidden unit is randomly omitted with probability 0.5. We call this dropout. Dropout prevents complex co-adaptations of feature detectors since a given hidden unit cannot rely on other hidden units being present. This ensures each neuron learns to make an independently useful contribution.
+
+
+ Another way to view the dropout procedure is as a very efficient way of performing model averaging with neural networks. A good way to reduce the error on the test set is to average the predictions produced by a very large number of different networks. The standard way to do this is to train many separate networks and then to apply each of these networks to the test data, but this is computationally expensive during both training and testing. Random dropout makes it possible to train a huge number of different networks in a reasonable time. There is almost certainly a different network for each presentation of each training case but all of these networks share the same weights for the hidden units that are present.
+
+
Here’s an example of dropout at work, where you can see it makes a big difference to the test error.
+
+
After some experimentation, a dropout probability of 50% for hidden layers and 20% for input units seems to work well.
+
Dropout: a simple way to prevent neural networks from overfitting
+
This is a longer paper from many of the same authors exploring the same fundamental idea as above. We get a much more comprehensive set of evaluations, which show that dropout can improve neural net performance in a wide variety of application domains including object classification, digit recognition, speech recognition, document classification, and analysis of computational biology data. “This suggests that dropout is a general technique and is not specific to any domain.” The idea can also be extended to other models, and the authors show an application with Restricted Boltzman Machines.
+
We also get a slightly deeper explanation of what’s going on when dropout is used, and how to test using a model trained using dropout:
+
+ Applying dropout to a neural network amounts to sampling a “thinned” network from it. The thinned network consists of all the units that survived dropout. A neural net with n units, can be seen as a collection of 2n possible thinned neural networks. These networks all share weights so that the total number of parameters is still O(n2), or less. For each presentation of each training case, a new thinned network is sampled and trained. So training a neural network with dropout can be seen as training a collection of 2n thinned networks with extensive weight sharing, where each thinned network gets trained very rarely, if at all.
+
+
At test time, you use the network as a single neural net, but with weights that are scaled-down versions of the trained weights. If a unit is retained with probability p during training, the outgoing weights of that unit are multiplied by p when testing.
+
A form of regularisation called max-norm regularisation was found to work well in conjunction with dropout. This simply constrains the norm of the weight vector at each hidden unit to be (upper) bounded by a fixed constant c (clipping). If w is the vector of weights, then we want .
+
+ Although dropout alone gives significant improvements, using dropout along with max-norm regularization, large decaying learning rates and high momentum provides a significant boost over just using dropout.
+
+
Dropout does have one disadvantage: it increases training by a factor of 2-3. Thus you can trade off between overfitting and training time by tweaking the dropout rate.
+
Appendix A contains some useful hints for training dropout networks in practice.
+
Adam: a method for stochastic optimization
+
+ Stochastic gradient-based optimization is of core practical importance in many fields of science and engineering… Stochastic gradient descent proved itself as an efficient and effective optimization method that was central in many machine learning success stories, such as recent advances in deep learning.
+
+
Adam is a stochastic optimisation technique for high-dimensional parameter spaces and noisy objectives (such as the noise introduced by using dropouts). It has per-parameter adaptive learning rates, and combines the advantages of two recent methods you may have seen popping up in papers: AdaGrad and RMSProp. It also works well in online settings, is straightforward to implement, and requires little memory.
+
+ Some of Adam’s advantages are that the magnitudes of parameter updates are invariant to rescaling of the gradient, its stepsizes are approximately bounded by the stepsize hyper-parameter, it does not require a stationary objective, it works well with sparse gradients, and it naturally performs a form of step size annealing.
+
+
When used in logistic regression, Adam gives similar convergence as SGD with momentum (Nesterov), and faster convergence than Adagrad:
+
+
Fast convergence is also demonstrated with MNIST multi-layer neural networks :
+
+
And finally, Adam gives very impressive results when used with convolutional neural networks.
+
+
+ Overall, we found Adam to be robust and well-suited to a wide range of non-convex optimization problems in the field of machine learning.
+
+
The pseudo-code for Adam is shown below:
+
+
+ The algorithm updates exponential moving averages of the gradient (mt) and the squared gradient (vt) where the hyper-parameters β1, β2 ∈ [0, 1) control the exponential decay rates of these moving averages. The moving averages themselves are estimates of the 1st moment (the mean) and the 2nd raw moment (the uncentered variance) of the gradient. However, these moving averages are initialized as (vectors of) 0’s, leading to moment estimates that are biased towards zero, especially during the initial timesteps, and especially when the decay rates are small (i.e. the βs are close to 1). The good news is that this initialization bias can be easily counteracted, resulting in bias-corrected estimates and .
+
+
Initialization bias correction is discussed in section 3 of the paper, the short version is that you divide by to correct the first moment estimate, and by to correct the second moment estimate (as can be seen in the algorithm pseudocode).
+
The hyper-parameter α sets an upper bound on the magnitude of steps in parameter space, and therefore “we can often deduce the right order of magnitude of α such that optima can be reached from θ0 within some number of iterations.”
+
Sebastian Ruder has a very helpful blog post entitled “An overview of gradient descent optimisation algorithms” that starts with vanilla SGD, shows some of the issues with it, and introduces a series of algorithms leading up to Adam that gradually chip away at those issues. There’s a nice animated visualisation too.
+
Batch normalization: accelerating deep network training by reducing internal covariate shift
+
Network training converges faster if inputs to the network are whitened. That is, inputs are linearly transformed to have zero means and unit variances. But consider a multi-layer network, by the time we’re a few layers in, the inputs to layer n are now some combinations of the outputs of layer n-1, and as training progresses we lose the normalisation effect. This brings back some of the problems than normalisation/whitening are intended to reduce: vanishing gradients, slow training, and saturation.
+
The fancy name for this change in the distributions of the internal nodes of a deep network over the course of time during training is Internal Covariate Shift. The central idea of batch normalisation is to bring back the benefits of normalisation not just for the initial inputs, but at every layer of the network. In theory this would give us faster convergence, and in practice it seems to be much faster:
+
+ … we apply Batch Normalization to the best-performing ImageNet classification network, and show that we can match its performance using only 7% of the training steps…
+
+
(I’ll just pause there for a moment to let that sink in)
+
+ … and can further exceed its accuracy by a substantial margin. Using an ensemble of such networks trained with Batch Normalization, we achieve a top-5 error rate that improves upon the best known results on ImageNet classification.
+
+
In batch normalisation, each scalar feature in a layer is independently normalised by making it have a mean of zero and variance of 1. For the kth dimension:
+
+
where the expectation and variance are computed over the training set data. Assuming mini-batch based stochastic gradient descent training, then in each mini-batch we will produce estimates of the mean and variance of each activation. “This way, the statistics used for normalization can fully participate in the gradient backpropagation.”
+
The full Batch Normalization Transform is as follows, where &eps; is a constant added to the mini-batch variance for numerical stability:
+
+
The parameters γ and β are used to scale and shift the normalized value, so that normalisation does not end up constraining what the layer can represent.
+
+ To Batch-Normalize a network, we specify a subset of activations and insert the BN transform for each of them, according to Alg. 1. Any layer that previously received x as the input, now receives BN(x). A model employing Batch Normalization can be trained using batch gradient descent, or Stochastic Gradient Descent with a mini-batch size m \> 1, or with any of its variants such as Adagrad [or Adam].
+
+
When using batch normalisation, the following changes are also recommended:
+
+
increasing the learning rate (batch normalisation allows faster learning with no adverse effects)
+
removing dropout (batch normalisation achieves some of the same goals, and avoids overfitting)
+
reducing L2 weight regularization (by a factor of 5 in the author’s tests)
+
accelerating the learning rate decay (6x faster)
+
removing local response normalisation if you are using it
+
shuffle training examples more thoroughly
+
use less distortion of images in training sets, to let the trainer focus more on ‘real’ images
+
+
Delving deep into rectifiers: surpassing human-level performance on ImageNet classification
+
+ … the rectifier neuron, Rectified Linear Unit (ReLU) is one of several keys to the recent success of deep networks. It expedites convergence of the training procedure and leads to better solutions than conventional sigmoid-like units. Despite the prevalence of rectifier networks, recent improvements of models and theoretical guidelines for training them have rarely focused on the properties of the rectifiers.
+
+
In other words, everybody is just using the standard ReLU that looks like this:
+
+
The authors make two key advances in this paper. Firstly they show a modified version of the standard ReLU, called a Parametric Rectified Linear Unit (PReLu) which can adaptively learn the parameters of the rectifiers, improving accuracy at negligible extra computing cost. Secondly they introduce a new method for initialising parameters which helps with the convergence of very deep models trained directly from scratch.
+
Do these enhancements make a big difference? Yes!
+
+ Based on the learnable activation and advanced initialization, we achieve 4.94% top-5 test error on the ImageNet 2012 classification dataset. This is a 26% relative improvement over the ILSVRC 2014 winner (GoogLeNet, 6.66%). To our knowledge, our result is the first to surpass the reported human-level performance (5.1%,) on this dataset.
+
+
PReLus have a learned parameter a which controls the slope of the negative part:
+
+
(Note that when a is small and fixed, PReLu becomes Leaky ReLU).
+
PreLU is trained using backpropagation and optimized simultaneously with other layers.
+
+ Rectifier networks are easier to train than tradititional sigmoid-like activation networks, but a bad initialization can still hamper the learning of a highly non-linear system…
+
+
Deep CNNs are typically initialised with random weights drawn from Gaussian distribution, but this can lead to situations where the magnitudes of input signals are reduced or magnified exponentially. Instead, it is better to draw initial weights from a zero-mean Gaussian distribution with standard deviation for forward propagation, and for backpropagation ( is the number of connections in the layer). Doing this avoids the exponential problem. See §2.2 for the full gory details.
+]]>
+ https://blog.acolyer.org/2017/03/01/optimisation-and-training-techniques-for-deep-learning/feed/
+ 0
+
+
+ adriancolyer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ When DNNs go wrong – adversarial examples and what we can learn from them
+ https://blog.acolyer.org/2017/02/28/when-dnns-go-wrong-adversarial-examples-and-what-we-can-learn-from-them/
+ https://blog.acolyer.org/2017/02/28/when-dnns-go-wrong-adversarial-examples-and-what-we-can-learn-from-them/#comments
+ Tue, 28 Feb 2017 06:00:00 +0000
+
+
+
+
+ http://adriancolyer.wordpress.com/?p=4055
+ ]]>
+ Yesterday we looked at a series of papers on DNN understanding, generalisation, and transfer learning. One additional way of understanding what’s going on inside a network is to understand what can break it. Adversarial examples are deliberately constructed inputs which cause a network to produce the wrong outputs (e.g., misclassify an input image). We’ll start by looking at ‘Deep Neural Networks are Easily Fooled’ from the ‘top 100 awesome deep learning papers list,’ and then move on to some other examples cited in the excellent recent OpenAI post on “Attacking machine learning with adversarial examples.”
+
Clearly it’s an armadillo! I’ll make it easier for you… these are five different images of a digit between 0 and 9, but which one?
+
+
(It’s a 4, obviously).
+
What you’re seeing here are adversarial images, deliberately crafted to classify as some class x, while clearly looking nothing like the target class from a human perspective.
+
+ … it is easy to produce images that are completely unrecognizable to humans, but that state-of-the-art DNNs believe to be recognizable objects with 99.99% confidence (e.g., labelling with certainty that white noise static is a lion).
+
+
The fact that we can do this tells us something about interesting about the differences between DNN vision and human vision. Clearly, the DNNs are not learning to interpret images in the same way that we do.
+
The adversarial images are created using an evolutionary algorithm (EA) that evolves a population of images. Standard EAs use a single fitness function, but the authors here use a new algorithm called MAP-Elites that allows simultaneous evolution of a population containing individuals scoring well on many classes – in each round the best individual so far for each objective is kept. Two different mutation strategies are tested: one that directly encodes pixels in grayscale and then mutates their values, and one that uses an indirect encoding based on a compositional pattern-producing network (CPNN) which can evolve complex regular images that resemble natural and man-made objects.
+
(Click for larger view)
+
Take MNIST as an example (digits 0-9). Starting with clean images, within 50 generations images are produces that MNIST DNNs will misclassify with 99.99% confidence but are unrecognisable as such. These images were created used the direct encoding mutation:
+
+
And these were created using the indirect encoding mutation:
+
+
Using the CPNN encoding and deliberately evolving images to match target DNN classes results in a wide variety of images:
+
+
+ For many of the produced images, one can begin to identify why the DNN believes the image is of that class once given the class label. This is because evolution need only produce features that are unique to, or discriminative for, a class, rather than produce an image that contains all of the typical features of a class.
+
+
By removing some of the repeated elements from the generated images, the confidence score of the DNN drops. “These results suggest that DNNs tend to learn low and middle-level features rather than the global structure of objects.”
+
You might wonder if we can make a DNN more robust to such adversarial images by extending the training regime to include such negative examples. The authors tried this, but found that it was always possible to generate new adversarial examples that still fooled the resulting network (this remained true even after 15 iterations of the process).
+
Why is it so easy to generate adversarial examples? Discriminative models create decision boundaries that partition data into classification regions. In a high-dimensional input space, the area a model allocates to a class may be much larger than the area occupied by training examples for the class. This leaves plenty of room for adversarial images…
+
+
We now turn our attention from adversarial examples as a way of understanding what DNNs are doing, to adversarial examples as a way of attacking DNNs..
+
+ The fact that DNNs are increasingly used in a wide variety of industries, including safety-critical ones such as driverless cars, raises the possibility of costly exploits via techniques that generate fooling images…
+
+
Practical black-box attacks against deep learning systems using adversarial examples
+
This is a panda (59.7% confidence):
+
+
But this is obviously a gibbon (99.3% confidence):
+
+
(From ‘Explaining and harnessing adversarial examples,’ which we’ll get to shortly).
+
The goal of an attacker is to find a small, often imperceptible perturbation to an existing image to force a learned classifier to misclassify it, while the same image is still correctly classified by a human. Previous techniques for generating adversarial images relied on either access to the full training set, and/or the hidden weights in the network. What this paper shows is that successful attacks can be mounted even without such information – all you need is the ability to pass an input to the classifier, and learn the resulting predicted class.
+
+ Our threat model thus corresponds to the real-world scenario of users interacting with classifiers hosted remotely by a third-party keeping the model internals secret. In fact, we instantiate our attack against classifiers served by MetaMind, Amazon, and Google. Models are automatically trained by the hosting platform. We are capable of making labeling prediction queries only after training is completed. Thus, we provide the first correctly blinded experiments concerning adversarial examples as a security risk.
+
+
The attack works by training a substitute model (owned by the attacker) using the target DNN as an oracle. Target inputs are synthetically generated, passed to the oracle (system under attack), and the output labels becomes the training labels for the substitute model. One the substitute DNN has been trained, adversarial images can be created that succeed against the substitute DNN, using normal white box techniques.
+
(Click for larger view)
+
Crucially, the images that fool the substitute network also turn out to often force the same misclassifications in the target model. Since the attacker only needs to (presumably) find one such image that transfers successfully this should be possible with high likelihood. It doesn’t even matter if the substitute DNN has a different architecture to the target model (which it likely will, because we assume the attacker does not know the target architecture) – so long as the substitute DNN is appropriate to the kind of classification task (e.g. CNN for image classification) the attack works well. In fact, the attack doesn’t only work with DNN targets – it generalizes to additional machine learning models (tested with logistic regression, SVMs, decision trees, and nearest neighbours).
+
The authors showed the ability to attack networks blind by using three cloud ML services provide by MetaMind, Google, and Amazon respectively. In each case training data is uploaded to the service, which learns a classifier (the user has no idea what model the service uses for this). Then the substitute network technique is used to find examples that fool the learned classifier.
+
+ An adversary using our attack model can reliably force the DNN trained using MetaMind on MNIST to misclassify 82.84% of adversarial examples crafted with a perturbation not affecting human recognition.
+
+
An Amazon classifier that achieved 92.17% test accuracy on MNIST could be fooled by 96.19% of adversarial examples. The Google classifier achieved 92% test accuracy on MNIST and could be fooled by 88.94% of adversarial examples. Defences based on gradient masking are not effective against the substitute attack.
+
Adversarial examples in the physical world
+
So now we know that you don’t need access to a model in order to successfully attack it. But there’s more…
+
+ Up to now, all previous work has assumed a threat model in which the adversary can feed data directly into the machine learning classifier. This is not always the case for systems operating in the physical world, for example those which are using signals from cameras and other sensors as input. This paper shows that even in such physical world scenarios, machine learning systems are vulnerable to adversarial examples. We demonstrate this by feeding adversarial images obtained from a cell-phone camera to an ImageNet Inception classifier and measuring the classification accuracy of the system. We find that a large fraction of adversarial examples are classified incorrectly even when perceived through the camera.
+
+
The authors print clean and adversarial images, take photos of the printed images, crop those photos to be the same size as the originals, and then pass these into the classifier. The procedure takes place with manual photography and no careful control of lighting, camera angle etc., thus in introduces nuisance variability with the potential to destroy adversarial perturbations depending on subtle changes.
+
+
+ Overall, the results show that some fraction of adversarial examples stays misclassified even after a non-trivial transformation: the photo transformation. This demonstrates the possibility of physical adversarial examples. For example, an adversary using the fast method with ε = 16 could expect that about 2/3 of the images would be top-1 misclassified and about 1/3 of the images would be top-5 misclassified. Thus by generating enough adversarial images, the adversary could expect to cause far more misclassification than would occur on natural inputs.
+
+
Other physical attacks mentioned in prior work include generation of audio inputs that mobile phones recognise as intelligible voice commands but humans hear as an unintelligible voice, and face recognition systems fooled by previously captured images of an authorized user’s face…
+
+ An adversarial example for the face recognition domain might consist of very subtle markings applied to a person’s face, so that a human observer would recognize their identity correctly, but a machine learning system would recognize them as being a different person.
+
+
Explaining and harnessing adversarial examples
+
Why do these adversarial examples work? Goodfellow et al. show us that all we need in order to be vulnerable is linear behavior in a high-dimensional space.
+
+ [The] results suggest that classifiers based on modern machine learning techniques, even those that obtain excellent performance on the test set, are not learning the true underlying concepts that determine the correct output label. Instead, these algorithms have built a Potemkin village that works well on naturally occuring data, but is exposed as a fake when one visits points in space that do not have high probability in the data distribution.
+
+
Consider a high-dimensional linear classifier, where the weight vector w has n dimensions. Each individual input feature has limited precision (e.g., using 8 bits per pixel in digital images, thus discarding all information below 1/255 of the dynamic range). For any one input, making a small change (smaller than the precision of the features) would not be expected to change the overall prediction of the classifier. However…
+
+ … we can make many infinitesimal changes to the input that add up to one large change to the output. We can think of this as a sort of ‘accidental steganography,’ where a linear model is forced to attend exclusively to the signal that aligns most closely with its weights, even if multiple signals are present and other signals have much greater amplitude.
+
+
We can maximise the impact of the many small changes by aligning the changes with the sign of the corresponding weight. This turns out to be a fast way of generating adversarial images.
+
+
+ An intriguing aspect of adversarial examples is that an example generated for one model is often misclassified by other models, even when they have different architecures or were trained on disjoint training sets. Moreover, when these different models misclassify an adversarial example, they often agree with each other on its class. Explanations based on extreme non-linearity and overfitting cannot readily account for this behavior…
+
+
But under the linear explanation, adversarial examples occur in broad subspaces – this explains why adversarial examples are abundant and why an example misclassified by one classifier has a fairly high probability of being misclassified by another. It’s the direction of perturbation, rather than the specific point in space, that matters most.
+
(Click for larger view)
+
+ Our explanation suggests a fundamental tension between designing models that are easy to train due to their linearity and designing models that use nonlinear effects to resist adversarial perturbation. In the long run, it may be possible to escape this tradeoff by designing more powerful optimization methods that can successfully train more nonlinear models.
+
+
Distillation as a defense to adversarial perturbations against deep neural networks
+
Yesterday we looked at distillation as a way of transferring knowledge from large models to smaller models. In ‘Distillation as a defense…,’ Papernot et al. show that the distillation technique (training using the probability distribution as the target, not just the argmax class label) can also be used to greatly reduce the vulnerability of networks to adversarial perturbations.
+
+ We formulate a new variant of distillation to provide for defense training: instead of transferring knowledge between different architectures, we propose to use the knowledge extracted from a DNN to improve its own resilience to adversarial samples.
+
+
With a DNN trained on the MNIST dataset, defensive distillation reduces the success rate of adversarial sample crafting from 95.89% to just 0.45%! For a DNN trained on the CIFAR dataset, the success rate was reduced from 87.89% to 5.11%. In fact, defensive distillation can reduce the sensitivity of a DNN to input perturbations by a whopping factor of 1030. This increases the minimum number of input features that need to be perturbed for adversarial samples to succeed by up to 8x in tests.
+
Here are some examples from MNIST and CIFAR showing legitimate and adversarial samples:
+
+
So how and why does defensive distillation work? Consider a general adversarial crafting framework that works by first figuring out the directions around a given input sample in which the model learned by a DNN is most sensitive, and then uses this information to select a perturbation among the input dimensions.
+
(Click for larger view)
+
If the direction gradients are steep, we can make a big impact with small perturbations, but if they are shallow this is much harder to achieve. Think about the difference between being on a ‘ridge’ in the classification space whereby a small move to either side could see you tumbling down the mountain, and being on a plateau where you can freely wander around without much consequence.
+
+ To defend against such perturbations, one must therefore reduce these variations around the input, and consequently the amplitude of adversarial gradients. In other words, we must smooth the model learned during training by helping the network generalize better to samples outside of its training dataset.
+
+
The ‘robustness’ of a DNN to adversarial samples is correlated with classifying inputs relatively consistently in the neighbourhood of a given sample.
+
+
To achieve this smoothing, distillation defense first trains a classification network as normal. Then we take another fresh model instance with the exact same architecture (no need to transfer to a smaller model) and train it using the probability vectors learned by the first model.
+
+ The main difference between defensive distillation and the original distillation proposed by Hinton et al. is that we keep the same network architecture to train both the original network as well as the distilled network. This difference is justified by our end which is resilience instead of compression.
+
+
(Click for larger view)
+
Training the network in this way with explicit relative information about classes prevents it from fitting too tightly to the data, and hence contributes to better generalization.
+
The following figure shows how the distillation temperature impacts the model’s ability to defend against adversarial samples. Intuitively, the higher the temperature the greater the smoothing, and thus the better the defence.
+
(Click for larger view)
+
Distillation has only a small impact on classification accuracy, and may even improve it!
+
We know that many different machine learning models are vulnerable to adversarial attacks, but the defensive distillation defense is only applicable to DNN models that produce an energy-based probability distribution for which a temperature can be defined…
+
+ However, note that many machine learning models, unlike DNNs, don’t have the model capacity to be able to resist adversarial examples… A defense specialized to DNNs, guaranteed by the universal approximation property to at least be able to represent a function that correctly processes adversarial examples, is thus a significant step towards building machine learning models robust to adversarial samples.
+
+ In this short paper, we demonstrate that defensive distillation is not effective. We show that, with a slight modification to a standard attack, one can find adversarial examples on defensively distilled networks. We demonstrate the attack on the MNIST digit recognition task. Distillation prevents existing techniques from finding adversarial examples by increasing the magnitude of the inputs to the softmax layer. This makes an unmodified attack fail. We show that if we artificially reduce the magnitude of the input to the softmax function, and make two other minor changes, the attack succeeds. Our attack achieves successful targeted misclassification on 96.4% of images by changing on average 4.7% of pixels.
+
+
Damn!
+
Vulnerability of deep reinforcement learning to policy induction attacks
+
If you weren’t there already, this is where we get to the ‘Oh *#@!’ moment! We’ve seen that classifiers can be fooled, but this paper and the next one show us that deep reinforcement learning networks (e.g. DQNs) are also vulnerable to adversarial attack. The attack is demonstrated on Atari games (what else!), but the broader implications are sobering:
+
+ The reliance of RL on interactions with the environment gives rise to an inherent vulnerability which makes the process of learning susceptible to perturbation as a result of changes in the observable environment. Exploiting this vulnerability provides adversaries with the means to disrupt or change control policies, leading to unintended and potentially harmful actions. For instance, manipulation of the obstacle avoidance and navigation policies learned by autonomous Unmanned Aerial Vehicles (UAV) enables the adversary to use such systems as kinetic weapons by inducing actions that lead to intentional collisions.
+
+
Fortunately, we’ve already seen many of the building blocks needed to craft the attack, so we can describe it quite succinctly. The goal of the attacker is to fool a DQN into taking an action (inducing an arbitrary policy) chosen by the attacker. The assumed threat model is similar to the ‘black-box’ model we saw earlier in this post: the attacker has no visibility of the insides of the DQN, and does not know its reward function. However, the attacker can see the same environmental inputs that the target DQN sees, and it can observe the actions taken by the DQN and hence estimate the reward function.
+
The first step is to us the ‘Practical black-box attack…’ technique to train a substitute DQN that matches the policies chosen by the target. Following the black-box playbook we now craft adversarial inputs (instead of images) that trigger an incorrect choice of optimal action…
+
+ If the attacker is capable of crafting adversarial inputs s’t and s’t+1 such that the value of [the training function] is minimized for a specific action a’, then the policy learned by the DQN at this time-step is optimized for suggesting a’ as the optimal action given the state st.
+
+
(An example of adversarial inputs might be manipulating some of the screen input pixels in an Atari game).
+
At this point we have a DQN which has learned an adversarial policy. The next step in the playbook is to find a way to transfer this learned adversarial policy to the target network. This is done in an exploitation cycle:
+
+
The first question we need to answer therefore, is ‘is it possible to generate adversarial examples for DQNs?’ Fig. 4 below shows that yes, this is indeed possible (game of Atari Pong, using both the Fast Gradient Sign and Jacobian Saliency Map Algorithm approaches to generate adversarial perturbations)
+
+
The next question we have to answer, is whether or not these adversarial examples can be transferred. The answer again is yes, with high success rate:
+
+
+ Our final experiment tests the performance of our proposed exploitation mechanism. In this experiment, we consider an adversary whose reward value is the exact opposite of the game score, meaning that it aims to devise a policy that maximizes the number of lost games. To obtain this policy, we trained an adversarial DQN on the game, whose reward value was the negative of the value obtained from target DQN’s reward function…
+
+
A picture is worth a thousand words here:
+
+
Since all known counter-measures have been shown not to be sufficient,
+
+ … it is hence concluded that the current state of the art in countering adverse examples and their exploitation is incapable of providing a concrete defense against such exploitations.
+
+
Adversarial attacks on neural network policies
+
Almost in parallel to the previous paper, Huang et al. published this work which also shows that reinforcement learning networks are vulnerable to adversarial attacks. They demonstrate this across four different Atari games (Chopper Command, Pong, Seaquest, and Space Invaders) using white-box attacks. They also show that the attacks succeed across a range of deep reinforcement learning algorithms (DQN, TRPO, and A3C). Policies trained with TRPO and A3C are more resistant, but not safe from the attack.
+
Then the authors demonstrate transfer capabilities using black-box attacks too:
+
+ We observe that the cross-dataset transferability property also holds in reinforcement learning applications, in the sense that an adversarial example designed to interfere with the operation of one policy interferes with the operation of another policy, so long as both policies have been trained to solve the same task. Specifically, we observe that adversarial examples transfer between models trained using different trajectory rollouts and between models trained with different training algorithms.
+
+
Combine this with the lessons we learned above in ‘Adversarial examples in the physical world,’ and as the authors point out, things could get very interesting indeed!
+
+ Our experiments show it is fairly easy to confuse such policies with computationally-efficient adversarial examples, even in black-box scenarios. Based on ‘Adversarial examples in the physical world’, it is possible that these adversarial perturbations could be applied to objects in the real world, for example adding strategically-placed paint to the surface of a road to confuse an autonomous car’s lane-following policy
+
]]>
+ https://blog.acolyer.org/2017/02/28/when-dnns-go-wrong-adversarial-examples-and-what-we-can-learn-from-them/feed/
+ 1
+
+
+ adriancolyer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Understanding, generalisation, and transfer learning in deep neural networks
+ https://blog.acolyer.org/2017/02/27/understanding-generalisation-and-transfer-learning-in-deep-neural-networks/
+ https://blog.acolyer.org/2017/02/27/understanding-generalisation-and-transfer-learning-in-deep-neural-networks/#comments
+ Mon, 27 Feb 2017 06:00:00 +0000
+
+
+
+ http://adriancolyer.wordpress.com/?p=4053
+ ]]>
+ This is the first in a series of posts looking at the ‘top 100 awesome deep learning papers.’ Deviating from the normal one-paper-per-day format, I’ll take the papers mostly in their groupings as found in the list (with some subdivision, plus a few extras thrown in) – thus we’ll be looking at multiple papers each day. The papers in today’s selection all shed light on what it is that DNNs (mostly CNNs) are really learning when trained. Since one way of understanding what a DNN has truly learned is to see how well the trained networks (or subsets of them) can perform on new tasks, we’ll also learn a lot about generalization, and what we learn can help us to define better models that take advantage of transfer learning.
+
I’ve done my best to distill the knowledge in these papers too, but inevitably this post is going to be a little longer than my normal target length! You might need one-and-a-half cups of coffee for this one ;).
+
Visualising and understanding convolutional networks
+
+ Convolutional neural networks (convnets) have demonstrated excellent performance at tasks such as hand-written digit classification and face detection… Despite this encouraging progress, there is still little insight into the internal operation and behavior of these complex models, or how they achieve such good performance. From a scientific standpoint, this is deeply unsatisfactory.
+
+
If we’re going to understand what a convnet is doing, we need some way to map the feature activity in intermediate layers back into the input pixel space (we’re working with Convnets trained on the ImageNet dataset here). Zeiler and Fergus use a clever construction that they call a deconvnet that uses the same components as the convnet to be decoded, but in reverse order. Some of the convnet components need to be augmented slightly to capture additional information that helps in the reversing process. (It’s a little reminiscent of the data flow provenance work that we looked at earlier this year.)
+
Here’s an example with the standard convnet on the right-hand side, and the deconvnet layers added on the left-hand side.
+
+
Now that we can project from any layer back onto pixels, we can get a peek into what they seem to be learning. This leads to now-familiar pictures such as this:
+
+
Note in the above how layer 2 responds to corners and edge/colour combinations, layer 3 seems to capture similar textures, layer 4 is more class-specific (e.g. dog faces), and layer 5 shows entire objects with significant pose variation. Using these visualisations and looking at how they change over time during training it is also possible to see lower layers converging within relatively few epochs, whereas upper layers take considerably longer to converge. Small transformations in the input image have a big effect on lower layers, but lesser impact in higher layers.
+
The understanding gleaned from inspecting these visualisations proved to be a helpful tool for improving the underlying models too. For example, a 2nd layer visualization showed aliasing artefacts caused by a large stride size, reducing the stride size gave an increase in classification performance.
+
Experiments with model structure showed that having a minimum depth to the network, rather than any one specific section in the overall model, is vital to model performance.
+
DeCAF: A deep convolutional activation feature for generic visual recognition
+
Many visual recognition challenges have data sets with comparatively few examples. In DeCAF, the authors explore whether a convolutional network trained on ImageNet (a large dataset) can be generalised to other tasks where less data is available:
+
+ Our model can either be considered as a deep architecture for transfer learning based on a supervised pre-training phase, or simply as a new visual feature DeCAF defined by the convolutional network weights learned on a set of pre-defined object recognition tasks.
+
+
After training deep a convolutional model (using Krizhevskey et al.’s competition winning 2012 architecture), features are extracted from the resulting model and used as inputs to generic vision tasks. Success in those task would indicate that the convolutional network is learning generically useful features of images (in much the same way that word embeddings learn features of words).
+
Let DeCAFn be the activations of the nth hidden layer of the CNN. DeCAF7 is the final hidden layer just before propagating through the last fully connected layer to produce class predictions. All of the weights from the CNN up to the layer under test are frozen, and either a logistic regression or support vector machine is trained using the CNN features as input.
+
On the Caltech-101 dataset the DeCAF6 + SVM outperformed the previous best state of the art (a method with a combination of five traditional hand-engineered image features)!
+
The Office dataset contains product images from amazon.com, as well as images taken in office environments using webcams and DSLRs. DeCAF features were shown to be robust to resolution changes (webcam vs DSLR), providing not only better within category clustering, but also was able to cluster same category instances across domains. DeCAF + SVM again dramatically outperformed the baseline SURF features available with the Office dataset.
+
For sub-category recognition (e.g. distinguishing between lots of different bird types in the Caltech-UCSD birds dataset) DeCAF6 with simple logistic regression again obtained a significant increase over existing approaches: “To the best of our knowledge, this is the best accuracy reported so far in the literature.”
+
And finally, for scene recognition tasks, DeCAF + logistic regression on the SUN-397 large-scale scene recognition database also outperformed the current state-of-the-art.
+
Convolution neural networks trained on large image sets were therefore forcefully demonstrated to learn features with sufficient representational power and generalization ability to perform at state-of-the-art levels on a wide variety of image-based tasks. It’s the beginning of the end of hand-engineered features, and welcome to the era of deep-learned features.
+
+ The ability of a visual recognition system to achieve high classification accuracy on tasks with sparse labeled data has proven to be an elusive goal in computer vision research, but our multi-task deep learning framework and fast open-source implementation are significant steps in this direction.
+
+
CNN features off-the-shelf: an astounding baseline for recognition
+
CNN features off the shelf further reinforces that we can learn general features useful for image-based tasks, and apply them very successfully in new domains. This time the baseline features are taken from a trained convolutional neural network model called Overfeat, which has been optimized for object image classification in ILSVRC. Then for a variety of tasks, instead of using state-of-art image processing pipelines, the authors simply take the features from the CNN representation, and bolt on an SVM. Sounds familiar?
+
+
The tasks undertaken progress from quite close to the original classification task, to more and more demanding (i.e. distant tasks). At every step of the way, the CNN features prove their worth!
+
Step 1: Object and scene recognition
+
The Pascal VOC 2007 dataset has ~10,000 images of 20 classes of animals, and is considered more challenging than ILSVRC. Applying the Overfeat CNN features to this dataset resulted in a model outperforming all previous efforts “by a significant margin.” The following chart shows how classification performance improves depending on the level from the original CNN that is chosen as the input to the final SVM:
+
+
For scene recognition, the MIT-67 indoor scene dataset has 15,620 images of 67 indoor scene classes. The CNN + SVM model significantly outperformed a majority of the baseline models and just edges a state-of-the-art award by 0.1% accuracy over the previous best AlexConvNet model (also a CNN).
+
Step 2: Fine-grained recognition
+
Here we’re back with birds (Caltech UCSD 200-2011 dataset) and also flowers (Oxford 102 flowers dataset). Can the more generic OverFeat features pick up potentially subtle differences between the very similar classes? On the birds dataset the model gets very close to the state of the art (also a CNN), and beats all other baselines. On the flowers dataset, the CNN+SVM model outperforms the previous state-of-the-art.
+
Step 3: Attribute detection
+
Have the OverFeat features encoded something about the semantic properties of people and objects? The H3D dataset defines 9 attributes for person images (for example, ‘has glasses,’ and ‘is male.’). The UIUC 64 dataset has attributes for objects (e.g., ‘is 2D boxy’, ‘has head’, ‘is furry’). The CNN-SVM achieves state of the art on UIUC 64, and beat several existing models on H3D.
+
Step 4: Instance retrieval
+
What about trying the CNN-SVM model on instance retrieval problems? This is a domain where the state-of-the-art using highly optimized engineered vectors and mid-level features. Against methods that do not incorporate 3D geometric constraints (which do better), the CNN features proved very competitive on building and holiday datasets.
+
What have we learned?
+
+ It’s all about the features! SIFT and HOG descriptors produced big performance gains a decade ago and now deep convolutional features are providing a similar breakthrough for recognition. Thus, applying the well-established computer vision procedures on CNN representations should potentially push the reported results even further. In any case, if you develop any new algorithm for a recognition task, it must be compared against the strong baseline of generic deep features + simple classifier.
+
+
How transferable are features in deep neural networks?
+
The previous papers mostly focused on taking the higher layers from the pre-trained CNNs as input features. In ‘How transferable are features in deep neural networks’ the authors systematically explore the generality of the features learned at each layer – and as we’ve seen, to the extent that features at a given layer are general, we’ll be able to use them for transfer learning.
+
+ The usual transfer learning approach is to train a base network and then copy its first n layers to the the first n layers of a target network. The remaining layers of the target network are then randomly initialized and trained toward the target task. One can choose to back-propagate the errors from the new task into the base (copied) features to fine-tune them to the new task, or the transferred feature layers can be left frozen…
+
+
The experiment setup is really neat. Take an 8-layer CNN model, and split the 1000 ImageNet classes into two groups (so that each contains approximately half the data or 645,000 examples). Train one instance of the model on half A, and call it baseA. Train another instance of the model on half B, and call it baseB. Starting with baseA, we can define seven starter networks, A1 through A7, that copy the first 1 through 7 layers from baseA respectively (and of course we can do the same from baseB to give B1 through B7). Say we’re interested in exploring how well features learned at layer 3 transfer. We can construct the following four networks:
+
+
B3B – the first 3 layers are copied from baseB and frozen. The remaining five higher layers are initialized randomly and we train on task B as a control. (The authors call this a ‘selfer’ network)
+
A3B – the first 3 layers are copied from baseA and frozen. The remaining five layers are initialized randomly as before, and trained on task B. If A3B performs as well as B3B, we have evidence that the first three layers are general.
+
B3B+, like B3B but the first three layers are subsequently fine-tuned during training.
+
A3B+, like A3B but the first three layers are subsequently fine-tuned during training.
+
+
+
Repeat this process for all layers 1..7. Running these experiments leads to the following results:
+
+
Looking at the dark blue dots first (BnB), we see an interesting phenomenon. When freezing early layers and then retraining the later layers towards the same task, the resulting performance is very close to baseB. But layers 3,4,5, and 6 (especially 4 and 5) show significantly worse performance:
+
+ This performance drop is evidence that the original network contained fragile co-adapted features on successive layers.
+
+
As we get closer to the final layers, performance is restored as it seems there is less to learn… “To our knowledge it has not been previously observed in the literature that such optimization difficulties may be worse in the middle of a network than near the bottom or top.”
+
Note that the light blue dots (BnB+), where we allow fine-tuning, restore full performance.
+
The red dots show the transfer learning results. Starting with the frozen base version (dark red, AnB), we see strong transference in layers 1 and 2, and only a slight drop in layer 3, indicating that the learned features are general. Through layers 4-7 though we see a significant drop in performance.
+
+ Thanks to the BnB points, we can tell that this drop is from a combination of two separate effects: the drop from lost co-adaptation and the drop from features that are less and less general.
+
+
Finally let’s look at the light red AnB+ points. These do better than the baseline! Surprised? Even when the dataset is large, transferring features seems to boost generalization performance. Keeping anywhere from one to seven layers seems to infer some benefit (average boost 1.6%) so the effect is seen everywhere. One way that I think about this is that the transferred layers had a chance to learn from different images that the selfer networks never see – thus they have a better chance of learning better generalizations.
+
The short summary – transfers can improve generalization performance. Two issues impact how well transfer occurs: fragile co-adaptation of middle layers, and specialisation of higher layers.
+
Learning and transferring mid-level image representations using convolutional neural networks
+
This paper uses the by-now familiar ‘train a CNN on ImageNet and extract features to transfer to other tasks approach, but also explores training techniques that can help to maximise the transfer benefits. Here’s the setup:
+
+
The target task for transfer learning is Pascal VOC object and action classification, “we wish to design a network that will output scores for target categories, or background if none of the categories are present in the image.” Transfer is achieved by removing the last fully-connected layer from the pre-trained network and adding an adaption layer formed of two fully-connected layers.
+
The source dataset (ImageNet) contains nice images of single centered objects. The target dataset (Pascal VOC) contains complex scenes with multiple target objects at various scales and background clutter:
+
+
+ The distributed of object orientations and sizes as well as, for example, their mutual occlusion patterns is very different between the two tasks. This issue has also been called “a dataset capture bias.” In addition, the target task may contain many other objects not present in the source task training data (“a negative bias”).
+
+
Here’s the new twist: to address these biases, the authors use a sliding window and extract around 500 square patches from each image by sampling on eight different scales using a regularly spaced grid and 50% or more overlap between neighbouring patches:
+
+
To label the patches in the resulting training data, the authors measure the overlap between the bounding box of a patch P and the ground truth bounding boxes of annotated objects in the image. If there is sufficient overlap with a given class, the patch is labelled as a positive training example for the class.
+
You shouldn’t be surprised at this point to learn that the resulting network achieves state of the art performance on Pascal VOC 2007 object recognition, and gets very close to the state of the art on Pascal VOC 2012. The authors also demonstrate that the network learns about the size and location of target objects within the image. For the Pascal VOC 2012 action recognition task, state of the art results were achieved by allowing fine-tuning of the copied layers during training.
+
+ Our work is part of the recent evidence that convolutional neural networks provide means to learn rich mid-level image features transferrable to a variety of visual recognition tasks.
+
+
Distilling the knowledge in a neural network
+
Let’s finish with something a little bit different: what can insects teach us about neural network training and design?
+
+ Many insects have a larval form that is optimized for extracting energy and nutrients from the environment and a completely different adult form that is optimized for the very different requirements of traveling and reproduction. In large-scale machine learning, we typically use very similar models for the training stage and the deployment stage despite their very different requirements.
+
+
What if we use large cumbersome models during training (e.g.,very deep networks, ensembles), so long as those models make it easier to extract structure from the training data, and then find a way to transfer or distill that the training model has learned into a a more compact form suitable for deployment? We want to cram as much of the knowledge as possible from the large model into the smaller one.
+
+ If the cumbersome model generalizes well because, for example, it is the average of a large ensemble of different models, a small model trained to generalize in the same way will typically do much better on test data than a small model that is trained in the normal way on the same training set as was used to train the ensemble.
+
+
How can we train the small model effectively though? By using the class probabilities produced by the cumbersome model as “soft targets” for training the small model. The large model has learned not just the target prediction class, but a probability distribution over all classes – and the relative probabilities of incorrect answers still contain a lot of valuable information. The essence of the idea is to train the small model to reproduce the probability distribution, not just the target output class.
+
Neural networks typically produce class probabilities by using a “softmax” output layer that converts the logit, _zi_, computed for each class into a probability, _qi_, by comparing _zi_ with the other logits.
+
+
where T is a temperature normally set to 1. A higher T value produces a softer probability distribution over classes. The cumbersome model is trained using a high temperature in its softmax, and the same high temperature is used when training the distilled model. When that model is deployed though, it uses a temperature of 1.
+
A ‘cumbersome’ large neural net with two hidden layers of 1200 rectified linear units trained on 60,000 training cases using dropouts to simulate training an ensemble of models sharing weights,achieved only 67 test errors. A smaller model network with 800 units in each layer and no regulalization saw 146 test errors. However, a distilled smaller network of the same size trained to match the soft targets from the large network achieved only 74 test errors.
+
In an Automatic Speech Recognition (ASR) test an ensemble of 10 models was distilled to a single model that performed almost as well. The results compare well to a very strong baseline model similar to that used by Android voice search.
+
+
A very nice use of the technique is in learning specialized models as part of an ensemble. Take a large data set (e.g. Google’s JFT image dataset with 100M images) and a large number of labels (15,000 in JFT): it’s likely there are several subsets of labels on which a general model gets confused. Using a clustering algorithm to find classes that are often predicted together, an ensemble is created with one generalist model, and many specialist models, one for each of the top k clusters. The specialist models are trained on data highly enriched in examples from the confusable subsets. The hope is that the resulting knowledge can be distilled back into a single large net, although the authors did not demonstrate that final step in the paper.
+
+ We have shown that distilling works very well for transferring knowledge from an ensemble or from a large highly regularized model into a smaller, distilled model…. [Furthermore,] we have shown that the performance of a single really big net that has been trained for a long time can be significantly improved by learning a large number of specialist nets, each of which learns to discriminate between the classes in a highly confusable cluster.
+
+
Understanding through counter-examples
+
Another interesting way of understanding what DNNs have learned, is through the discovery of counter-examples that confuse them. The ‘top 100 awesome deep learning papers‘ section on understanding, generalisation, and transfer learning (which we’ve been working through today) contains one paper along those lines. But this post is long enough already, and the subject is sufficiently interesting that I’d like to expand it with a few additional papers as well. So we’ll look at that tomorrow…
]]>
+ https://blog.acolyer.org/2017/02/27/understanding-generalisation-and-transfer-learning-in-deep-neural-networks/feed/
+ 1
+
+
+ adriancolyer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ An experiment with awesome deep learning papers
+ https://blog.acolyer.org/2017/02/26/an-experiment-with-awesome-deep-learning-papers/
+ https://blog.acolyer.org/2017/02/26/an-experiment-with-awesome-deep-learning-papers/#comments
+ Sun, 26 Feb 2017 16:30:00 +0000
+
+
+
+ http://adriancolyer.wordpress.com/?p=4063
+ ]]>
+ There have been several lists of deep learning papers doing the rounds. Recently Terry Taewoong Um’s list of the top 100 awesome and most cited deep learning papers caught my eye. Deep learning is an exciting area and it’s moving fast. I’d like to know what’s in those 100 papers (thankfully, we have at least looked at some of them before), and I suspect many of you would too. The problem is, at five papers per week it would take 20 weeks of The Morning Paper to cover the list! That’s too long, and even if it wasn’t, it wouldn’t match my goals for diversity of content. Ideally I’d press pause on the world for a while, go take a bunch of math classes, read through all of these papers, and then be in a strong position to understand the 2017 intake. That’s not possible either, so we need a faster plan…
+
This week on The Morning Paper therefore I’m trying something a little different: we’ll be working through some of the top 100 papers list in sections, covering multiple papers per day but with shorter reviews of each. Hopefully you’ll find it a good way to take on board a lot of research very quickly.
+
From my perspective the results are mixed – I certainly covered a lot of ground (26 deep learning papers read and reviewed over the week), but I think I discovered my current limit for paper reviews per week in the process! (It happened to coincide with a a busy work week as well). Another consequence is that the posts are longer than my usual target length, coming in at about 15 mins reading time according to my editor’s toolbar. I fear that may be too long, even in condensed review format. Let me know what you think.
+
One thing’s for sure, for the following week I’m going back to just one paper per day thank you very much! (And we’ll be looking at something other than deep learning too ).
]]>
+ https://blog.acolyer.org/2017/02/26/an-experiment-with-awesome-deep-learning-papers/feed/
+ 5
+
+
+ adriancolyer
+
+
+
+ On decentralizing prediction markets and order books
+ https://blog.acolyer.org/2017/02/24/on-decentralizing-prediction-markets-and-order-books/
+ https://blog.acolyer.org/2017/02/24/on-decentralizing-prediction-markets-and-order-books/#comments
+ Fri, 24 Feb 2017 06:00:52 +0000
+
+
+
+ http://blog.acolyer.org/?p=3977
+ ]]>
+ On decentralizing prediction markets and order books Clark et al., 13th Annual Workshop on the Economics of Information Security, 2014
+
This is the last of five papers in the ACM Queue Research for Practice series on ‘Cryptocurrencies, Blockchains, and Smart Contracts .’ It serves as a good example of repurposing block chains as a foundation not just for cryptocurrencies, but also as a means of providing decentralized versions of a wide range of services. In this instance, a prediction market.
+
+ Among [Bitcoin’s] novel contributions, the block chain stands out as a useful component for forming a consensus within a decentralized network about efficiently decideable events. Repurposing this consensus mechanism for new uses, both related and non-related to finance, is a promising research direction. In our present work, we show it can be repurposed to deploy a prediction market – a useful tool for forecasting future events.
+
All of these systems have a really interesting game theory angle to them – you need to define a system in which the best strategy for each party (i.e, when acting in their own best interests), is also the best overall strategy for the system as a whole. It’s not easy to get that right!
+
What is a prediction market?
+
A prediction market enables participants to trade financial shares tied to the outcome of a future event. The possible outcomes must be distinct and must partition the outcome space. Suppose Clump and Trinton are both running for president. A share in ‘Clump becomes president’ is worth $1 if Clump wins, and $0 otherwise. If participants believe Clump has a 60% chance of winning, the share has an expected value of $0.60.
+
+ All deployed prediction markets that we are aware of are run by a trusted central authority, who holds the money and the shares backing the market in escrow while providing an electronic communication network capable of matching orders and posting the bid/ask of unmatched orders. Orders that are executed are cleared and settled by the authority, and when the events being forecast are realized, the authority declares the outcome and settles the accounts.
+
There are two key components to a market: an order matching service matches buyers and sellers that are willing to trade, and a processor enables the execution of valid trades (regardless of how they are arranged) in a timely fashion.
+
+
Design goals for a decentralized prediction market
+
In the quote above, notice the central role of ‘the authority.’ We want to design a prediction market that doesn’t have any central authority, or at least not for the core concerns…
+
+ Our design decentralizes order matching, settling, and clearing to a community of miners, where authority is held in proportion to computational ability. We argue that trusted authorities, called arbiters, are better suited to declare the outcome of an event than through community consensus, however users can adaptively move between markets to ensure they only rely on arbiters they trust (trust agility). Arbitration is also desgined to have a minimal barrier to entry…
+
All transactions are published in a public block chain which provides transparency, and accounts are identified by public keys providing pseudonymity.
+
+
Traders buy and sell shares in outcomes. They may be malicious and attempt to steal shares, double-spend currency to obtain shares, and redeem shares in outcomes other than the declared outcome.
+
Miners maintain a transcript of all transactions as they do in Bitcoin
+
Arbiters are entities authorized to declare the outcome of an event…
+
+
+ Arbiters pose the most significant threat. A malicious arbiter can profit directly from misbehaviour, for example, by obtaining cheap shares in a low probability outcome and falsely declaring that outcome the winner. Arbiters may also be simply unreliable, and not declare outcomes in a timely fashion or at all. While these threats cannot be eliminated, we use trust, agility, reputation, and community override to control and mitigate them.
+
Clearing and settlement
+
Decentralized clearing and settlement takes place by extending an altcoin (with internal currency XFT) with five additional operations: OpenMarket, BuyCompleteSets, SellCompleteSets, Exchange, and CloseMarket. Here’s the summary description of the operations from the paper:
+
+
OpenMarket and CloseMarket are fairly self-explanatory, but the notion of ‘complete sets’ is worth exploring. BuyCompleteSets enables a trader to buy a share in each outcome for 1 XFT, and SellCompleteSets enables a trader holding a share in each outcome to sell the set for 1 XFT. This mechanism ensures that over the long run, 1 XFT remains within the bid-ask spread of a complete set. For example, if the bid prices add up to 1.05 XFT, a trader can buy a complete set of 1 XFT and sell the individual shares for 1.05 XFT, netting a 0.05 XFT profit. Likewise if the ask prices add up to 0.98 XFT, a trader can buy individual shares to accumulate a complete set for 0.98 XFT, and then sell the complete set for 1 XFT netting 0.02 XFT profit.
+
Here’s an example of ‘going short’ that illustrates some of these mechanisms at work:
+
+ Alice believes candidate Thomas Fredrick is over-valued at {Bid 0.24, Ask: 0.27, Last: 0.26} for becoming his political party’s presidential nominee. She purchases a portfolio using BuyCompleteSets for 1 XFT and immediate sells the share in Fredrick for 0.24 XFT. Two weeks later, Fredrick drops out of the race, and his share price plummets to an Ask of 0.001. As long as Fredrick stays out of the race, Alice owns a share in each other option and can expect 1 XFT when the primary finishes in two months. However she will earn nothing (not even interest) between now and then. Alice purchases a share in Fredrick for 0.001 to complete her portfolio and uses SellCompleteSets to receive 1 XFT immediately. Assuming no transaction fees, Alice initial investment of 1 XFT earned her 1 + 0.24 − 0.001 = 1.239 XFT.
+
The central and most complex transaction is the Exchange transaction. Like a Bitcoin transaction, it has a unique identifier, a set of inputs, and a set of outputs. Inputs refer outputs of previous transactions as in Bitcoin. Inputs and outputs can be one of four different types:
+
+
XFT (i.e. Basecoin)
+
Shares in an active market
+
Shares from a closed market
+
Portfolios (complete sets)
+
+
Inputs must completely spend the output they refer to, and the sum of the inputs must meet or exceed the sum of the outputs. Any input excess above the sum of the inputs is kept by the miner as a transaction fee. Outputs are assigned to public keys, and an Exchange transaction must be signed with the signing keys associated with each of its inputs.
+
+
+ …it is clear that for most markets arbitration requires one or more humans in the loop and cannot be automated, nor can the correctness of arbitration be defined or checked automatically. Nevertheless, the problem at least theoretically has a solution if the majority of participants are honest. This is complicated by three factors: first, participants may be pseudonymous, and anyone can create sybils. Second, some participants will have a monetary stake in subverting the vote because they hold shares in a losing outcome. Third, we would like to minimize the human effort required to reach consensus.
+
The authors explore four different models for arbitration, the simplest being an arbiter per market. The alternatives explored including (i) giving every miner who broadcasts a block a vote in the market (works best in prominent markets where a significant fraction of miners are likely to record votes), (ii) creating virtual companies (with shares also traded on the block chain) to adjudicate markets – the value of their shares is tied to the expected future earnings, which is tied to reputation, encouraging the shareholders to vote honestly, and (iii) a model in which each of N shares in a prediction market confers one vote…
+
+ Of course, voters holding losing shares have a financial incentive to vote contrary to reality. To address this dilemma, all market participants are required to post a bond in addition to the price of the shares they purchase. Any voters who vote contrary to an outcome with reaches a 2N/3 consensus forfeit their bond, disincentivizing voters to vote against the likely final outcome.
+
Order matching
+
The most common type of order matching system in prediction markets is a continuous two-sided auction: traders submit bid or ask orders, and an order is executed if some other trader is willing to match (or better) its conditions. Orders are executed in a sequence specified by precedence rules – for example, first sorted by best price, then by time received. With a decentralized blockchain though, any time-based precedence is hard to establish and open to manipulation (remember miners have considerable flexibility with timestamps). Traders also have an incentive to configure any nodes they own in the network not to forward orders at higher trade precedence than their own.
+
The solution is to give precedence to price, and then execute orders at the same price relative to their volume. The mitigation for traders not forwarding orders is simply to broadcast the message to as many peers as possible. Because transactions aren’t finalized until they’re added to the block chain we also need to use a call market instead of a continuous market. Orders are placed over an interval of time, and then executed as a batch.
+
+ The only limitation to a matching service is that clearing and settlement requires block chain integration, and the timing of integration depends on the average block creation time. With a 6 block confirmation delay at 10 minutes a block (as per Bitcoin), we are left with a reasonable period of one hour. By comparison, equities often take one or three days (‘T+1’ or ‘T+3’) to clear and settle. However an external exchange that holds the shares and XFT for its traders can clear and settle immediately, at least in terms of the traders’ accounts with the exchange (while actually withdrawing the shares or XFT from the exchange is subject to the same block chain delay).
+
Wrapping up
+
I skipped over a lot of detailed analysis of the incentives for the various parties (traders, miners, and arbiters), ways they can try to game the system, and how these can be protected against (the full paper runs to 21 pages). The takeaway is that it takes a lot of careful analysis to design such systems. It leaves me wanting something more rigorous than prose for reasoning about them!
+
Let’s conclude by looking at the other side of the coin: a prediction market with no central authority gains the benefits of not having a central authority, as well as the potential drawbacks:
+
+ In centralized PMs, the decision to allow any market is discretionary. In decentralized systems, there is little to no control over what types of markets will be opened. Markets on assassinations or terrorist attacks can be considered unethical, and were cited as reasons for cancelling at least one prediction market, developed in the US by DARPA for predicting foreign political developments. In our design, for particularly abhorrent markets, a consensus formed by a majority of miners to not include transactions opening, trading, or closing a given market will effectively stifle it. However markets with merely questionable ethics will likely proceed, and it will be left to individual users to decide to participate or not.
This is the fourth in a series of papers from the ACM Queue Research for Practice ‘Cryptocurrencies, Blockchains and Smart Contracts‘ selections, in which Luu at al. look at smart contracts in Ethereum. Smart contracts are a really intriguing idea and have generated a lot of interest/excitement, but they also have a number of properties which make them both likely targets for attackers and also hard to get right. Regular readers of The Morning Paper will not be surprised to see our old friend error and exception handling popping up as one of the chief causes of problems again! After scanning 19,366 Ethereum contracts using the OYENTE tool described in the paper, the authors found vulnerabilities in 8,833 of them.
+
Here’s the plan: after a brief introduction to smart contracts, we’ll discuss what it is that makes them especially attractive targets, followed by a look at typical vulnerabilities. We’ll then finish up by seeing what we can do about the situation to make contracts more secure in the future.
+
What exactly is a smart contract?
+
+ A smart contract is identified by an address (a 160-bit identifier) and its code resides on the blockchain. Users invoke a smart contract in present cryptocurrencies by sending transactions to the contract address. Specifically, if a new transaction is accepted by the blockchain and has a contract address as the recipient, then all participants on the mining network execute the contract code with the current state of the blockchain and the transaction payloads as inputs. The network then agrees on the output and the next state of the contract by participating in a consensus protocol.
+
+
In Ethereum, contracts are introduce to the blockchain via special creation transactions. Contracts are essentially functions whose Ethereum Virtual Machine (EVM) bytecode is incorporated in the blockchain as part of the creation transaction. The contracts themselves can be written in higher-level languages and compiled to EVM bytecode. Contract functions are stateful: they have private storage on the blockchain, and can also hold some amount of virtual Ether coins. The private storage is allocated and initialized by running a constructor, subsequent transactions sent to the contract address invoke the anonymous function.
+
Here’s an example Puzzle contract:
+
+
Note the contract state declared on lines 2-6, constructor on lines 8-13, and anonymous transaction function on lines 15-29. A default input variable msg holds the sender, amount of Ether sent to the contract, and any included data as part of the invocation. In this particular contract, if the owner initiates the transaction (line 16) they can extract the current reward value and replace it with some other amount (lines 17-21). Anyone else invoking the transaction can submit a potential solution, and will receive the reward if the solution is accepted (lines 23-29).
+
All miners execute the transaction, which will incur some computation cost:
+
+ Ethereum pays miners some fees proportional to the required computation. Specifically, each instruction in the Ethereum bytecode has a pre-specified amount of gas. When a user sends a transaction to invoke a contract, she has to specify how much gas she is willing to provide for the execution (called gasLimit) as well as the price for each gas unit (called gasPrice). A miner who includes the transaction in his proposed block subsequently receives the transaction fee corresponding to the amount of gas the execution actually burns multiplied by gasPrice.
+
+
If the execution costs more than the gasLimit then execution is terminated and the state is restored to the initial state at the start of the function execution. The miner still receives gasLimit compensation though.
+
Why are smart contracts attractive targets?
+
Smart contracts have associated value – potentially handling large numbers of coins worth hundreds of dollars apiece. The 8,833 contracts in the first 1,460,000 blocks in the Ethereum network had a total balance of over 3 million Ether (about $30M USD) at the time the paper was written. The infamous attack on ‘TheDAO’ caused a loss of about $60M to TheDAO’s investors.
+
Smart contract vulnerabilities
+
So we know that smart contracts have value as attack targets. They also have a combination of features that should make any experienced software developer raise an eyebrow:
+
+
They execute in permissionless networks which arbitrary participants can join (i.e., under byzantine conditions)
+
Miners and/or callers have meaningful control over the environment in which the transactions execute (which transactions to accept, transaction ordering, setting of block timestamp, manipulation of call stack)
+
All of the above must be reasoned about in an environment which punishes anyone who doesn’t get it right first time – there is no patching mechanism:
+
+
+ There is no way to patch a buggy smart contract, regardless of its popularity or how much money it has, without reversing the blockchain (a formidable task). Therefore, reasoning about the correctness of smart contracts before deployment is critical, as is designing a safe smart contract system.
+
+
Note: you can explicitly design versioning/upgrade capabilities into your smart contract code, since contracts can call each other. See e.g., http://ethereum.stackexchange.com/questions/2404/upgradeable-smart-contracts. But it remains the case that the original bytecode associated with the contract is immutable for all time.
+
The authors discuss four major categories of vulnerabilities in smart contracts: transaction-ordering dependence, timestamp dependence, mishandled exceptions, and reentrancy vulnerability.
+
Miners can control the order in which transactions are executed, in particular this means that the state of a contract at the time a user submits a transaction may not match the state of the contract at the time the transaction executes if another transaction updates it first (version numbering and optimistic concurrency control anyone?). In the Puzzle example, someone may submit a solution hoping for the big reward, and the owner can nip in with another transaction that replaces it with little or no reward, so benefiting from the solution without paying out.
+
Some contracts use the block timestamp as a triggering condition or source of randomness (don’t do this!).
+
+ Let us recall that when mining a block, a miner has to set the timestamp for the block (Figure 2). Normally, the timestamp is set as the current time of the miner’s local system. However, the miner can vary this value by roughly 900 seconds, while still having other miners accept the block… Thus, the adversary can choose different block timestamps to manipulate the outcome of timestamp-dependent contracts.
+
+
Ethereum contracts can call each other, but exceptions in the callee contract may not be propagated to the caller (depending on exact circumstances). “This inconsistent exception propagation policy leads to many cases where exceptions are not handled properly.” An adversary can load the dice by preparing a contract which calls itself 1023 times before calling the target contract. The Ethereum virtual machine has a 1024 call stack depth limit. Filling the call stack in this way means that the next call the target contract makes will fail with an exception. There is no atomicity here – any actions taken in the target contract directly will be preserved, but those taken by the contract it called will not. For example, ownership of a resource may be transferred, with payment being made.
+
If you had to guess what else might cause problems beyond error and exception handling, concurrency related bugs is always a good option. And indeed that turns out to be the case leading to reentrancy vulnerabilities:
+
+ In Ethereum, when a contract calls another, the current execution waits for the call to finish. This can lead to an issue when the recipient of the call makes use of the intermediate state the caller is in. This may not be immediately obvious when writing the contract if possible malicious behavior on the side of the callee is not considered.
+
+
This example contract exhibits the vulnerability:
+
+
Line 11 sends the current balance to the contract address wishing to withdraw its balance, but the balance is not zeroed until after the call (line 13). The callee contract can call back into withdrawBalance again and make multiple withdrawals in this manner.
+
Protecting smart contracts
+
The proposal to defend against transaction ordering is to allow a guard clause (predicate) to be evaluated before transaction execution. If the guard clause evaluates to false the transaction will not execute. Using this, you can roll-your-own optimistic concurrency scheme.
+
The solution to timestamp dependency is not to depend on timestamps – there are better sources of both randomness and timestamps available. “A practical fix (for the latter) is to translate existing notions of timestamp into block numbers.”
+
For exception handling, the straightforward solution is to check the return value whenever one contract calls another! If clients upgrade, an even better solution is to propagate exceptions at the level of the EVM from callee to caller and revert the state of the caller if they are not properly handled.
+
Based on a model of the operational semantics of the Ethereum bytecode (worth the price of admission all by itself, and we don’t even have the space to cover it here at all!), the authors build a verification tool called OYENTE which can symbolically execute contracts and look for vulnerabilities. OYENT is 4,00 lines of Python, and uses Z3 as the solver to decide satisfiability.
+
What OYENTE discovered
+
+ We collected 19,366 smart contracts from the blockchain as of May 5, 2016. These contracts currently hold a total balance of 3,068,654 Ether, or 30 Million US dollars at the time of writing… On an average, a contract has 318.5 Ether, or equivalently 4523 US dollars.
+
+
8,833 of the contracts have at least one security issue: 5,411 contracts (27.9%) have mishandled exceptions; 3,056 contracts (15.7%) have transaction-ordering dependencies; 83 contracts have timestamp dependencies, and 340 contracts have reentrancy handling problems – one of which is the infamous TheDAO contract. You can see several examples of found vulnerabilities in section 6 of the paper.
]]>
+ https://blog.acolyer.org/2017/02/23/making-smart-contracts-smarter/feed/
+ 1
+
+
+ adriancolyer
+
+
+
+
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_myanimelist.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_myanimelist.xml
new file mode 100644
index 000000000..6a31be9b5
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_myanimelist.xml
@@ -0,0 +1,167 @@
+
+
+ News - MyAnimeList
+ MyAnimeList's Feed of News
+ https://myanimelist.net/news?_location=rss
+
+ https://myanimelist.net/news/67553378?_location=rss
+ 'Itou Junji: Maniac' Unveils Main Staff, Additional Cast, January 19 Premiere
+ The Netflix TUDUM Japan event revealed on Sunday the main staff and additional cast members for the Itou Junji: Maniac (Junji Ito Maniac: Japanese Tales of the Macabre) net anime series. The anime is scheduled to premiere worldwide on Netflix on January 19. Cast Tomie Tomie: Rie Suegara (Itou Junji: Collection) Tsukiko Izumisawa: Yumiri Hanamori (Yofukashi no Uta) Yamazaki: Taku Yashiro (Domestic na Kanojo) Taichi: Tomokazu Sugita (Gintama) Kimata: Hiroyuki Yoshino (Spy x Family) Shijuu Kabe no...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664092688-dd34666e64d7ae624e6e2c70087c181f.jpeg
+ Sun, 25 Sep 2022 01:02:33 -0700
+ https://myanimelist.net/news/67553378?_location=rss
+
+
+ https://myanimelist.net/news/67553325?_location=rss
+ 'Make My Day' Reveals Main Cast, Additional Staff, February 2023 Premiere
+ The Netflix TUDUM Japan event revealed the main cast and one additional staff for the original anime series Make My Day. The anime will premiere worldwide on Netflix in February 2023. Cast Jim: Masaomi Yamahashi (Rokudenashi Majutsu Koushi to Akashic Records) Marnie: Ayahi Takagaki (Senki Zesshou Symphogear) Walter: Kazuhiro Yamaji (Shingeki no Kyojin Season 3) Captain Burke: Akio Ootsuka (Koukaku Kidoutai) Kensuke Ushio (Devilman: Crybaby, Heike Monogatari) is composing the music. Manga author...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664094149-7003a2d793adb3058043c4506fd847b1.jpeg
+ Sun, 25 Sep 2022 00:54:43 -0700
+ https://myanimelist.net/news/67553325?_location=rss
+
+
+ https://myanimelist.net/news/67553252?_location=rss
+ Baku Yumemakura's 'Onmyouji' Novel Gets Anime in 2023
+ An anime adaptation of Baku Yumemakura's Onmyouji novel series was announced at the Netflix TUDUM Japan event on Sunday, revealing the main staff, a concept art (pictured above), and a character visual for Abe no Seimei (pictured right). The anime series will debut worldwide on Netflix in 2023. Soubi Yamamoto (Meganebu!) is directing the anime at Marvy Jack. Natsu Hashimoto (Oshiete Hokusai! The Animation) and Yuiko Katou (Aguu: Tensai Ningyou) are penning the script. Yumemakura originally...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664091670-da678a78a6b44fb0d1790f2fd8e7ce58.jpeg
+ Sun, 25 Sep 2022 00:42:10 -0700
+ https://myanimelist.net/news/67553252?_location=rss
+
+
+ https://myanimelist.net/news/67552991?_location=rss
+ 'Aggressive Retsuko' Gets Fifth Season in February 2023
+ The Netflix TUDUM Japan event announced a fifth season of Sanrio's Aggressive Retsuko (Aggretsuko) net anime series on Sunday. The final season is scheduled to premiere worldwide on Netflix in February 2023. The first anime adaptation based on Sanrio's titular red panda mascot aired in 100 one-minute episodes from April 2016 to March 2018 on TBS' Ousama no Brunch program. TBS subsequently combined all 100 episodes and broadcast them in 10 episodes. The first, second, third, and f...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664087997-665c6083b3f270552be12d3f358e5fef.jpeg
+ Sat, 24 Sep 2022 23:41:49 -0700
+ https://myanimelist.net/news/67552991?_location=rss
+
+
+ https://myanimelist.net/news/67552810?_location=rss
+ Video Game 'Onimusha' Gets Anime Series
+ The Netflix TUDUM Japan event announced on Sunday an anime adaptation of Capcom's Onimusha video game series and revealed the main staff members. Staff Chief Director: Takashi Miike (Koroshiya 1 live-action director) Director: Shinya Sugai (Dragon's Dogma) Musashi Miyamoto Model: Toshirou Mifune (Yojimbo) Studio: Sublimation Capcom developed and published the first game in the series in January 2001 in Japan for Playstation 2 and released an updated version for Xbox in 2002. Onimusha...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664086234-c75d1721efa9953b6ce0d13fc2060405.jpeg
+ Sat, 24 Sep 2022 23:12:07 -0700
+ https://myanimelist.net/news/67552810?_location=rss
+
+
+ https://myanimelist.net/news/67552685?_location=rss
+ Manhwa 'Lookism' Gets Anime Series
+ The Netflix TUDUM Japan event announced an anime adaptation of Tae-Jun Park's Lookism manhwa on Sunday, revealing a teaser visual (pictured above) and teaser promotional video. The anime series, produced by Studio Mir, with stream worldwide on Netflix under the title Gaiken Shijou Shugi on November 4. Park launched the action drama manhwa on the Naver Webtoon (now Line Webtoon) webcomic portal in November 2014. The 20th volume went on sale on May 20. LINE Webtoon began releasing the title...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664085581-ae3c0cc36e1590533915844da315a386.jpeg
+ Sat, 24 Sep 2022 23:00:59 -0700
+ https://myanimelist.net/news/67552685?_location=rss
+
+
+ https://myanimelist.net/news/67552429?_location=rss
+ 'Gokushufudou' Gets 2nd Season for January 2023
+ The Netflix TUDUM Japan event announced a second anime season for Kousuke Oono's Gokushufudou (The Way of the Househusband) manga on Sunday. The new season will stream worldwide on Netflix in January 2023. Chiaki Kon (Higurashi no Naku Koro ni, Nodame Cantabile: Paris-hen) is returning to direct the second season at J.C.Staff (Prison School, Amanchu!). Susumu Yamakawa (Back Street Girls: Gokudolls) is also returning to handle the series composition. The first season premiered in two five-ep...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664083433-a3d4909cf423596844d7facd1868cd4f.jpeg
+ Sat, 24 Sep 2022 22:24:22 -0700
+ https://myanimelist.net/news/67552429?_location=rss
+
+
+ https://myanimelist.net/news/67552354?_location=rss
+ 'Moonrise' Reveals Additional Staff, Teaser Promo, 2024 Premiere
+ The Netflix TUDUM Japan livestream event announced on Sunday additional staff, a teaser visual (pictured), and teaser promotional video for Wit Studio's Moonrise original anime series. The anime is scheduled to premiere worldwide on Netflix in 2024. Staff Original Creator: Tow Ubukata (Mardock Scramble) Original Character Design: Hiromu Arakawa (Fullmetal Alchemist) Director: Masashi Koizuka (Shingeki no Kyoujin Season 2) Character Design: Ayumi Yamada (Owari no Seraph sub-character design)...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664082428-d9061ce414c539b87e7e326254038bb8.jpeg
+ Sat, 24 Sep 2022 22:07:59 -0700
+ https://myanimelist.net/news/67552354?_location=rss
+
+
+ https://myanimelist.net/news/67547345?_location=rss
+ 'Arknights: Reimei Zensou' Reveals Additional Staff, Cast, First Promo
+ The official website of the Arknights: Reimei Zensou (Arknights Animation: Prelude to Dawn) television anime revealed additional staff, cast, opening theme, a promotional video and key visual (pictured) on Saturday. The anime is scheduled to broadcast on October 29 at 1:23 a.m. on TV Tokyo, followed by TV Osaka, BS11, and Animax. Cast Doctor: Yuki Kaida (Tennis no Ouji-sama) Amiya: Tomoyo Kurosawa (Hibike! Euphonium) Dobermann: Atsumi Tanezaki (Spy x Family) Nearl: Ayane Sakura (Boku no Hero Aca...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664038361-4f428fd8e3555417e6744cd033534480.jpeg
+ Sat, 24 Sep 2022 10:05:22 -0700
+ https://myanimelist.net/news/67547345?_location=rss
+
+
+ https://myanimelist.net/news/67544667?_location=rss
+ Sony Music Project 'UniteUp' Gets TV Anime in Winter 2023
+ The Aniplex Online Fest 2022 event announced a television anime adaptation for Sony Music Entertainment Japan's UniteUp! project on Saturday, revealing the main cast and a teaser promotional video. Produced by CloverWorks, the anime series will broadcast in January 2023. Cast PROTOSTAR Akira Kiyose: Kikunosuke Toya (Chainsaw Man) Banri Naoe: Ryoutarou Yamaguchi (Futsal Boys!!!!!) Chihiro Isuzugawa: Amon Hirai LEGIT Daiki Takao: Magura Sukegawa Eishiro Nijo: Shinnosuke Morikage Fuga Togo: Ry...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664017403-2196103af4549159b1d005e830d8ee00.jpeg
+ Sat, 24 Sep 2022 04:42:14 -0700
+ https://myanimelist.net/news/67544667?_location=rss
+
+
+ https://myanimelist.net/news/67544062?_location=rss
+ 'Ayakashi Triangle' TV Anime Main Cast Announced
+ The Aniplex Online Fest 2022 event revealed the main cast and a second teaser visual (pictured) for the Ayakashi Triangle anime series on Saturday. The television anime adapting Kentarou Yabuki's ecchi comedy manga will premiere in January 2023. Cast Matsuri Kazamaki (Male): Shouya Chiba (Jibaku Shounen Hanako-kun) Matsuri Kazamaki (Female): Miyu Tomita (Ore dake Haireru Kakushi Dungeon) Suzu Kanade: Kana Ichinose (Hige wo Soru. Soshite Joshikousei wo Hirou.) Shirogane: Tesshou Genda (Oda C...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664013608-b8ff9c9da3eb1c233d05167b9bab5480.jpeg
+ Sat, 24 Sep 2022 03:00:32 -0700
+ https://myanimelist.net/news/67544062?_location=rss
+
+
+ https://myanimelist.net/news/67543892?_location=rss
+ Gen Urobuchi's 'Eisen Flügel' Light Novel Gets Anime Movie
+ The Aniplex Online Fest 2022 event announced an anime movie adaptation of Gen Urobuchi's Eisen Flügel light novel on Saturday. Aniplex simultaneously launched an official website, revealing the production staff, a teaser promotional video, and teaser visual (pictured). Urobuchi penned the light novel in two volumes under Shogakukan's Gagaga Bunko label in July and December 2009, featuring illustrations by Higashiguchi Chuuou (Mnemosyne: Mnemosyne no Musume-tachi). Anno Nanakamado...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664011728-03b143e16b1025a23577008fb207c634.jpeg
+ Sat, 24 Sep 2022 02:28:59 -0700
+ https://myanimelist.net/news/67543892?_location=rss
+
+
+ https://myanimelist.net/news/67543736?_location=rss
+ 'Seishun Buta Yarou' Anime Series Sequel Announced
+ The Aniplex Online Fest 2022 event announced a sequel for the anime series adapting Hajime Kamoshida's Seishun Buta Yarou Series (Rascal Does Not Dream) light novel on Saturday. The event also revealed the main cast, staff, teaser visual (pictured), and an announcement promo. The new anime project will cover the eighth and ninth novel volumes titled Seishun Buta Yarou wa Odekake Sister no Yume wo Minai (Rascal Does Not Dream of a Sister Venturing Out) and Seishun Buta Yarou wa Randoseru Gi...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664064362-eff108a231a521c9e0d749151c2cd517.jpeg
+ Sat, 24 Sep 2022 01:58:04 -0700
+ https://myanimelist.net/news/67543736?_location=rss
+
+
+ https://myanimelist.net/news/67543640?_location=rss
+ Manga 'Yamada-kun to Lv999 no Koi wo Suru' Gets TV Anime in 2023
+ The Aniplex Online Fest 2022 event announced on Saturday a television anime adaptation of Mashiro's Yamada-kun to Lv999 no Koi wo Suru (Loving Yamada at Lv999) manga and revealed the main cast, staff, teaser visual (pictured), and teaser promotional video. The anime is scheduled to premiere in 2023. Inori Minase (5-toubun no Hanayome) and Kouki Uchiyama (Horimiya) are starring as Akane Kinoshita and Akito Yamada, respectively. Staff Director: Morio Asaka (Chihayafuru) Series Composition: Ya...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664008520-2488faf98f588082b192aa47738477e3.jpeg
+ Sat, 24 Sep 2022 01:35:58 -0700
+ https://myanimelist.net/news/67543640?_location=rss
+
+
+ https://myanimelist.net/news/67543518?_location=rss
+ 'Shiro Seijo to Kuro Bokushi' Unveils Main Cast, Additional Staff, Spring 2023 Premiere
+ The Aniplex Online Fest 2022 event unveiled the main cast, additional staff, teaser visual (pictured), and a teaser promotional video for the television anime adaptation of Hazano Kazutake's Shiro Seijo to Kuro Bokushi (Saint Cecilia and Pastor Lawrence) manga on Saturday. The anime is scheduled to premiere in April 2023. Hime Sawada and Kaito Ishikawa (Seishun Buta Yarou wa Bunny Girl Senpai no Yume wo Minai) stars as Cecilia and Lawrence, respectively. Staff Art Director: Chieko Nakamura...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664006632-b80c8ee3415c8893d4b0a10837a471bf.jpeg
+ Sat, 24 Sep 2022 01:05:06 -0700
+ https://myanimelist.net/news/67543518?_location=rss
+
+
+ https://myanimelist.net/news/67543446?_location=rss
+ Light Novel 'Fate/strange Fake' Gets TV Special in December 2022
+ The Aniplex Online Fest 2022 event announced a television special anime for Ryohgo Narita's Fate/strange Fake light novel on Saturday. Aniplex simultaneously opened an official website, revealing the main staff, cast, a teaser visual (pictured) and teaser promo. The special episode, subtitled Whispers of Dawn, will debut on December 31 this year. Staff Director: Shun Enokido (Manga de Wakaru! Fate/Grand Order), Takahito Sakazume (Princess Connect! Re:Dive Season 2 episode director) Script:...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664005495-19c4a2d53da1a9d24c93d0ab4313639a.jpeg
+ Sat, 24 Sep 2022 00:45:55 -0700
+ https://myanimelist.net/news/67543446?_location=rss
+
+
+ https://myanimelist.net/news/67543338?_location=rss
+ 'Mashle' TV Anime Reveals Main Cast, Staff
+ The Aniplex Online Fest 2022 event revealed main cast and staff for the Mashle television anime on Saturday. The anime is scheduled to premiere in 2023. Voice actor Chiaki Kobayashi (Tomodachi Game) is starring as Mash Burnedead. Staff Director: Tomoya Tanaka (Engage Kiss) Series Composition: Yousuke Kuroda (Boku no Hero Academia) Character Design: Hisashi Toujima (Sword Art Online: Progressive Movie prop design) Music: Masaru Yokoyama (Ao Ashi) Studio: A-1 Pictures Koumoto began serializing the...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664004366-765deb5950555733aa5e75edb0ed3adb.jpeg
+ Sat, 24 Sep 2022 00:26:51 -0700
+ https://myanimelist.net/news/67543338?_location=rss
+
+
+ https://myanimelist.net/news/67543111?_location=rss
+ 'NieR:Automata' Reveals Main Cast, Staff for Winter 2023
+ The Aniplex Online Fest 2022 event announced the main staff, cast, and a teaser promotional video for the NieR:Automata television anime series on Saturday. The anime is scheduled to premiere in January 2023. Yui Ishikawa (Shingeki no Kyojin) and Natsuki Hanae (Summertime Render) are reprising their roles from the game as YoRHa 2-gou B-gata and YoRHa 9-gou S-gata, respectively. Hiroki Yasumoto (ACCA: 13-ku Kansatsu-ka) and Kaoru Akiyama (Detective Conan) are also returning as Pod 042 and 153. St...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664002401-72e4516f587d1484fd09a90518ec9a96.jpeg
+ Fri, 23 Sep 2022 23:54:28 -0700
+ https://myanimelist.net/news/67543111?_location=rss
+
+
+ https://myanimelist.net/news/67542924?_location=rss
+ 'Tomo-chan wa Onnanoko!' Announces Additional Cast Pair
+ The Aniplex Online Fest 2022 event revealed two additional cast and a character introduction promo for the Tomo-chan wa Onnanoko! (Tomo-chan Is a Girl!) television anime on Saturday. The anime series adapting Fumita Yanagida's romantic comedy web manga will premiere in January 2023. Kouhei Amasaki (High Score Girl) and Yoshitsugu Matsuoka (5-toubun no Hanayome) are joining the cast as Kousuke Misaki and Tatsumi Tanabe, respectively. Hitoshi Nanba (Golden Kamuy) is directing the anime at Lay...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1664000449-9b35b85132e0d95e178cf26c3144e50a.jpeg
+ Fri, 23 Sep 2022 23:21:42 -0700
+ https://myanimelist.net/news/67542924?_location=rss
+
+
+ https://myanimelist.net/news/67542620?_location=rss
+ New 'Rurouni Kenshin' TV Anime Unveils Cast, Staff, 2023 Premiere
+ The Aniplex Online Fest 2022 event unveiled the main cast, staff, a character visual (pictured), and first promotional video for the new television anime adaptation of Nobuhiro Watsuki's Rurouni Kenshin: Meiji Kenkaku Romantan (Rurouni Kenshin: Meiji Swordsman Romantic Story) manga on Saturday. The new anime series will premiere on Fuji TV's noitaminA programming block in 2023. Souma Saitou (Yuukoku no Moriarty) and Rie Takahashi (Re:Zero kara Hajimeru Isekai Seikatsu) are starring as...
+ https://cdn.myanimelist.net/s/common/uploaded_files/1663995793-1143f1e9dc9d1c3ed8c083793f9727c8.jpeg
+ Fri, 23 Sep 2022 22:04:50 -0700
+ https://myanimelist.net/news/67542620?_location=rss
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_nixers_newsletter.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_nixers_newsletter.xml
new file mode 100644
index 000000000..8759e0046
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_nixers_newsletter.xml
@@ -0,0 +1,16308 @@
+
+
+
+Nixers Newsletter
+https://newsletter.nixers.net/
+The nixers.net newsletter
+ nixersnewsletter
+ https://newsletter.nixers.net/entries.php#111
+ 2019-01-25 00:00:00
+ Nixers Newsletter
+
+
This is complementary to "The classic, the beautiful" of issue 105. Get
+your source from this issue and image from the next link. It goes in
+depth into the thinking needed to build an OS. As with this type of
+content, this is quite a big read so enjoy it over a long period or
+until you get bored, which hopefully will take some time.
To take the place of your user and give them what they need you first
+need to know who your users are. That first link lists everything
+that is required, and not so often thought about, to create a usable
+OS interface. A reminder of "Ever installed a Unix-like system for a
+friend who's not techie?" in issue 54. And finishing with yet another
+of those trendy OpenBSD on a laptop type of post.
This week we switch the focus to NTP (see number 5 again), have a
+discussion about things we may not directly think about that affect
+time precision, and that finally leads us to talk about PTP for when
+NTP is not enough. Some interesting things to keep in mind: ppm, parts
+per million of beats can be used to measure clock accuracy, normalized
+frequency offset is also called drift. This will take us next week on
+the journey of real time clock, real time Unix systems, and maybe the
+use of time in distributed computing or other time sensitive operations.
Remember the "New blog to follow" of 58, in this article we do a
+roundup of the C89 standard, a quick brief overview... Well brief but
+still quite thorough and entertaining.
I find this case to be a convincing one, this is something that is
+required these days and that probably needs to be standardized across
+the Unix panoply.
I've been listening to a lot of talks recently and speeding up the
+tempo changes the pitch, so if you don't want everyone to sound like a
+martian this will help. I've also learned that mpv has this behavior
+by default or through --audio-pitch-correction.
ClarityOS is Safe/Secure/Modern/Reliable HardenedBSD fork. Goal is to make BSD as open and customizable as possible, while keeping it easy, simple and accessible to as many people as possible!
+https://clarityos.net/
+https://clarityos.net/images/screen.png
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
I like it when someone applies their expertise of the past to a problem
+that they find similar in the present. Here we're discussing containers
+and showing a demo while saving a lot in the size of the image. As
+an extra there's a deep well thought meditation about the topic of
+multi-factor authentication, highly recommended.
If you've never heard of this blogger this is your lucky day. There's
+a lot of book and helping sheets on the website in the same style as
+_why, no wonder the author is also involved in ruby.
Actually, scrap that title aside, it's not a perfect article at all.
+See also "And BSD for the Linux guys and gals" of issue 40 which was
+a bit better.
Remember all that talk about PLT/GOT we had previously, well it's
+paying off, we're now able to understand what this talk is about. Also
+a continuation of "BSD hacking and security" in issue 63.
With all that talk about FreeBSD we're interested in a refreshment,
+let's see what's up in the Linux world. We could've checked OpenBSD but
+we're too used to jumping in that direction when it comes to security.
Let's first review the first issue "Keeping time and date (1)" to
+refresh our memory about what is time and if days are really 24h. Are
+there instruments available to measure time precisely, how do they take
+into account the earth uneven speed. We want to still track time as a
+drift from that stable time but how do we propagate the changes, let's
+hear again about leap seconds and the new concept of smear time. And
+we finish with the introduction to the standard method to propagate
+external time, to sync up with the world and the sources of precise
+time, along with different examples on how to do that.
Traveling back to 2009 to remind us of the state of the TTY
+infrastructure on Linux, and mostly in general what needs to be
+supported and expected from all platforms.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Are you a university student and want to refresh your memory about how
+to encoding floats or maybe you've never seen those before, don't worry
+it's all explained in there. It's all about finding a way to represent
+and pack information in bits, just like what we saw in 71 "Let's play
+with encoding and formats" or 61 "ID3 tags" and many more issues before.
How to hide your mischevious deeds without them being noticed
+spontaneously, this is what is tackled in this article. It's only the
+tip though, the first one in the series touching listing processes
+that can be ptraceable.
It's my first time cloning the Arcan project and trying it first hand
+by going through the tutorial, it's really nifty, give it a try. It
+gives that gaming framework vibe which is quite interesting and makes
+you wonder about what kind of user interfaces could possibly look like.
I wrote an article to clarify things to those who get confused about
+X11 window manipulation utilities and for everyone else who simply
+are looking for new ideas. This was principally made to cover only
+wmutils but I thought of making it broader.
DistroWatch - Musings on Distros After Prolonged Use (2019). "FreeBSD is probably my favourite server-oriented operating system, mostly because it never surprises me. FreeBSD tends to do what you tell it to do, and just do what you tell it to do."
+https://distrowatch.com/weekly.php?issue=20190107#lookback
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
A follow on "Stable API nonsense" from last issue (107) and also
+"OpenBSD doas update and virt" in 99. Versioning and setting the
+boundaries of what can be considered backward compatible is hard.
Another case of wanting to optimize too early but an interesting
+discussion to have nevertheless. This reverbs back with the c10k and
+async problems ("Async IO" 105, "The C10K problem" in 52, "c10k follow
+up and a bit about flamegraphs" in 53).
Somewhat related to "Kernel module" 64, some presentations about the
+innovation (not so new though) of having a lua interpreter in kernel
+space making it an extensible operating system.
We started a bit last week with the types of hardware clocks the kernel
+can rely on, it's the point that we will focus on this time. Where
+is time stored on a machine, what actually ticks. As a bonus in this
+series and because it should be part of it, I'm adding again "What
+is time" from 85, this should include some ideas that will introduce
+future topics.
I got a bit back into the WM world the past days, especially reading
+icccm and ewmh format specs. That first link is an interesting paper
+about issues that can happen when implementing a WM.
In continuation with some topics from the previous research link such
+as race conditions, we review a tale from the old days about atomic
+writes. You can get "The classic, the beautiful" from 105 and tag along.
A great article to add to your list of other great articles about
+terminal understanding, I'm not going to list them again here but you
+can search the newsletter archive for them.
I'm not a fan of listicles in general but I thought it would be fun
+to share these. A follow up on all the performance articles we've
+shared before but that don't tackle or even mention "perf".
This is the first fressh issue of this new year. As cliché as it sounds
+let's emphasize some thoughts about change.
+
+
Remember those "Culture clash" from 86 and "Edge effect" from 84, let's
+start on this tone. Give yourself permission to make yourself a priority,
+at least for a while. Try out new things, or continue what you've left
+behind, or simply grow on the same path.
+
+
+
"We often underestimate our capacity to reinvent ourselves" - Shankar Vedantam
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Let's start this issue with a continuation of this series. Those
+should answer the following questions: What are the types of times:
+hardware and system (more on it later), how to get/set the current
+times, how to set the current timezone, what is this Unix/POSIX time
+we often hear about, what is one source of time (also more on it for
+next issues, leaving it ambiguous for now).
We covered a bit before what flamegraphs are about in "c10k follow up
+and a bit about flamegraphs" of issue 53, also about dtrace in some
+others, so let's continue with the whole performance suite.
Linux for forensic, this reminds me of "Command line for the data
+scientists" in 72, Linux can be for anyone. This is really just
+introductory (and a bit outdated), touching the basis but could still
+be considered a follow up on "We discussed a lot of forensic..." in 56,
+"File system forensic" in 43, "A forensic version of dd" in 42, and
+"Data security" in 73.
I knew the Arch wiki was good but I'm still surprised by how thorough
+the security article is. As for all the rest of the content you can
+enjoy how security can be implemented in so many different ways, this
+covers a lot of ground. Maybe you can also read again about PAM, it's
+been a long time, "Everything you need to know about PAM" in issue 12.
This week is a week of festivity in a lot of parts of the world. So let's
+share a piece that I've found helpful, maybe you'll find some value in
+it too.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Those ones are easier to start with after diving into all the previous
+content, it wraps things cleanly together. As far as the last link is
+concerned, it's a bit of a hassle to read for me so far, not so well
+ordered and explained, but probably a must to bookmark it for later.
There's nothing better than hands on experience to learn what we've
+been reading about. Other than using the usual tools such as readelf,
+objdump, and all the hex editors available, this repo offers much more.
To wrap this up, this another week of long reads. In continuation
+with the dynamic linking articles series, we now tackle the body of
+concern: ELF. Also review "Magic bytes" in 100 and "Executables &
+default program" in issue 77. Maybe you should start with getting
+used to manipulating simpler byte structures, such as what we did
+before in issue 71 "Let's play with encoding and formats".
A quick and nice review of what the grub CLI offers. You probably
+can bookmark that when you're in a pinch and need to check them or
+maybe you just want to "play" a sound (that can't be muted), or add
+a password to your booting process, or boot from a network image.
Two quick books by Daniel Stenberg, the author of cURL, on HTTP2 and
+HTTP3 and what has been attempted the last few years to speed up the
+web. The last link is your weekly dose of crypto, a study of common
+crypto libraries and how they handle X509 parsing. OpenSSL might be
+written by monkeys as vermaden mentioned but it's still doing fine. As
+far as I'm concerned I've dealt my good share with BouncyCastle,
+and it's not that bad as far as the programming side goes.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
The original papers with additional commentaries to help you read
+through them. As time goes by we're more impressed by how it's
+a breeze to read through such fundamental building blocks to the
+current ecosystem. The second link is fun because you have the source
+attached on the window on the right, though it's missing the name
+of the files/sheets. This is quite a big reading so take your time,
+I'm not done myself.
Everything can be rewritten in rust, that's the spirit we've learned
+from "How to for a Rust kernel" in 103. This fantastic and approachable
+paper (at least in the beginning) doesn't only cover how to translate
+a driver from C code to Rust but, as with the kernel one, gives a
+tutorial on how network drivers and on Rust in general work.
Keeping track of time is important for the activities humans do. Old
+mechanisms were based on the apparent sun position. However, appearances
+can be misleading, the earth speed is uneven and the sun is rarely at
+the highest point at noon. Not to mention that a day is not exactly 24h
+(we'll see the leap seconds in another issue)
+Improvement in worldwide communication and travel required
+parties/entities to agree in a mutually comprehensible time
+reference/standard.
+But time differs locally and so a synchronization mechanism needed to be
+adopted world wide, even if it differed from sun time. Many standards
+have been tried. The concept of time zones was put in place, an offset
+from the standard time, but had to be flexible depending on the people and
+especially countries and their economies. This is what UTC is about.
+Most timezones are whole number of hours but a few of them are offset
+by 30 or 45min. Then to make it more complex, daylight saving time
+(DST) appeared for weird economic reasons. Which these days are being
+reconsidered in the EU (see "TIMEZONEs" in issue 101).
+A nice start to the topic would be to know how we write time, the
+formatting. This is where the concept of locale on Unix comes in. The
+$LC_TIME where you specify one of the well known format you want to
+use for time.
+For the next issue more questions arises: What is time exactly, a unit,
+how is it measured in computers and electronic devices these days,
+especially on Unix? What about errors, drifts? How do we specify
+the base standard time and our offset from it on Unix. And much more
+to come.
Big projects, big planning and engineering, you need at least to have
+worked with one of those in your life as a programmer. Pulseaudio
+creates a lot of flamewars on the internet but it's still a nice
+humbling piece of engineering. This is quite a long read, so prepare
+yourself. It has everything, from the overview, to objects used within
+the code, to complex examples and applications.
Another dive into a deep topic, similar to "Talking about fan base"
+of 92, "Containers management" of 91, "Contain and protect" 76,
+"Contain and protect" of 104, "Containers from scratch" of 51.
Another exploration into the world of fonts
+on Unix, see "More on typography" in 63, fonts on
+Unix,
+and "Xft but for xcb" in 91. The first article is a review of the stack
+we've already encountered, the second one goes over the Xft library
+design and usage, the last ones are a bit more explanation about the
+core fonts XLFD format so that you can compare it with the fancier Xft
+matching features (which is fontconfig matching actually). I highly
+recommend them to anyone interested in fonts and that want to follow
+up on what we've shared before.
You might think it's straight forward to parse URLs but it's not,
+have a look. And the representation of the strings themselves is not as
+easy either. We also talked about this in the article "How to implement
+strings" of "Programming tricks and knowledge" of issue 100.
KDE4 and QT4 Deprecated in FreeBSD. KDE4 will be removed at the end of this year (before 2019/01). QT4 will be removed in the middle of 2019/03.
+https://euroquis.nl/bobulate/?p=2007
As you may have noticed I've removed the Random section of this
+newsletter. There's already enough content, brace yourself for a long
+read this week. Sorry for the double email, I almost missed vermaden
+valuable news.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
A review of the legality surrounding the UNIX name and which part of
+which UNIX system is open sourced, to which degree and what manner. This
+is probably the first article with as many German words as this one
+that I read, it's fun.
This is the research paper I was talking about last week (103) in "ELF
+symbol resolution". As with anything written by Drepper, it's heavy
+content and emphasizes on things to do so that code is optimized by
+the compiler and when running. Be sure to read last week entry because
+you'll need it to understand this one.
I got reminded of this last week during our conversation on the forums
+about future interfaces. Maybe we'll got back to terminals that update
+per block depending on form filling, just like what we have today with
+web APIs.
I had no idea flickr was still a service. This post is another instance
+of replacing a paid service with another one and use a script to help
+you do that.
Another article about make best practices, see "Make" in issue 66 and
+"Makefiles, Ohoh those Makefiles" of issue 38. This one covers basic
+things such as variable assignment for specific parts of the Makefile,
+pkg-config to find libs, and more.
With the third article from our friend tejr this ought to be an
+interesting advent calendar, a month of vi and vim tips. Lots of fun
+articles so far! Adding along the way the beautiful vim koans of tejr
+and another opinion piece about vi. There's also a qemu advent calendar
+now, checkt it out too.
And this one deals with the touchpad. One idea I could take from this
+post is to disable the touchpad while typing. Those are all pretty
+hard to configure and don't come out of the box, maybe in the future
+distributions can focus on making this easier.
As you might have noticed we've linked vermaden's blog more than
+once in this newsletter, there's great content in there. On it the
+author also pushes more or less weekly/bi-weekly news/updates similar
+to this newsletter. You should check it out. I've contacted vermaden
+to see if it would be interesting to add a column in the newsletter
+with his/her content also. This is what we'll try out from now on. As
+you will notice there's a new section inserted here with links that
+will be as new for you as they'll be for me. Vermaden Valuable news
+is usually composed of Unix news&updates, some hardware related news,
+and a life&other section similar to the "Random" section. Let's hope
+you enjoy the Unix love. This week we have a lot of links about BSD
+desktops, lots of new releases, ext4 fs on FreeBSD, bringing back old
+Unix to life (you can even download the image), and much more. We also
+brought back Xero's ricing tips section.
zathura is a vi{m,} like pdf and comicbook viewer.
+
+
besides having vi like bindings and a minimal ui, zathura is
+extremely "riceable" and has a awesome feature called "recolor".
+when set to true, you can define custom colors for bg and fg of
+textual documents, but it also sets images to greyscale and tints
+them in matching inverted hues. :set recolor is a toggle command,
+so if your set it to run by default in your ~/.config/zathura/zathurarc
+file, manually calling it from the ui will disable the feature.
+
+
here's my config for reference:
+https://github.com/xero/dotfiles/blob/master/zathura/.config/zathura/zathurarc
The first link I've stolen from vermaden's "valuable news" and went
+on a spree of related ideas. We live in a society/world that loves
+to find clear causes to things, see "Development and learning" in 93,
+especially when it comes to finding out if we're doomed/fated/determined
+for a path. We want to find heroes and villains, distinctions and no
+ambiguities. In those 4 articles this is the topic that comes across.
Yet again a topic that follows a train of thoughts from earlier issues,
+see "The Shirky principle" in 72 and the thought section of issue of
+issue 99.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
I love it when tools like this come out. While we could be satisfied
+with the default, usually not so user friendly, proof of concept the
+original developers have come up with, it's awesome when the community
+builds upon the starting block to create what they need from them.
We've talked a lot about memory allocation, garbage collection, how
+to write your own malloc ("In memory layout and Go" in issue 96,
+"sbrk and malloc" in issue 53, "Malloc source" in 42, "Pointers,
+pointers, and pointers" in 25), linking parameters ("LD.SO" in issue
+54), the heap (see "Heap, malloc, glibc" in issue 85), the ELF format
+("In-memory-only ELF execution" in issue 69, "Tiny ELF" in issue 47,
+"The world most prominent virus has erased all the source code" in
+issue 52, "Diving into and ELF" in issue 44, and more) and whatnot in
+this newsletter, this is a continuation of the thought process. I've
+got an extensive PDF for next week also, let's hope I can finish it to put it in
+the next issue.
A complementary on "For all those people trying to rewrite a kernel"
+of issue 96. This is a tutorial on both kernel system calls and rust
+programming at the same time.
More and more on the VFS internals, continuation of "VFS, proc and
+root filesystems" in 58, and "VFS in more details" of 62, and certainly
+the podcast about "Data storage on Unix".
This one is quite old compared to the other links I've shared about
+fuzzing in the newsletter before but I waited on it to be a full fledge
+popular topic. The article itself is a smooth introduction to fuzzing.
If you carry with you absolutes on the internet you'll certainly
+bring about discussions and arguments. "Every system is built from
+a DSL designed by the programmers to describe that system. The
+art of programming is, and has always been, the art of language
+design. Robert Martin". Having a lot of quotes in a piece and is a
+mark of an opinionated piece.
Yet another instance of big opinions, this one I found quite
+interesting to read and it's written by a nice fellow you probably
+know. A follow up type of link for a sort of new series of ideas, see
+"Open internet/source/culture and the future of this all" in 101 and
+"A year of big acquisitions, big changes in priorities" from week 99.
Click-baity title but a pretty decent discussion by RMS on the Taler
+system and how it compares with cryptocurrencies. This is in contrast
+with the previous link, OSS vs FOSS.
We've shared that blog before in "Shells and pipelines" of issue 75. In
+this one we're being sold the idea of having emacs for everything with
+only benefits.
But a good one, not an annoying listicle type. It gets 2M hits a
+month on the blog and I've just discovered it. The second post is
+also related to organizing yourself, the usual work-life balance,
+a quite popular topic on technology news website. It reminded me
+of the discussion we had on the forums about Scientifically Proven
+Digital Attention Helpers,
+things such as knowing the times in the day when you are more focused,
+finding what works when guiding yourself towards an intent, what keeps
+you focus or reminds you of what you need to do (environment or not),
+splitting big tasks into smaller achievable ones to be able to track
+them, going with the intent rather than a goal, etc.. See also "Time
+management and management in general" of issue 98. While also ending
+on a good note about the histrionic busy: see "Over-Productive" in 78,
+"Production" in 66, and "The busy trap" in 32.
There was a time when anime wasn't associated with what it is today,
+a time of burgeoning. Probably one of the most impressive animated
+movie I've seen, along with the Studio Ghibli.
Also, yet again, a recurrent talk in this newsletter: fonts. This
+episode covers custom typeface, why companies do it, should they
+continue doing it, and if you should you pay attention.
+
+
+
Thoughts
+
+
+
Judgment is but a mirror that reflects the insecurities of the person
+ who’s doing the judging.
Some people live in a world where there are haters and lovers, people
+that get you and others that don't, everyone judging each others,
+scaling and measuring their behaviors, inspecting if everyone moves in
+their plastic manner, pantomime, and making sure they never diverge
+from their cookie-cutter molds otherwise we'd have to re-invent how we
+perceive them. It's a world where one move means everything, where you
+can't make mistakes.
+The thing is this only exists when we are teenagers full of hormones
+living the school days life (or if you're a politician). Real life is
+much more complex, so get over it.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Unikernels are getting more popular in the world of
+containerization. Other discussions about kernel talks in the newsletter
+such as the classic "Monolithic vs micro" from 37 and "Not really unix
+but close and soon will be" in 41 come to mind.
While being corporate-ish Redhat is still one of the front face,
+along with Oracle and others, to Unix-like operating systems. That
+first link brings hope to the first entry of this newsletter.
Another topic that keeps showing up, see "POSIX shell and no bashism"
+in 93, "A new shell, why?" in 87, "One liners again..." in 79, "Shells
+and pipelines" in 75, "Using bash not only for small scripts" in 64,
+"Bash and shells" in 57, "Bash the bash for bash the bash" in 23, and
+"Expansion & Globs" in 17. That amount of articles on bash and shell
+tricks in general is an example of how tricky it is to use them safely.
I'll subscribe to this and listen to it during the week, I have a huge
+podcast list. The first episode sounds captivating. This should add
+some spices to all the recent news such as the drop of KDE in RedHat
+in favor of Gnome support, the shell extension and themes discussion,
+the hackathons follow up, and much more.
Creating a font that looks nice in all situations is hard, and it's even
+harder when it's a bitmap font. Also, be sure to disable antialiasing,
+subpixel rendering, and hinting to keep the crispiness of the bitmaps.
Should you care about the people that are relying on unintended
+behaviours to build software using your libraries. What about when you
+break/fix this behaviour. We've seen that a bit recently in "OpenBSD
+doas update and virt" of issue 99.
A title that shouts "CLICK ME" with an article that is more or less
+fair. In my opinion switching from one language to another is only
+moving the problem from one space to another space, a whole lot of
+new security issues will arise. What do you think?
We've done gaming on Linux ("Missing games?" in 50 and "Free games"
+in 10) and recently gaming on OpenBSD ("Extra" in issue 90), this time
+we're doing gaming on FreeBSD.
I don't think I've read a more politically loaded articles this
+year, I'm not sure why but this is not a trend I'm found of and from
+the discussions on the forums and irc I know a lot agree that this
+is getting tiresome. Trying to paint a narrative over whatever is
+happening, especially a narrative that only applies in certain parts
+of the world. Keep away with your anti or pro capitalism talk from the
+60s and let us enjoy the tech instead. Especially when it comes to the
+second article and the author nagging about Google being a corporate
+evil because their own product features are not supported in their
+pdf reader.
Another revisit of the topic of "the slow feel", this one feels
+complete. Somehow related to "Learning From Terminals to Design the
+Future of User Interfaces" in issue 22, "Latency, second round" in 33,
+and "This is why NES games are awesome" in issue 28.
Meditation, learning psychology, taking the time to teach ourselves
+about cognitive biases, controlling our day to day intents and attention,
+leading our future changes and directions. All those are things that are
+possible and we live in the best time to try them. As much as a cliché
+as this is I still thought of putting this as the thought of the week.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
We're seeing this blog more in this newsletter and there's a reason
+for that. A follow up on "Contain and protect" from issue 76. It's
+the counterpart of pledge and unveil from OpenBSD on FreeBSD.
Timezones are complex, and adding DST to it doesn't make it easier. I
+wish I could live in my own timezone like that author, maybe my wish
+would come true using that trick. It's also my first time encountering
+the utility zic. As a bonus, because we've saved some hours with
+our custom timezone, we'll get a wonderful discussion about mtime,
+the modification timestamp set in the inode (see stat(1)). In my
+opinion only two or three of the issues brought are actually issues
+to care about, the others are some edge case outside of scope.
Some meditation on topics some might be accustomed to: open source
+culture, geek groups, developers thoughts of their own future and
+balance of life. While I can't really get some of the discussion I can
+still sympathize with it and have seen it displayed in people I know.
That first post could be listed as a case of using the wrong tool for
+the task, shooting yourself in the foot at the same time. The second
+post has a discussion on vim usages across ages, a pretty basic one
+but something you can share with someone not knowledgeable about vim.
Gwern's articles are always well researched and usually get updated
+a lot over time. This section in his "Surprisingly Turing-Complete"
+one makes you think about how complex system stack up layers over
+layers with time.
How can the absence of a thing be a sign? And yet it is.
+
+
+
Thoughts
+
+
+
If you can't tell me what you'd like to happen it means you don't have
+ a problem yet. It's simply nagging. A problem exist only if there's a
+ difference between what is effectively happening and what you'd like
+ to happen.
+
+
+
Going along with the last link of the random section, a thought that's
+been playing in my head for some time now is to "Make explicit what is
+implicit". We often assume wrongly that some things should go unsaid
+but it's always better to be clear about what we have understood, what
+we expect, what we would wish would be the best possible outcome, that's
+the only good way to avoid mistakes and misunderstandings. Also we need
+to add that this does not only apply to problematic scenarios but to any
+others, if we like something we should be explicit about what exactly
+what done right and what exactly we liked, this way everyone progresses.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Media craze, maybe. I just don't think there need to be such silly
+reason behind the IBM acquisition, putting KDE in the loop along with
+conspiracy thinking. Gnome is getting lots of news as of lately also,
+see "Gnome shell extensions", "Themes and the past" in 87.
Same as some of the previous week posts: "OpenBSD on the desktop" in 97,
+"BSD on desktop and more GUI stuffs" in 80, and "BSD on desktop and
+laptop" in 72.
A well done and thorough presentation about tiling window managers,
+why use them, and how to use 6 of them. Highly recommended for anyone
+that has no clue on that topic.
"A new shell, why?" in 87 depicts why you should keep your hopes down
+but it's still fun to try out different things. It's very friendly to
+use, sorts of reminds me of fish. One annoying thing I noticed is that
+it doesn't respect ctrl-l to clear the screen but goes into history
+mode instead though it can be overridden. The last link is in the same
+mindset, a new tool to build pipelines.
We've all had our popcorn ready the last few years, this sort of
+articles reminds us that it's not all about stupid internet flame
+wars but that real works needs to be done to back up software projects
+otherwise they die out.
A friend of mine was trying to find the file type of an unknown file,
+I thought of pointing him in the direction of magic byte/number (file
+signature). This kinds of remind me of binfmt_misc on Linux, see
+"Executables & default program" in issue 77.
From swapping without intermediated variable, to the wonderful
+complex world of string implementation, to a walk-through
+on how QR codes are generated (the only thing bugging me
+here was how the format bits were not explained, so check it
+here
+instead, more fun in this link),
+and finally ending with a paper on generic paradigm.
Some thoughts, opinions, arguments, and researches on working
+remotely. What do you think of this, maybe it can be your subject of
+discussion for the week.
"If your product is so awesome, have you stopped to consider why no
+one is using it?", I've seen security advocates tell people to write
+down their passwords on paper, put it in a tamper safe envelope and
+store this envelope in a place that no one can reach easily.
This is not really news, but I thought of having a space for it here.
+
+
+
Thoughts
+
+
It's been a 100 weeks of Unix newsletters, congratulations everyone! 1763
+Unix links, 569 random interesting links, all and all more than 2300
+links.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
I sort of avoided putting business-y articles in this newsletter
+but I guess it's good to discuss the big acquisitions of this year,
+this clearly shows the direction that the tech world is taking and is
+putting its bets on.
It's one of the thing I keep hearing about from people using Linux,
+the reviews are harsh but fair. I guess we should keep our expectations
+low and be surprised when something better happens.
Hopefully it'll get patched soon, what can I say. I mean, I don't
+agree at all that we shouldn't use at all whatever is layed out in
+this article but there's a point.
Also a blog we've seen before in this newsletter, in this episode
+we'll discover yet another intricate and edge scenario about running
+out of memory.
Internationalizing the kernel sounds like a really bad idea... I'm
+not sure where and how anyone could think of this. However, removing
+all variable length arrays, that's something that is fruitful.
The first link reminded me of the binfmt on Linux, check "Executables &
+default program" in issue 77. It is related to unveil changes. I kind
+of like the conclusion "A thing which used to work stopped working, the
+unintended result of what should have been a harmless change. Ordinarily
+we’d call that a bug. Except this new behavior is actually what I
+wanted all along. So could the bug be a bug fix?"
You probably don't need to read this but it's kind of well done and
+I had no clue you could create a sort of PKI with ssh keys. See also
+"SSH ascii art" in 74, "You wouldn't believe what this ssh can do"
+in 72, "OpenSSH escape sequences" in 46, and much more content related
+to ssh and ssh keys.
A case of switch case optimization. One of those nifty tricks that you
+can show off to your coworkers, and maybe in future days somebody will
+wonder how the hek it works.
A desolating report I haven't gone entirely through yet, it's so backed
+up by so many scientists all around the globe, so thorough. I'll give
+it a better read this weekend.
I'm sending the newsletter early this week because I'm taking some
+vacations as a birthay gift to myself, I've worked 3 months in the span
+of 2 months.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Far are the days where people lived on different computing islands. The
+first link reminds us of the days of discovery and the second one is an
+example on how nowadays connecting everyone through the web is easier.
The first two are closely related to "About memory" in 58, "A summary"
+in 64, and "CPU optimizations" in 73, lots of discussion about compiler
+optimizations, specifically targeted at arm cpu. I'm quite a fan of the
+graphical representation and code example of the improvements, this
+is radically different than Ulrich's old paper. As for DragonflyBSD,
+that page was without a doubt popular and has finally been updated
+with some newer statistics of 2018 using the brand new "Threadripper"
+everyone has been spamming so much about in all the tech media (You
+gotta admit it's good PR). See for yourself if the BSD known for using
+SMP the best stays true to its name on the 64 threads monster CPU.
When you run a box remotely, be it a VM or any other type of virtual
+or real machine, you sort of run into the issue of monitoring and
+managing that system. Here is some content to do this on OpenBSD.
The start of a series of post about the difference between Arcan and
+Xorg, we talked a bit about Arcan before in "GUI" in 77 and "Awk for
+multimedia" in 44. This articles brings a lot of X related topics such
+as rendering, fonts, input management, clipboard (see "X11 Clipboard"
+in 9), etc..
Tired of tmux, screen, or dvtm, then try this new kid in town. However,
+after 2h of trying to fix the compilation issues with Cargo I think
+I will just give up trying it first hand.
We mentioned fuzzing a lot before, see "Now give me some BSD to balance"
+in 88 amongst others. This time it's about automating the creation of
+PoC based on CVE.
An old school type of bug, bad command-line parameter validation and
+bad usage of setuid. Maybe fuzzing would've helped finding it earlier,
+what do you think?
This series of articles has been magnificent so far. Even if the author
+insists that it's about procfs it is about way much more, it touches
+many interesting topics of the Linux kernel.
There's a bit of hype about GC these days, be it java 11 ZGC (see
+"Solaris 11.4 SRU and Java 11, everything Oracle" in 94), or Go GC (see
+"In memory layout and Go" in 96 and "For all those people trying to
+rewrite a kernel" in the same issue), or Mozilla Firefox JS updates
+on their GC, or Rust gc, or whatever, all are thriving for better
+memory footprint.
Different types of articles about to-do lists, time management
+concepts/tools, how to do things right (as generic as that sounds)
+sort of taking the opposite of survivorship bias, and ending with a
+blog about management in general.
Typography is hard, this keep being said over and over again, and
+typography on a computer medium is even harder. This article is an
+expansion of "Vertical white space" in issue 63.
How to read a paper and how to write one, two very short and quick
+papers on those topics.
+
+
+
Thoughts
+
+
+
"There are two ways of constructing a software design: One way is
+ to make it so simple that there are obviously no deficiencies, and
+ the other way is to make it so complicated that there are no obvious
+ deficiencies. The first method is far more difficult." ― C. A. R. Hoare
+
+
"At first I hoped that such a technically unsound project would collapse
+ but I soon realized it was doomed to success. Almost anything in software
+ can be implemented, sold, and even used given enough determination. There
+ is nothing a mere scientist can say that will stand against the flood
+ of a hundred million dollars. But there is one quality that cannot be
+ purchased in this way - and that is reliability. The price of reliability
+ is the pursuit of the utmost simplicity. It is a price which the very
+ rich find most hard to pay." ― C.A.R. Hoare
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
An advanced paper (written in the typical style of security researchers
+aka not-very-readable) about FreeBSD system calls. Sadly, unlike
+everything else in most of the newsletter even weird esoteric research,
+I couldn't finish the paper as it was too dense (or maybe it's me).
Also a thought article with points on what the author liked or not about
+the OpenBSD user experience. Sort of related to all the entries that
+touch the topic of desktop and UX such as "Themes and the past" in 87,
+"BSD on desktop and more GUI stuffs" in 80, "BSD on desktop and laptop"
+in 72.
The first article is about getting more idle (power wise too)
+in the idle state by stopping the kernel tick if it seems like a
+good idea. Second one is about the freedesktop group (fd.o) having
+a discussion about their past, current, and future and direction. I
+added after that one a link to the gnome redesigns which they've been
+working on, see "Hackathon and secure chats" in 76. The last article
+is about how to be inspired by OpenBSD's unveil which we mentioned
+multiple times in this newsletter.
Lots of nostalgia in this article, but we've moved on. Is is rosy
+retrospection or is it not. The author dreads these new days as if
+they lack social network interaction... I'm not sure about that,
+more like there's too much of it, or maybe it's another kind of
+interaction. What's your take on that topic? A reminder of "Will
+Geocities websites make a comeback?" in 56.
A great series of in depth articles (it's going to be 30 in
+total!) on procfs and everything related, and much much more. You
+should follow up as the articles come out. Also related to
+"Procfs, capabilities, and netlinks" in 59, "VFS, proc and root
+filesystems" in 58 and "The mighty proc" in 52, maybe that first
+article in the series is somehow related to the data storage on
+Unix
+podcast..
Lots of people praise Apple for being full of intent on security and
+privacy, some agree on that stance, some say it's only marketing. In
+this blog post there's a list of steps that could easily be taken by
+any non-technical user to ensure a bit of security. Somewhat related to
+"The Shirky principle" in 72 and "Differential privacy" 47. The last
+link is not really connected to the first one but it's an issue that
+I've encountered this week and found interesting.
I already knew the Mercator projections were skewed but I've never
+realized how much and how to map the scales in my mind, this animation
+clarifies this.
Unrolling loops, something you must have heard many times before. A
+continuation on the series about old video games and video games
+in general, checkout last week (issue 96) "Sublime in video games",
+"Web adventures" in 93, "More game design beauty" in 88, "Camera in
+side-scroller games" in 88 also, and "Retro gaming" in 77.
A made a research on stress some years ago (see it
+here and found so many research
+about the horrible long term effects it has on us that I might have
+started to be biased about what I read about the topic. This fun
+article, along with the fascinating research paper, go over to the
+opposite side, the side where stress is a helper depending on how you
+use it and perceive it, a part of growth and human life.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Going over the memory chunks allocated by Go. You must also check "Heap,
+malloc, glibc" in issue 85 for an idea of the layout of the heap and
+how it's similar to Go structure. The second link is an extra because
+it has been covered multiple times before in a lot of other entries
+already such as "sbrk and malloc" in 53.
Whatever your preferred high level language this paper goes into the
+details, motivations, practicalities of writing a kernel with it. It
+has a big emphasis on memory/heap usage, things such as OOM and more.
Pale, even cringy and opposite, in comparison with "Yet again a Unix
+CLI discussion" of 77 and all the other Unix philosophy design talks
+such as the popular "The Art of Unix Programming" by ESR, but it still
+deserves a small mention.
A great thorough overview of monitoring tools and another big post
+by Brendan Gregg's about tracing, this one is about the new powerful
+bpftrace, see also "c10k follow up and a bit about flamegraphs" in 53
+and "So many tracing tools it makes me dizzy" in 43.
We covered a lot of the topics in this presentation in this newsletter
+already, some of the other content/features are also interesting:
+Portable Services, Boot Counting, OCI runtime support in nspawn,
+System Call Whitelist, DNS over TLS, and much more.
Open source and the joy of the legal world of licensing, the does and
+donts. In this article the author visits the different way licenses
+can be distributed.
Maybe this could be considered a continuation on the state of the web
+series, this time we emphasize on lightweight websites (even physically,
+see also "Ludites or not" in 72 and "Websites ideas" in 60) and a bit
+of digital identity with the topic of decentralization.
I'm not sure I agree with the description of the sublime that is
+portrayed here but I do certainly like the idea that it could be
+applied to some scenes or moments in video games.
Another link from the beautiful knowledge project, this time it's
+about Hanlon's Razor.
+
+
+
Thoughts
+
+
+
"Everyone is complex and made out of different parts. Those parts grow
+ at different rates. Some parts of ourselves could still be teenagers
+ while others mature more fully."
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Not much to say about this one other than to refer to "Terminal
+interface" from 92, "Alternative screen and the quirkiness of terminals"
+in 86, "Terminal madness once more" in 82, and also that when I
+started doing ascii arts with colors I was manually typing the color
+escape codes and it was time-consuming. Maybe refer to the terminals
+podcast found here https://nixers.net/showthread.php?tid=2108 or
+https://venam.nixers.net/blog/unix/2017/06/04/terminals.html.
The first link is a presentation about the implementation
+of device removal of a top layer in ZFS. The second in the
+list is maybe not as low level as the ones from "Device
+Mapper" in '77' but still very refreshing, for more review
+on that topic you can check the podcast on data storage on
+Unix.
+Thegeekdiary blog may sound clickbaity but I was surprised by the
+quality of the content, time to add it to your list of places to follow
+up. The last link is a wiki that goes over dmsetup, the command line
+tool used to manipulate device mappers the internals of things such as
+the raid and crypt implementations. There's also a list of other very
+interesting device mapper implementation I had no clue existed. I'm
+sure there are some people around that are fan of volume management
+and fancy device mappers stacks.
This week I was reminded of this tool, it sort of fit a
+business/security case we need. For those who wants to learn more
+about it those two links should get you started.
I've read this research, which is a sort of meta-analysis, about a
+year ago when doing a brainstorm on scientifically proven digital
+attention helpers. I thought of sharing it again this week, as this
+is a recurrent topic of discussion.
Last weekend I had this discussion with a friend about this series
+I ran in this newsletter about the WWW awesomeness of niche found in
+there and why I was doing that. The sort of refreshment in the face
+of the never ending list of articles and debates about the online
+click-economy, privacy, and attention span issues that I've discussed
+so much in the state-of-the-web state-of-the-mind series. This link is
+from this same friend, it's quite interesting and well researched as
+are a lot of those sort of educational Youtube videos, maybe not as
+niche as the other kinds of videos I've inserted in this newsletter
+but still fun. This is entry is more of a reminder of the topic then
+being about the content of the video. So, readers, if you stumble
+upon things on the internet that makes you go "Waw, damn this is good"
+then hit me up with it and I'll happily share it in the newsletter.
+
+
+
Thoughts
+
+
+
"Whatever your strengths are, they will likely lead straight into
+ your weaknesses."
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
A well explained, quick, and approachable paper giving an overview
+of OpenBSD network stack. This is my highly recommended read for the
+week. This is followed by a guide to running anycast DNS on OpenBSD
+in the world of homecooked community-based meshed network.
A sweet article going through the Unix way of starting new processes
+via already running processes and a "meditation" on the upsides and
+downsides of it.
The whole logic behind the test suite used for the GNU coreutils, a
+well designed test suite in my opinion. You can use the tips mentioned
+in the article for your owns.
The couple fight between pkg management and https, with a bit of a look
+at the shiny new TLS1.3 and finally giving the coup-de-grace showing
+how confidentiality here may not matter because it's not there so
+we should rely on something else. Related to "Nagging about Debian"
+in 63 and "APT and https" in 60.
Three links about the Chrome browser recent discussion and the last ones
+about crypto and security in general. The PGP one is related to "Spirit
+of the law" in 84, "Let's play with encoding and formats" in 71, "Why
+we should use plain text emails" in 75, and "Don't use PGP? Why?" in 42.
We kind of had a trend to create home pages similar to our window
+managers, this person takes it further by running the entire OS
+and discovering the security issues with it. This is close to "Run
+everything on the web!" of 19 and "Emulators in JS" of 16.
SRU or Source Repository Update, Solaris is still getting cool updates
+and support so far (see "Solaris is still alive" in 79), and with
+Oracle position on Java 11 this will all develop ""interestingly"".
"Arrows cycle symbol for failing faster", I have no clue why this
+image was chosen in the article... This is a bit related to our usual
+"data storage on Unix" type of article, while just grasping the tip
+of the iceberg it's still a good tutorial article that explains most
+of the content related to swapping.
I never could put this into word as well as this article did but this
+is something that I can't help but try to do as much as possible when
+working on projects.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
We've had a discussion some days ago about scripts to be "quick
+and efficient" so we'll
+continue with it. This one is not really about wrappers around anything
+but helpers to manipulate json on the pipeline. The tools seem useful,
+if I had to work with json all day I think I'd give them a try.
Another post from the ashogbo blog. It's my first time learning about
+the bhyve hypervisor, at least under that name and not vmm, and I
+already like it.
Cron jobs are not perfect but they aren't complex either. There are
+many reasons to not use them but use something else instead, would
+you give systemd a try?
Ever wanted to manipulate the linker at a lower level, commanding
+it on how it should place the section of the executable. Well, I've
+wanted to, and this small section of this book is a start.
In the last issue ("You certainly remember those" in 93) we talked about
+their history. Now we bring a subject dear to cryptography fans, sort
+of related to "A documentary about chaos theory" in 78 too. Shout-out
+to my coworkers, we should've bought lavalamps instead of a costly
+hardware security module.
The first post is a wonderful example of protocol reverse-engineering
+technique at its finest and the second just about the reproducibility
+chaos happening in the world of psychology the last few years.
A bunch of old-school text-based game revived to be playable in
+a web-browser.
+
+
+
Thoughts
+
+
+
"Chess has shaped how I think. This idea that most chess moves are
+ mistakes, even when made by very good players. Also, you can’t blame
+ other people for your own problems, even though some of your problems
+ may be their fault." - Tyler Cowen
+
+
+
You know the "Baader-Meinhof" effect, well it happened this week to. It
+seemed like everywhere I went chess made an appearance. From a series I'm
+watching with my significant other, to a podcast, to my coworker learning
+some new moves. Though I haven't got to play this week, ironically, but
+the concept that kept floating in my mind was the one found in this quote.
+
+
The newsletter is coming early this week because I'm taking some small
+vacations, have fun everyone.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
A work-in-progress article about the magic (mess) of terminals we've
+been so fond of. See "Terminal madness once more" in 82 and what it
+refers in its description, also "Alternative screen and the quirkiness
+of terminals" in 86. We've shared a lot of content related to this.
The usual "what my journey has been" sort of article. This one differs
+a bit so it's interesting to go through. Beware for those sensible
+persons that get micro-aggression-post-traumatic-disorder from hearing
+Linux and Unix in the same sentence.
Let me just quote this eloquent way to put things: "Bash: a language
+that was neither designed, nor evolved. An adequate solution to a
+problem that has since become orders of magnitude harder. As arcane
+as it is useful, as dangerous as it is ubiquitous, Bash: the language
+that asks how much we are willing to give up for convenience’s sake?".
There's a subtle manner to do simple things the right way without
+getting yourself in trouble. Here we explore killing a process,
+especially when we want to have it containerized and not contaminate
+all the system.
If you're into that sort of recollection of the past with all the
+gritty details then you'll like this, otherwise it'll all sound like
+some boring corporate story telling without value.
This article deals with writing code that doesn't lock or spin too
+much or use mutex everytime we have to read or write something in a
+multi-anything environment.
Another instance of pedantry related to name giving. A good definition
+in my opinion is "programming to maintain the system so that other
+applications can run better", close to the second definition in the
+first quote of the article.
This one finally brings the TLS v1.3 support we've been talking about
+for so long. This is the big feature of the release basically, enjoy
+and don't forget to keep doing security updates.
Another big list of content. Take your time to go through this wonderful
+blog about decision making, a sort of online think tank. Closely
+related to "Thinking in new ways" from issue 67.
No idea why I'm adding this but I'm adding it anyway. Fun history
+behind this weird contraption.
+
+
+
Thoughts
+
+
+
"does the tournament make sense as you keep going?"
+
+
+
Why are we striving for what we are striving for. Does it make sense to
+focus more on it or to stabilize, spread out, and balance efforts into
+other things. To keep going on in the tournament we have to put more of
+ourselves in it and so less into other things. Maybe this is a warped
+up way of saying "rat race" maybe it's not, it depends on how deliberate
+we are about our decisions.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Lots of projects and articles all with OpenBSD in mind as a
+platform. You can replace your cloud system provider with nextcloud
+and run it on OpenBSD. Or use 2FA with one of those external physical
+token authentication device. Or you can wonder about the state of
+security patching, from hardware to software (not really OpenBSD but
+very interesting).
Custom URL schemes, what did the standards say about that,
+check last week "The arch of the web" in issue 90. They're
+certainly allowed to extend the protocol but should you
+probably limit yourself to use the ones from the IANA:
+http://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml?
Those are some nice blog names "coding against chaos", "code
+without rules", "codetastrophe", this shows how we perceive our
+domain of expertise. From testing code, to forking, and ending with
+building cross platform elf. I would've put every one of those
+in a separate entry but I couldn't resist mentioning the blog
+naming. The source for the last post can be found on Google code
+https://code.google.com/archive/p/codetastrophe/source/default/source,
+I've also posted it in a gist
+https://gist.github.com/venam/34b954db3ac78ab0d9d7d67f98423277.
This week in awesome inventions we have TTY on e-paper/e-ink
+displays. The coolness can be summarized with this sentence "Running
+Nethack outside in the noon sun, powered directly by a solar panel,
+connected to a Bluetooth keyboard". Simulated paper with a simulated
+TTY on it.
I'm shamelessly plugging one of my own articles. This goes into how
+to implement a font library, similar to how Xft works, using common
+building blocks. If you're interested in how the font stack is put
+together then this is for you. The second article is about thinking
+on how to build a UI from scratch using X11, it discuses in more depth
+about the components and libraries that are needed to plug everything
+together. It's a great resource.
We all have our favorite colorscheme, our favorite way of displaying
+text (see "Choosing the right typography" in issue 74), but when
+it comes to showing it to different persons, especially during
+presentations, there should be a standard pleasant way to do it. Kudos
+to the author of this article for putting some light on this subject.
The author walks us through the edges of using Docker containers,
+some of the quirks of pulling prepackaged "official" builds, the
+security implication on keeping packages within containers up to date,
+and other things to know.
Let's bring back an old topic that keeps resurfacing in this newsletter:
+Identity, and specifically digital identity. This short thought piece
+should get you back on those thoughts, plus you can always dig in the
+archive to find all that has been shared.
+
+
+
Thoughts
+
+
+
"Are they smart? Do they get things done? Do I want to spend a lot
+ of time around them?" - Sam Altman
+
+
+
This week we have a quote related to work culture, more precisely
+partnering up aka having coworkers or hiring. I've noted that quote when
+the "How to Start a Startup" course at Standford in Fall 2014 came out
+and have kept it in my mind since then. How do we know that the team is
+holding well together. Some of the criteria are in that quote, what others
+do you want to add? This can be your conversation starter for next week.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
We see a bunch of those pop up from time to time, script or interfaces
+with shorthand to make the typing on the shell quicker or easier, do
+they really help, I'm not sure but they are interesting. Related to "Is
+there a command that is as ingrained in our muscle memory as cd" in 69
A topic that isn't unknown to any of us. I keep thinking
+about getting a dedicated harddisk that I would use and
+transport with me whenever I want to.(see Less ties with a
+machine) I'm also thinking
+of getting more hard disks and run my personal RAID but that's another
+story. In fact I'm just thinking of getting more storage devices in
+general, there's always an utility for those woudln't you agree?
Some memory interesting related documents, one about
+overcommit/overallocating configuration on Linux (Also see "In userspace
+OOM manager" in 85) and the other about generically how the libc memory
+allocation works. You can start with the last link and dig as deep as
+you want.
Setting up a mail server is a PITA. I know we've all been there, stuck
+and not knowing how to debug the SMTP TLS login. This fist article
+walks you through the initial steps, let's not talk about having users
+stored in the db instead of using Unix auth, and virtual host.
I haven't actually tried that yet but the idea is enticing. As I have
+access to a home wifi and a 3g connection I'm thinking of getting my
+hands on a cheap router to achieve that. I'll plug my laptop ethernet
+to the router and let it connect and forward the home wifi and I'll
+use my phone in tethering to share 3g as a wifi connection to the
+laptop. Imagine yourself making "vrrrm" sound as your crappy internet
+suddenly nitrogen-speed up. What do you think, worth a try or not?
The last few years security researchers have done a lot of PR, here
+are some thoughts why minor bugs shouldn't be overhyped as security
+catastrophe by taking the example of CVE-2018-15473.
It's been quite some years since I've touched popular social
+networks. In this article the author walks us through the story he
+had jumping from one to the other.
Worried about your next job interviews or looking to polish your
+"skills" then this repository will contain some gold for you. It's a
+series of questions and some typical answers to what is usually asked
+in sysadmin interviews.
Have you ever felt like you wanted to remember something but you
+couldn't and then entered a state of sorrow and grief about your
+lost and wasted memories. This short piece may change your mind on
+that topic.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Well, not really true, they're reducing what they want to focus on,
+namely what type of filesystem they will support. Read on to know
+how the author builds a mini alternative to Dropbox. In my opinion it
+would be better to sync the ~/Backup directory instead of deleting
+and copying everytime, deleting and copying is way too risky.
Learn from the past. The last link is a community where you are only
+able to download if you share with them some abandonware, I'm adding
+it in case someone is interested in those kinds of things.
As with anything related to setuid things quickly get confusing. We
+shared "Setuid... again!" in 28, "Bash is secure" in 13, and "Oh so
+confusing setuid" in 8. Review those content and continue reading
+those two links.
Window managers and desktop environments, how do they get build,
+where to start, this is what this article tries to tackle. For more
+on that topic see: "Window managers" in 64, and "Display servers and
+graphic operations" in 73.
Everyone have their ways of justifying why they like what they like and
+why they do what they do, that's what happens in the first post. It
+goes over the reasons why C is still relevant. In the second one the
+author clarifies why c++ is not c & classes.
From configuring and understanding bottleneck in the kernel related to
+networking performance, to a follow up on the anatomy of a Linux DNS
+lookup series, to a video about current issues with the network stack
+(using netmap for user-space networking).
You know when you get in an argument and you feel like spending more
+time than usual to prove your point, end up doing a research about
+pocket in pants, then realize what you've done.
Hydroelectric dam are not a new thing but this is quite surprising,
+lifting and letting concrete blocks falls. What do you think, can it
+compete with category 2 energy storage?
"This discrepancy is common in public life, where people are frequently
+impelled - whether by their own propensities or by the demands of
+others - to speak extensively about matters of which they are to some
+degree ignorant. Closely related instances arise from the widespread
+conviction that it is the responsibility of a citizen in a democracy
+to have opinions about everything". It would be nice to learn to say
+"I don't know".
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
I'm not sure if this paper is supposed to be freely available, so if
+you have university or library access to research paper better pass
+through that medium. However I can't discern any difference between
+the one I've linked and the one from the acm. This papers deals with
+approaches on teaching Unix and what can learned from it, "the purpose
+of teaching Unix" and why it's important to articulate it clearly to
+students. A very valuable paper indeed.
More on security. No this isn't an acronym for something else, this
+is the Global Offset Table. I've been trying this thing on multiple
+machines and OSs for days now but this doesn't seem reproducible
+anymore. Still a great way to learn about processes structure.
We've shared a bunch of stuffs related to the PKI in this newsletter
+before, see "Security and networking" in 77, "CAs are big and powerful
+-> bad?" in 73, "TLS 1.3" in 68, "TLS v1.3" in 56. This is a follow
+up on those, and as usual with cloudflare it's a good technical
+post. The second text file in the list is for the persons who have
+or are looking for explanations on the x509 format and extensions,
+as I've been working with those at my day job it's interesting to see
+all that unfolding and not sound like an alien language anymore.
More on RFCs. You can implement stuffs by looking at pcap only or look
+through the 3000 RFCs of DNS. As things build in complexity the number
+of people that are knowledgeable about the ins and outs are gradually
+reduced to peanuts. Somethings needs to be done about legacy and the
+way the information is passed down. "Standardizers enjoy complexity
+but do not personally bear the costs of that complexity."
Continuing with the previous post but for the networking
+infrastructure. That's a topic that keeps emerging: backward
+compatibility and inheritance over years. Legacy becomes intelligent
+in a bad way. Closely related to "The world goes round and round"
+in issue 46.
Diomidis Spinellis is the same author as the book linked in "Incorrect
+data initialization" all the way back in issue number 2. As with the
+first link in this newsletter, try getting access through your library
+or university first if you can. This is the research paper that the
+"Navigate the history of Unix tools" in 68 is based on.
Two fun cases of Unix usage, one is about running X on very small
+devices and the other is similar to what we saw last week in "Everyday
+tools" (issue 87) about parsing humongous files.
Taking the Chinese room thought experiment a bit further and in a more
+complicated way. I'm not so convinced of the follow up on the thoughts
+but the author does a good job at defending it at least.
Everything in life has an expiry date, especially for electronics. Some
+companies even plan ahead this expiry date and indirectly forces you to
+buy new. But also, most of the things can be repaired, the question is
+if it's worth the effort to repair it.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Articles about using OpenBSD on a daily basis, installing it, or saving
+old hardware with it, and all the fun that can derive from that. The
+last one is all BSD.
A list of cool hardware from a NetBSD conference, plus the famous
+toaster as a bonus, and a reminder that NetBSD does care too about
+security too (certainly not as much as OpenBSD though), check its
+veriexec (see https://lwn.net/Articles/532778/ too, a bit different
+as it's using signature instead of hash check).
We've tackled resource usage and performance monitoring a lot in
+this newsletter but most of the tools we've put forward are very
+specific. One that comes to mind is "Memory and optimizations" in issue
+number 39 and "Desktop Management Interface (DMI)" in 18. Let's bring
+the tone down a bit and try something easier, while not necessarily 100%
+accurate, for once.
The answer is in the first minutes of the presentation, don't
+worry. The presentation is also a good review of shells in general,
+great presenter too. The last link is a reference guide to bash and
+shell tricks.
Bash for the web, ready for some real Unix pipelines, this is what
+you're going to get. Parsing sitemaps using a single line and making
+SQL query faster by replacing them with Unix pipelines, sort of like
+that old Awk post "Special tejr" in issue 23.
A revisit of the never getting old "where does vim
+originate" and "oh I've discovered what vi is". We
+sort of discussed that in the tools, glue, scripts, and
+automation podcast and
+there was a lot of insightful comments on that thread too.
Two good reference when looking for what the lower
+level system calls are made. That first one also adds a
+bit of very welcomed explanation. You can also refer to the
+podcast
+about that topic, I tried to present it the best I could.
In continuation with the previous links, if you remember from "Security
+and networking" in issue 77 Firefox is starting a new project to do
+DNS over HTTPs (DoH) and Trusted Recursive Resolver, that first article
+goes into depth why the author thinks it's a bad idea. The second one is
+also on the topic of anonymity (Maybe also digital identity). The last
+link is related to a remake of the web, see "You might have heard of
+gopher, what about Xanadu" in 76, and probably also related to all those
+"state of the web" links that were shared in the past. In my opinion,
+the web is already a web outside the browser.. And that also reminds
+me of are.na in "Connecting Ideas" of issue 15, a wonderful website.
In continuation with the previous link, this one goes into letting go
+of the past when it comes to theming... Or not really. This article
+also discusses Gtk, theming, and if it's right to leave the default
+core style instead of overriding it. Do we stop customizing the Gnome
+shell, and stop customizing Gtk themes, does the project go in a
+similar direction as Mozilla did with Firefox. Seems like a week with
+pondering over the direction of the project, good that this is being
+initiated. We end in a corporate note with how it's important (maybe)
+to pierce the desktop market.
Remember the weird music genra in "New genres outside of pop" of
+issue 78, let's dig into other subcultures, this one is in between
+comic-con fantasy and the burning man culture, but I'll leave that for
+you to judge. It's very entertaining to watch, for sure, especially
+the mechanical parts.
Don't know why they call it Jurassic Park if most of the dinosaurs
+are from the Cretaceous. Since last week I've been on a dinosaur hunt,
+back to my childhood encyclopedia, which I'm sure a lot of other kids
+have been into.
What do haptic belts and language have in common... Remember the
+extended mind we keep bringing up (I won't link it again, you can
+search the archive). This is another side of it, embrace the amazing
+flexibility of learning to defer tasks to our tools and become experts
+with them.
Making the environment cleaner to live in, pure and pristine, should
+be on everyone's mind. Sad to think that for the ones who can make a
+difference this is all a business and when this business isn't viable
+anymore there's no reason to continue. There certainly are incentives
+and money is one, there should be a way to make this lucrative
+too. We can blame whichever body/systems/government we want instead
+of taking responsibilities but this doesn't change that we need to
+do something. Start with using less packaging and more reusable high
+quality containers, buy local it'll need less transportation.
Yes, another "state of the web, state of the mind" piece, a good
+summary. Tools are made to be used; when a knife is used to kill
+someone, or let's say it better "when someone uses a knife to kill
+someone", is it the knife that's at fault or the person? Should we have
+regulations that made knives harmless because of that? Can you enter
+anywhere with a knife on you? Wouldn't you be looked at funny if you
+were walking around with hundreds of knives in your pocket selling them
+to anyone passing by? What about building extremely dangerous knives
+with advertisements on how lethal they can be? This is an analogy, a bad
+one but a relatable one. "When you invent the ship, you also invent the
+shipwreck.." Have fun remembering the awkward and uninformed questioning
+of Zuckerberg, the over-used-by-career-politician-to-gain-votes
+"What about the CHILDREN" arguments, and the unexpected surprise by
+the general audience over their unawareness over the choice of their
+digital tools usage "because they're free". Let's quote from the article
+"These are the broad outlines of the tech backlash. But against what,
+exactly, is the backlash? Is it against the ascendency of technology
+as the driving principle of modern society?"
+
+
+
Thoughts
+
+
+
"One theory says that man is a neoteny and is no longer able to
+ evolve. If this is true, then what an absurd creature mankind has evolved
+ into." - Eiri Masami
+
+
+
On a side note, we've broken the 240+ readers mark, congratulations
+everyone! I can't help but be happy at the thought that everyone
+deliberately chose to receive this newsletter, and that it only spread
+through word of mouth.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Terminals are such weird beasts from the past, so many compatibility
+features, so many fallbacks, etc.. It never gets tiresome to read
+about new things you didn't know about in them.
32K cores supercomputer, that's a lot of cores and maybe some
+datastructures within the OS aren't flexible enough to handle that,
+maybe it would be cool to replace some with a DB, a sort of CRUD plus
+here associative array algebra. The paper is small (8 pages), a good
+quick read.
It's a bad idea to pipe untrusted commands directly on your machines
+to be executed. Those posts discuss this a bit, the first one is an
+ingenious way to detect that something is executed on the other end.
While starting on a hyper biased note, this article still poses a
+good question, and old one, which is again already answered from the
+GPL perspective in the comments. This is close to "math-washing" in
+"..State of the mind" of 75.
An article in which the author redefines the term advertising
+as anything he sees too much of on a daily basis. I'm not sure
+what rock he's been under but even billboards and TV commercial
+meticulously study their target audience. When in doubt rely on
+"FAKE NEWSSSSS" from issue 81. If you want an internet black
+hole for "shitty" content I've written a script for that here:
+https://gist.github.com/venam/97a06e563161693d109b9d31152bab0b. NB:
+this newsletter itself is a "curated" feed, let me know what you think
+of that. You should also read up the comments on the blog and lobste.rs
+as they are insightful.
So much of the content about consciousness, unconsciousness, awareness,
+mind, and brain have confusing and conflicting definitions (if any at
+all) which only brings up mysticism and fictions on the topic. In those
+articles we tackle those, the first two deal with the old mostly thrown
+away but still over-used in media concept of psychoanalysis, but also
+proposes a flat mind which is not something especially new but certainly
+a bit reductionist and contrary to the usual discussion. The last one
+is a reply to the first two, again with a clash of definitions, which
+in my opinion he doesn't use the same one so is attacking something
+entirely different... It might contribute to the mysticism or might not,
+I'll leave it for you to judge and take whatever value from them or get
+even more confused with this word jumble/war. Related to "The brain"
+in 78, "The Grand Analogy" in 66.
From culture habits to language, how is intermixing them opening our
+eyes to new concepts.
+
+
+
Thoughts
+
+
+
A truly open mind means forcing our imaginations to conform to the
+ evidence of reality, and not vice versa, whether or not we like the
+ implications. - Lawrence Krauss
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
As much as we like minimalist terminals it's still nice to get some
+useful features, maybe you'll like them and it'll make you switch
+to Xterm or maybe it'll make you look for similar functions in your
+current terminal emulator.
A timely series (not really, it's old) of tips about setting up your
+clocks properly. I'll soon try out that trick with the adjtime and
+the RTC drift.
Like it or not sourceforge is an oldie that made the path for other
+similar websites. This post is about a rebrand regarding the recent
+events that affected the website trustworthiness.
That first post is very heavy to read, the style the author has
+chosen is a bit foggy. The content is still fine, it's the way it's
+communicated that's the issue. Let me know if I wasn't the only one
+feeling that. The second one is still about git, a direct continuation
+of "Git and emails" in 82. The last two are about GPG, its usages, and
+trying to write alternatives. The last two posts are about GPG sort of
+mixes the implementation with the protocol by saying that the protocol
+has a "bad user experience and interface". The protocol doesn't say
+anything about how to implement the user interface, it's a specification
+document. Apart from that small note, it's a very cool post.
Two posts about setting up FreeBSD on ARM64 in the cloud and NixOS
+respectively. Not personally my cup of tea but for anyone that loves
+this kind of posts this is gold.
This is a superb resource on learning about the heap/malloc. It's well
+explained though a bit hard to follow in some places. I've solved the
+two challenges in the second and third links (it was fun, PM me if
+you want them) however the second one about 1 byte overflow doesn't
+seem to work on newer glibc (seems to work on 2.23 but not on 2.27).
An interesting take at managing process over memory usage instead of
+letting the kernel handle it when it's in a dire situation. For the
+worried, this one is under GPL(kernel requirements probably) so don't
+worry. Related to issue 25 "malloc never fails on Linux... or does it?".
We had that discussion earlier in "But didn't you write an embedded
+os" of issue 75. It's pretty hard to set up an interview process that
+correctly assess the potential of a would-be-future-employee, it's
+easy to do an interview process for someone who you'll hire only to
+work on a task and then move on, but asking random unrelated questions
+seems like a waste of time to both parties.
Let's continue from "The brain" in 78, "Attention span" in 77, "Are
+we our tools" in 68, and "The extended mind" in 64, and more. This
+time it's about an old paper (1960) that we're sort of in the process
+of reaching. The process of cooperation and participation in thinking
+mentioned in the paper is still lacking a bit but still in the making,
+see section 5.1 5.4 and you'll know what I mean. You can check the
+next link for an example of the drawbacks.
Long paper that you can skim through. That website also has a
+series of papers all about the topic of Digital Intelligence and
+disinformation. When in doubt refer to the infographic of "FAKE
+NEWSSSSS" in 81.
A sad thing we all fear. We don't want to be the person of that
+last post.
+
+
+
Thoughts
+
+
+
There are known knowns. There are things we know that we know. There
+ are known unknowns. That is to say, there are things that we know we
+ don't know. But there are also unknown unknown. There are things we
+ don't know we don't know. - Donald Rumsfeld
+
+
+
A seemingly humble quote that should certainly be put in its
+context. Rumsfeld was a politician and this was something he said
+following 9/11 regarding "weapons of mass destruction" and the lack of
+evidence for them. There are multiple aspects to this, on one level it
+reminds us of our relation with our knowledge, on another it gives you
+a moment to stop and think before assuming or over-rationalizing, and
+finally it shows that cheesy quotes are often posted on social media
+without checking their background story (yet another week with cheesy
+quotes, I know!).
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
For those who don't have access to a research database you can PM me
+for a link or simply search for it online (your responsibility). This
+is a paper about making pipes faster by using the power of multiple
+processors and mixing this with an intricate use of the VFS. This
+puts in question what was discussed in the previous link or actually
+confirms it. Maybe related to "Parallelism in any Bourne shell" in 17.
A change that was also done on Arch a few years back (~2013), here
+we see the adaptive decisions that some distributions have to make to
+support specific programs that rely on this and also to make them more
+compatible with other systems. This is related to the discussion on
+file system hierarchy, https://nixers.net/showthread.php?tid=2006. The
+last link is extra content about the argument for binary logs.
I don't usually like to link to Wikipedia but this one is unexpectedly
+explained really well. If you've been confused about this whole ioctl
+then take a look.
A mini example on how to pack together some values to get machine
+independent format. Probably related to "On a roll with C" in 61 and
+"Packing bytes natively what does that mean" in 59.
Those hackatons are great, they seem to push forward a lot of good
+engineering. PkgsrcCon and OpenBSD hackaton. One of our old member
+gave a talk there, hello yrmt! There's probably too much content to
+consume in a week, I only could check a few of those. Similarly to
+"Hackathon and secure chats" in 76, I'm still a huge proponent of
+those types of posts.
Just ideas by bloggers, one about how there's a need for a small
+but usable Unix-like system. This is related to sortix in "POSIX"
+of issue 65 and fuzix in "Very small Unix" of issue 15. Another about
+the state of the touchpad on Linux, also related to "The mouse is so
+fast on your machine" in 75.
Remember the whois thing in "State of the web..." of issue 75, well
+now it's bringing that stuff back at pgp servers. gpg --search-keys
+'nothisrealaddress@someoneelses_emailaddress.notreal'
No, just the right amount. This articles goes into the kind of
+thinking you should go through before deciding what to add as an
+option/configuration to your program.
Because this is the trendy new thing in town, an unusual contraption
+called a shower. I stole that from HN and thought it was a nice article,
+similar to "Remote Control" in 82, "A history of the picnic table"
+in 77 and "A story on privacy" in 65. This is interesting to go back
+and time and trace the history of today's common ideas and things.
It's been a while since I've shared something with the "state of the
+internet", so here's one about quitting but not quitting entirely. The
+writer goes through a weird complex and filtering process (sort of
+related to the obsessive over-rationalization of "Goddess Spreadsheet"
+in 28). It's like the middle-ground between smoking 10 packs a day
+and saying 5 cigs a day won't kill you - The underlying reason why
+you smoke hasn't changed in both cases, you haven't tackled the issue.
Spend time with your friends this week. This is what I'm going to do
+and I hope this is going to be super fun for everyone! "In general
+you want friends with whom you can have a meaningful conversation. You
+can call them on a bad day and they will care. Your group of friends
+are better than any drug or anti-aging supplement, and will do more
+for you than just about anything."
All cyberpunk unite! This post goes into a simple technique to create
+glitchy videos, a new but old trend on youtube. It's nice that this
+is coming back to life. This seems to be the thing these days: Remake
+whatever is old cool again. There's certainly a marketing idea behind
+that to target people based on nostalgia but still, I ain't got anything
+against that as long as we're deliberately choosing to revive memories.
+
+
+
Thoughts
+
+
+
How we spend our days is how we spend our lives - Annie Dillard
+
+
You are the average of the five people you spend the most time with - Jim Rohn
+
+
We become and attract what we think about most of the time - Jerry Bruckner
+
+
+
Three quotes that are pretty much encompasses the same idea, to do things
+deliberately because this is what this is, not a future concept of what
+could be. Hope this can enlighten your week, cheers!
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
The classic question about hiring and actual work. Plumbers and
+duct-tapers vs craftmanships. Is it about ego in the end, who doesn't
+want to be hired as a creator?
So... I've been pronouncing ed the wrong way all my life, does it
+change anything, I don't think so. Enjoy a mini-talk by Kernighan
+about the history of grep.
Render a browser in the terminal, kind of like libcaca is
+for video. There's also a browser front-end for a browser
+https://html.brow.sh/https://nixers.net which turns everything
+upside down. Related to "Fun in the console" in 61.
I never really got into iptables so those info are pretty new to me. If
+you feel the same way this should help, even though the presentation
+is a bit heavy to listen to, not in the technical sense but in a boring
+sense, it's still worth a listen.
A review of what was seen in "sbrk and malloc" in 53 plus much more
+interesting related topics on memory management like heap exploitable
+and virtual mem tricks (this one is close to the handle in "Pointers"
+of issue 81). The last link is for comparison.
So the discussion about init system starts again. This time we'll take
+it even more seriously and technically. The first series of docs go
+into the nitty-gritty details of writing a PID1, you can start with
+the second link. The last link is somewhat like supervisord but split
+in many sub-programs.
It seems we're talking too much about systemd but there's a reason
+for that: It keeps adding more features to itself. You can choose to
+ignore it or to read and learn about what's up with it and if you
+can get ideas (to do or not) for your own projects and research on
+init/system&service-manager/super-server-daemon.
Pointers frighten many persons and many novice or advance programmers
+take it as a point of pride to shame newcomers by creating
+impenetrable code. I'll quote something from the newcomers podcast:
+"Those condescending persons might sound elitist but it’s a sort
+of wall of entry which may appear intriguing to new ones. They might
+want to get behind the wall with the others, it’s tempting to become
+yourself a condescending guy/gal. It could be in itself a drive to
+learn but it’s wrong to add fuel to the fire."
Let's resume with the "Organic art" from last week (issue 82). In this
+one we explore the tricky aspect of who's building all those arts we
+saw and how their perspective maybe affect their pieces.
Creativity with design, ditching templates and heavy pages, dance
+with the counter-culture of lightweight minimalist functional
+websites. There's an excellent discussion in the lobste.rs link.
I agree that there's a video game addiction growing with young boys
+but I don't agree with the conflation that this is an "internet
+addiction". Video games are something, the internet in its entirety
+something else.
Test driven development is super popular, RFCs are there too, we got ton
+of specifications that we have to adhere with, some people are crazy
+about formal verification, etc.. I guess the software tech field is
+more solid then he'd like to think. What's your opinion on this topic?
+
+
+
Thoughts
+
+
+
You may delay, but time will not. - Benjamin Franklin (can't find the source?)
This article takes it from the side of productivity (see "Over-Productive"
+in 78, "Production" in 66, and "The busy trap" in 32) however this is not
+really accurate as many of the most prominent inventors didn't have the
+mindset we today portray as overly obsessed with managing their time and
+work. The other side of it is that it's a reflection on paying attention
+to what matters to you, an appreciation of life.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
An example of non-portability on Unix, but that is available on most
+BSDs (see links 3 to 6). Remember that NetBSD, for example, has had
+a procfs for a long time but if you inspect the code of ps(1) they
+switched to the sysctl/kvm interface starting from 1.38 (18 years ago)
+and deprecated the procfs in 1.47 (links 7 to 9).
A blogger we already know from an articles in 29 "Rules are made to be
+broken". In continuation with last week fun with git, this week we're
+doing git from emails. These days most use interfaces to handle all
+this but it's good to do it from the command line too.
Another blogger we know from "Debugging issues on unknown boxes"
+in 69, this one is about using the core dump pattern feature
+of the Linux kernel and how it can have weird behavior when
+the pattern waits. Another user has commented that maybe using
+/proc/sys/kernel/core_pipe_limit as a safety could mitigate the many
+concurrent crashing processes piped to user-space.
An easy to read study that delves into answering questions like what
+kind of patches land in filesystems, what kind of bugs or other things
+do they fix, are they reduced over time, where exactly in the code
+those bugs appear the most, etc..
Terminals are intricate, you learn about them and are surprised by the
+mess of backward compatibility that lies underneath it. In continuity
+with "Signals for IPC? NO!" in 81, "Writing a terminal emulator" in 64,
+"Console codes" in 63, "Doing it in V7" in 58, "Following through with
+the low level hacks" in 52, "More terminal love" in 49, "What's that
+key for, why is that key used here?" in 37, "RS-232 and others" in 29,
+"A zoom into control characters and terminals" in 13, "Understanding
+the modifier keys in the terminal" in 1. So much content!
Just when you thought regex were a bit complex, check what shapers
+syntax is like for an Indic language used in India and Nepal amongst
+others like Persian and even Unicode "art", and what is required to
+parse them properly.
Another continuity with past links, this one goes into "Programming
+language theory", check issue 80. We dive into Fat binaries and what
+is being worked on to avoid them in the future for Apple devices,
+it's very messy.
An interview with the super funny and knowledgeable author of "Erotic
+systemd" we had in 40 and others such as content related to PAM we
+shared before. "Good software let you sleep", a lesson to take from
+the above links. Though we're definitely not doing any advertisement
+for his books, I haven't read any of them yet so..
Remote control started as anti-ads then brought up the habit of channel
+surfing and slouching in the couch. Nowadays we're slowly seeing the
+rise of voice interfaces which are more integrated and less hindering
+to our dynamic lives, and the same goes for smart watches and phones
+that can remotely control all the IoT connected devices. It seems
+we've moved away and are somewhat repulsed by "laziness", we're on
+an ever growing trend of efficacy and production mania. However,
+a sentence of the first article caught my attention, it reflects a
+feeling about the emergent tech and most early adopters, a sort of
+signaling: "Remotes suggested that their owner was himself high-tech
+and in demand, so busy and important he could not possibly cross the
+room to change the CD himself."
I've always liked this quote, I have no clue if it's true but from
+anecdotal evidence I can assert it. Aren't the advices about being "more
+confident" pullulating the online self-help trend trying to say indirectly
+that we have to take ourselves and things in general less seriously. Yep,
+cheesy social media quote that actually has more in it than it looks.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
It's cool to have some Unix tools available on Windows but the issue
+the author ran into shows how the different ways of thinking about
+system development can affect simple script execution.
Remember that podcast about
+signals when we talked
+about BSD adding SIGUSR1 and SIGUSR2 for user defined signals (maybe
+we've also mentioned that when discussing terminals)? Well here's an
+example of how some programs choose to implement their handling for
+progress report.
Undefined behavior in C and C++ and type punning, aka some sort of
+casting by memcpy into other types, more on how to create a handle
+system to not mess up with pointers, and even more about a book about
+pointers.
Something called "restart sequences" just landed in the Linux kernel,
+remember Drepper's paper in issue 58, well this tackles the issue of
+process scheduling and CPU affinity in multiprocessor environment by
+restarting the sequence of important code. The limit is that it can
+only be a single operation.
Right in the middle of the TTY week and we have to talk about the
+temptation of sumptuous graphical interfaces. Here we see updates on
+the work for KDE on FreeBSD and on the GTK team.
It's important to have a good history, maybe leaving some useless
+commits once in a while doesn't kill but overall you want to be able
+to narrow down what happened at what time and who did it for which
+reason. The other one is about git from the point of view of someone
+that comes from svn.
Torture your binaries to make them reproducible, make a soup in
+two widely different environments you've created. All of that sweat
+polishes them. That Oxy is a new tool the author uses as a replacement
+to SSH, as with anything new it comes with lots of critics and lots of
+cheers. Check out the protocol it's an interesting and simple one using
+asymmetric keys and ephemeral ones to derive a shared symmetric secret.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
We've shared a lot of content already about systemd like "systemd gui"
+in 54, and many more like "Yet another systemd article" in 37. Take
+those ones as a complements to the others.
A continuation of the vermaden blog posts (which there are more at
+the moment but I won't link) plus another update of KDE and stuffs
+related to UX. The browser integration inside the desktop is an
+intriguing concept. Someone commented on the vermaden posts that
+they are too basic and not containing useful information however I
+disagree on that. I think it's a space that needs to be filled and
+whenever someone tries to write content for beginners explaining
+every component of a functioning desktop environment they are met
+with similar feedbacks. Two other projects that come to mind but
+that are still lacking are https://github.com/feroldi/ricing and
+https://github.com/nixers-projects/ricerous.
Reverse engineering software and a new lovely blogger to follow (it's
+the same person as the cool "Bootstraping issues" entry in 23, so not
+really new).
No need for that Virtual Data Optimizer layer of "VDO, A new layer to
+add to the data storage stack" in 71, you can get simple deduplication
+on the command line. It's harder to manage but it's simpler to
+setup. Give it a try.
I've tried myself at explaining the booting process on Unix before, as
+clumsily as I could. Here the author does it in a much more compacted
+and clean way with a focus on points of failures.
I started to dabble a bit with bison the past few weeks, checking
+what's the big deal. I wish I had this document before diving into
+the documentation.
I don't usually share world news however in this one there's a lot
+to say on many levels and I think I'll leave it to you to have fun
+discussing it with your peers, there's a lot to discuss.
Maybe related to those concurrency articles in "Concurrency" in
+
+
73. This time we're exploring Java and nodejs.
+
+
+
Thoughts
+
+
+
"Every choice we make allows us to manipulate the future. Do I ask
+ Adrienne or Suzanne to the spring dance? Do I take my holiday on Corsica
+ or Risa? A person's life, their future, hinges on each of a thousand
+ choices. Living is making choices! Now you ask me to believe that if
+ I make a choice other than the one that appears in your history books,
+ then your past will be irrevocably altered. Well, you know, Professor,
+ perhaps I don't give a damn about your past, because your past is my
+ future. And as far as I'm concerned, it hasn't been written yet!" -
+ Captain Picard about time travel
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Dbus is hated so much as a message passing system, is that hate anchored
+in something? Let's learn the basics of dbus to clear things up and
+make our minds. There's also a repost of "And its ilk" in 42.
We discussed zfs and RAID separately more than once in this
+newsletter. This specific article is about optimising or for speed/IOPS
+or for space the raid layout of zfs.
A presentation on the new and fascinating OpenBSD's solution on
+keeping their base system up to date and secure, syspatch. Other
+articles about hardnenedBSD trying to become a not-for-profit org,
+plus others about recent presentations on cool topics like pledge,
+minimet (software defined networking), etc..
As I've mentioned before, in "One liners" issue 20, I'm not a fan
+of one liners, but this time it's different, they come with their
+explanation. Kinda related to "Explain your pipeline" in 16.
Hands up for criticism! A series of ideas related to fairy tales and
+the slumber of women in them. I know a lot of persons regards those
+ideas with disdain but it never hurts to at least see what's up and
+if some of it makes sense to you.
Remember in issue 70 "Beauty is found in the detail2" how we've spent
+so much time learning the details of the bottom down process of how
+colors are transferred from a screen to our retina? Well this is the
+continuation.
+
+
+
Thoughts
+
+
+
Everything is a conspiracy when it doesn't suit us. When it does it's
+ just the state of the world. We live in bubbles, when is the right time
+ to question the state of affair and when is it not?
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
A visit into the similarities between the currently popular operating
+systems which then turns into a critic of Unix designs, and then into
+new ideas for operating systems.
C is fun, it's not the best language for everything, but it's definitely
+entertaining and satisfying to use when appropriate. Check out those
+fierce arguments thrown around when discussing the validity of usage
+or its qualifications or the current state. The last articles are
+related to "A summary" in 64.
Another article about installing a Unix-like system in weird places
+this times it's Unix V6 on MXE11, Related to "Reducing/Shrinking the
+Linux kernel" in 66, also somehow related to "Doing it in V7" in 58.
This article discusses privilege escalation but in my opinion and the
+opinion of others those aren't flaws at all in sudo but normal usages
+where you can spawn shells. From the perspective of a deeply engrained
+infosec person maybe this is new, who knows.
We don't need managers anymore, we entered and era where we consider
+ourselves production machines that constantly need to output more,
+achievement is not a question it's a must. Those are arguable topics,
+take them with a grain of salt, food for thought.
When you let the readers interact or see illustrations of what you are
+describing it helps tremendously to understand. This is also related to
+"Awesome GAMES for kids!" in 23.
The brain itself is a chaotic system. Here I present an MIT open course
+lectures about the brain, and two articles mentioning a study done in
+2015 and another done in 2018 about the effect of reading to children.
A lot of the pop/radio music these days all sound the same, remember
+"Connecting Ideas" the millenial whoop and others, well it's not
+really true there's a lot of ingenuity and creativeness, new genres,
+etc.. Check the three I've linked, you don't have to like them but
+just to appreciate the innovation as they are deeply connected to our
+generation, somewhat related to "Doom - behind the music" in 39. The
+last three are just for fun as youtube started recommending some weird
+videos similar.
This week let's check out this guy who's passionate about puppets. The
+craft and details that goes into making those is impressive.
+
+
+
Thoughts
+
+
+
"From this moment forward all my writings are fish hooks: perhaps I
+ know how to fish as well as anyone - If nothing was caught, I am not to
+ blame. There were no fish." - Nietzsche
+
+
+
An idea similar to the thoughts in issue 74: Push your ideas out there in
+the wild, without spoon feeding people, without following the clickbait
+trend, all you have to do is prepare the content in the most appropriately
+consumable way for anyone that ever encounters it.
+
+
+
+
PS: I've beaten last week record by making this newsletter longer
+than the last one. If you really enjoy it be sure to share it with your
+friends that might be interested.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Making a good, secure, fast (or slow), hashing function is not easy,
+everyone is going to try to find flaws in it, break it. Side channel
+attacks aren't obvious. Be sure to check the comments on the second
+article, some of the original creator of well known hashes added
+their insights.
Regardless of the quality of the article itself, this should start up
+a discussion: We need more people writing technical, understandable,
+articles about their crafts.
Maintaining and building desktop environments from big ones to small
+ones requires the work of many. The last link isn't really a desktop
+environment (though Durden is a DE implementation using Arcan) but a
+mega graphic and input, and whatever multimedia building block library,
+we've shared it before in "Awk for multimedia" in 44.
We've had three podcasts related to this topic (Unix
+Executables, Processes
+On Unix, and Default
+Programs) but never
+touched what the author of this article is talking about, binfmt misc:
+Setting default programs internally in the Linux kernel via the procfs
+interface.
The first article is a rough simplification/introduction to TLS
+handshakes, somehow related to "TLS 1.3" in 68. The second is an audit
+of the NetBSD network stack. I admire the patience taken to do those
+security audi, perusing the code for days looking for typos, overflows,
+mistakes, ways to abuse it.
In continuation with "I haven't covered cmake" in 65, let's add autoconf
+to the tool set. The last article is somewhat unrelated, it's a C
+programming tip so that gcc gives a warning when using generic pointers.
When you run into a problem, curse at the world for not implementing
+a solution, think of a possible solution, and then finally find what
+you were looking for in the beginning. All the great phases of our
+everyday life that makes us humble.
Remember the podcast about data storage well I've been revisiting it
+on my personal blog and adding illustrations. One of the confusing
+part of the explanation was related to role of the device mapper
+and the various modules that implement it. Those posts, though old
+(distros now support full disk encryption), should clarify that.
Remember our adventure with netlink in issue 59 "Procfs, capabilities,
+and netlinks", well, we continue on, this is one of the reason according
+to the author why the deprecation of netstat and ifconfig were made. But
+here's the question: Will we replace all the tools that use procfs
+and replace them by netlink/binary-blobs/IPC&RPC-whatever everytime
+we think it might affect their performance.
We're social animals, comparing one another is the drive that leads to
+progress. However in today's world interactions are leading to some harm
+when it comes to self-love. Somehow related to "..State of the mind"
+in 75. The following video is my response to the one thing I thought
+was enraging in the first article: It's nice to focus on bringing
+back self-worth however the article sounded like it was written for
+the management team of a business. Making people less judgemental of
+themselves shouldn't be about increasing their productive outputs,
+it should be about making them feel better and the rest is out of scope.
While those opinion pieces are by nature about an American centered
+issue, this topic still brings light to something I had never thought
+about when it comes to social movements. It is related to "Public
+transportation" 76, "The WWW is awesome, (continue)" in 71, and "Game
+theory" in 34 (also to http://ncase.me/polygons/ by the same author).
There are things we overlook so much and beauty is found in their
+details, in the same spirit as "A story on privacy" in 65. And maybe
+also related to urban planning.
A quick easy to read, and open, research paper about the effect of
+delegating mental power to individuals around us or our tools. This is a
+must read after "Are we our tools" in 68, and "The extended mind" in 64.
A lot of excellent content about retro gaming, special techniques used,
+smart puns, and much more.
+
+
+
Thoughts
+
+
+
You never fully realize how inept mainstream media is until they cover
+ a topic you know a lot of. - /r/showerthoughts
+
+
+
This was the longest newsletter I've compiled since the start of this
+project. I hope you're enjoying it as much as I am enjoying reading all
+those articles every week. Let me know if you find anything interesting to
+share with our close circle of readers. If you're intested in contributing
+in whatever form or way, there's always a list of ideas at the bottom
+of this newsletter on how you can do so.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
From using valgrind to check why your program failed to getting a core
+dump and analysing it with gdb, this article does a quick overview of
+those important topics.
Pondering about what's so great or not so great about other OS, maybe
+even doing that before the first hand testing, then those articles
+are for you.
A follow up on #73 "Recursive make", here we get the not only recursive
+Make but "all Make are evil". Their solution is arguably more confusing
+than Makefiles, smells too much of Haskell fanaticism, and maybe is
+only suited for a paper and not practical usage outside the Haskell
+community. Interesting nevertheless!
The past few weeks I've been teaching programming to a friend and he
+keeps asking questions that never end, going deeper and deeper, starting
+from a simple question about a for loop and ending up discussing cpu
+architectures. This is the kind of articles I'll link him to.
It's nice to read the progress of open source team projects in blog
+posts like those. It is especially the case for fresh ones as it
+attracts eyeballs and incites contributors. It's also amazing to see
+everyone in the team writing their own experience of the hackfest,
+I never participated in anything resembling this but it makes me
+want to. If anyone knows of a hackathon or conference that would be
+interesting hit me up, I might join. Moreover, I'll try to write more
+about my own projects, and you should too.
A deep research in the field of HCI about pie menu, their does and
+don't, and a wonderful blog post about writing a gameboy emulator and
+learning new things along the way.
Quite an interesting concept I hadn't encountered before. Give it a
+go, there's a demo page. It's sort of similar to Wikipedia's interface
+when you think of it.
+
+
+
Thoughts
+
+
+
Much unhappiness has come into the world because of bewilderment and
+ things left unsaid. - Dostoyevsky
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Lots of great ideas in those 3 posts. Here's a quote from the first one:
+"A variable in bash is like a hand grenade – take off its quotes,
+and it starts ticking." Related to "Emacs as PID 1" in 48 and "Bash
+the bash for bash the bash" in 23.
Pointer acceleration can mean almost nothing to a lot of users but
+it's the smallest differences that make the big ones. A four part
+series going in the depth of it.
Before today I had never heard of the SnapStore (I've only used the
+official repo). Apparently there's no restrictions on who and what
+can be uploaded there, so it's not very surprising.
"That means you could now, for example, run Microsoft’s Linux version
+of Visual Studio Code right on your Chrome OS machine." The world is
+mixing up a lot of stuffs, better build boxes to containerize them.
In issue 60 "Lots of C, or more precisely compiler, preprocessor,
+and linker features" we mentioned POGO, which is a nifty and rarely
+used compiler opimization trick. So here are more of those.
Some programming jobs are like contractual job, or more like a
+temporary service offering. This type of work brings a management team
+that assumes possible workers will have a certain skillset to join in
+instantly and start fixing whatever they have or want to have. Other
+jobs are more long term, employee types of job where you're required
+to grow along the way and learn from senior to become an essential
+part of a team. Now what do we get when the requirements of one mixes
+with the other because of confusion emerging from the HR team.
Some thoughts about web technology, new laws affecting it (less than
+one week left for GDPR to take effect), the ad-revenue business model,
+and web content.
This newsletter is sent in multipart, both plain text and html. On a
+side note, this has been blown out of proportion and it seems to be
+out of a love for fame and creating cringy logo and websites.
+
+
+
Thoughts
+
+
+
"Yep, that's the point of public key cryptography, never share your
+ privates in public" - A user on reddit
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
I recently faced some compilation errors on certain machine only
+when the order of the source file was in a specific way. After some
+research this is what I found as the cause, libraries that aren't
+needed aren't included.
Distributions and open source projects all have their internal political
+disputes, which seem to multiply in the past few years with the trend of
+drama and turning everything into controversial topics. The one of Void
+is that the project leader disappeared... Remember, two-man-rule. The
+one of glibc is that they want to remove jokes.
When working with a language that allows memory manipulation the
+programmer usually has to keep the memory management in mind so to
+not mess up with leaks. That's when frameworks like valgrind comes
+into play to help. However you need at least to understand what the
+terms that valgrind shows mean. This article should clear things up
+on much more than that.
"What a horrible hack" I've heard someone say... This is the state
+of clipboard, "Dear old vain teaches us yet again" in 34 and "X11
+Clipboard" in 9, maybe even "Term emulators" with the "bracketed paste"
+in last week 73, also come to mind.
In continuation with last week's "Display servers and graphic
+operations" in 73 and "More on Xorg magic almost-no-documentation" in
+69, to not read before you've gone through the previous content. Now
+that you've assimilated the basics, let's read this article and learn
+about a certain way of implementing a compositor.
When life gives you lemon, you make lemonade. When no one wants
+lemonade your job becomes to remind them that you may have lemons in
+stock or maybe not. "You’re making an active negative contribution
+to people's day".
I'm not a fan of adblockers, not because I like ads but because of
+the whole drama and politics that happens behind them. I'd rather use
+a full only allow whitelisted cross requests addons.
The first article is aimed at graphic designers but can be read by
+anyone that is interesting in fonts. The second delves into another
+topic, replacing words by specific characters in source code. The
+third link is about even more obscure characters.
+
+
+
Thoughts
+
+
+
Sand mandalas are incredibly intricate works of art that take many
+ people many days to construct. They’re very expressive, but fragile,
+ works of art.
+
+
After a mandala has been constructed – and displayed – it is
+ ceremoniously deconstructed – which is meant "to symbolize the Buddhist
+ doctrinal belief in the transitory nature of material life."
+
+
_why’s entire online presence and code was presented in the sand mandala
+ that was '_why'. The person behind '_why' simply decided to move
+ on and close that portion of his life.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
There aren't a lot of good approachable articles explaining how to
+develop in the X windowing system. I'm currently planning on writing
+more on this topic myself and if you're able to then join in and
+also write. Other articles that were mentioned in the newsletter:
+"Explaining X11" in 3, "Dark is the history of X11" in 36, and the
+X11 section in "Low level graphics" in issue 42. However, even those
+can be quite confusing with terms like pixmap, rendering, redirecting,
+unredirecting, reparenting, composition, etc.. And so that's the reason
+I'm going to be writing the articles.
A paper about how the original UNIX file system was optimized for
+throughput. Increase of block size, allowing block fragmentation,
+allocating on the same cylinder, long file names, symbolic links,
+and more.
Compilers optimize according to how the CPU may react to how the code
+is spread out, but the CPU also does it too, eliminating useless
+instructions. In this article there's some discussion about that,
+somehow related to "About memory" in 58 and "A summary" in 64.
Relates to the earlier "Recursive Make" in 71, the paper, which is
+smooth to read, goes into the crevasses of why this isn't such a good
+idea and how to remediate.
A big overview of the features, support, usability, and speed of
+different terminal emulators. It was the first time I hear about some
+of those features.
Are CAs too powerful, are they allowed to revoke certificates that they
+deem are dangerous to the security of the PKI, should CA pass moral
+or legal judgement, should the CA act when they have the opportunity,
+are EV certs really worth it as human control or they make no sense
+because they depend on the UI display, should the guy of the first
+article have been left with his cert, should we follow the letter of
+the law or the spirit of the law? I'll let you make your own opinion.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Working with UTF is a bit of a pain. The first link
+is a mini lib to help you handle that. Personally
+I've recently used the fontconfig string utilities instead
+(https://www.freedesktop.org/software/fontconfig/fontconfig-devel/x103.html#AEN4792).
+The second article is an opiniated one, as usual the comments are
+insightful in this case.
One article about how moving a "legacy" Perl package from core to
+external deps could break some web hosting because they'll forget to
+install it, another about captchas and how to do it better (we're
+already seeing a lot of companies ditch captchas), and mapping the
+whole internet.
The WIMP, the defacto UI design is fading in the trend, the first
+article discusses why. As far as the second one is concerned with
+the developer side of GUI devs, the author considers a bunch of very
+interesting options while not talking about others such as kivy, tk,
+shoesrb, etc..
Why would you silence the boot process? IDK but this is what is
+explained, and also another an OpenBSD setup on a fanless box with a
+lot of hardware show off.
Somewhat related to "Web literacy and more" in 68. We need standards
+for good formats that can be used for long term storage, the article
+tries to demonstrate why xz isn't one of those.
After the public access UNIX we get the public access Multics. Great
+if you want to give it a try. Read up a bit of commands from the second
+and third links. It's surprising that it's Y2K compatible.
There were a bunch of news related to this in the past days. Fortunately
+this time some big player has opposed it before it came into
+actions. Also, the first blog is cool, add it to your list.
Analysing signatures isn't a good mean to identify someone. As anyone
+that has ever listened to documentary about tracing history and how
+handwriting can be reassign to their original author knows, it's not
+as simple as it sounds. You need many pages of documents to be able
+to somehow, approximately, probably, say it was the right person. In
+the legal field this isn't even considered strong evidence anymore.
The history of the word ludite is interesting by itself, and also
+the current definition. There are some persons that have difficulties
+with tech, or maybe those are difficulties with addiction and not the
+technology itself. Some others have a morbid fascination with efficiency
+and control of themselves. Maybe passionately, like the n=1 movement and
+nootropics, regardless of their validity or not. In the end it comes
+down to doing things deliberately. The second blog is about detaching
+yourself from "harmful to privacy" services. The last two articles come
+in pair, and I'm shamelessly pushing one of my own article because the
+NYT one reminded me of it. Also related to "Compartmentalization" in 62.
+
+
+
Thoughts
+
+
+
For they do not appear to me to have lost the faculty of reasoning,
+ but having joined together some ideas very wrongly, they mistake
+ them for truths; and they err as men do that argue right from wrong
+ principles. For, by the violence of their imaginations, having taken
+ their fancies for realities, they make right deductions from them.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
A quick article about setting up an OpenBSD web server, it's always
+useful to have those laying around the web as a reference. All until
+configurations are deprecated, keep that in mind, tag the software
+versions you are using in such tutorials to help your fellow web
+travelers.
Maybe related to "A colorful man" in 64. This page is clear: it wants
+to set a new standard for command line tools so that they respect this
+environment variable: $NO_COLOR.
A series of articles about ideas and topics that can inspire you on
+your command line journey, or frighten you depending on your views
+about new toy-techs.
I've never really had to use recursive make before so I always thought
+there was some clean built in way to automatically do that. But that's
+not the case, so I've opted to simply not do it.
These days I've been working so much with ASN.1 DER that it has become
+ingrained in me, I see it everywhere... So it's time to finally read
+up about the specific format of GPG keys.
Another one related to "Assholes" in issue 15. I think the idea is
+clear but it's good to keep repeating it. I'm wondering, is it a social
+persona influence by the media, putting those caricatures on a pedestal,
+that creates this or are those people really like that from the get go?
Remember the podcast about data storage
+(https://nixers.net/showthread.php?tid=2164), there were so many
+layers, right? Well this time we insert a new one between the block
+and partition/volume-management one that has for role to deduplicate
+and compress data sent or coming from the disk. As it's placed here
+it is thus file system independent but requires this VDO to be able
+to read properly from the physical SCSI layer.
I think I've shared so much related to this topic this year that I
+don't need to put a summary. I'm glad those conversations are taking
+place, this is a historical moment, I hope 2018 will be remember as a
+year that reflected this. The four articles stand in pair, the second
+ones in the pair are reply to the first. While the first pair is more
+or less technical, the second one is pungent with technology and social
+network mysticism. I'm inserting those links here but if you want relief
+check the series "The WWW is awesome" and "Beauty is found in details"
+I've started in the Random section. The last link doesn't seem directly
+encroached with the others but it is, a beautiful peace.
In continuation with past weeks "The WWW is awesome!" in 70. Ever been
+stuck in graphic? Check what a bit of software simulation and civil
+engineering could possibly do in Eutopia land.
"Beauty is found in the details", this time we're tackling Chinese
+fonts. Language is such a complex topic. The past month I've been
+working with fonts, discussing fonts with a graphic designer friend,
+etc.. A character, aka grapheme, are only a single aspect, logograph,
+phonograph. So much to learn, so much to respect!
It's quite hard to make a website that is accessible on all devices
+and by most persons, even the ones with disabilities. I've been lately
+checking this specification regarding contrast and text readability,
+the website should be accessible when zoomed at 200%, however not all
+browser's change, nor agree if they should, their screen.width when
+zooming. Firefox doesn't, Chrome does, I have no clue about others.
+
+
+
Thoughts
+
+
+
In the end it is those who derive consequences and seize the importance
+ of the ideas, seeing their real value, who win the day. They are the
+ ones who can talk about the subject.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Sometimes the price of using some technology is high but maybe the
+benefits are big enough to compensate. Filesystems are one of those, you
+don't want it to break. However without testing there is no polishing,
+here's a case of beautiful polishing.
An explanation on how to write a program to trace a Linux process
+tree and a discussion about finding the PID of the terminal a script
+is running on.
A research paper about an OS built with demonstrable data security in
+mind. This OS, as old as it is (remember the previous link), already
+implemented and advanced version of the concept of process capabilities.
Most readers of this newsletter have used mpd and so are familiar with
+the audio_output configuration. This articles goes into skipping the
+http output and replace it by a direct sndio output (it has network
+support).
A discussion about a recent patch that would enable kernel lockdown
+directly when booting from UEFI with secure boot. The kernel built to
+look like an EFI executable.
You can find anything on the web. Recently I've been into some pretty
+narrow subject and could still stumble upon those super cool and
+passionate blogs.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Internationalization of input and languages is hard, it's not straight
+forward at all. This is the standard protocol for implementing it in X,
+though I've rarely seen it done properly.
I've been reading about the render extension in the past days and
+I can clearly assess that this is a similar issue as with the font
+stack ("More on typography" in issue 63): It's the same small group
+of persons that know about this tech that is scarcely documented. So,
+read up, educate yourself about it and maybe we can turn this around.
"Every year they hold some kind of conference named SIGBOVIK where
+the participants present absolutely absurd creations, many of them
+are funny and/or interesting, like the powerpoint punch card machine."
We picture the past as we see it with today's eyes, but it's a flawed
+perception.
+
+
+
Thoughts
+
+
+
"GUIs normally make it simple to accomplish simple actions and
+ impossible to accomplish complex actions." - Doug Gwyn
+
+
+
Probably one of the most cliché quote of all time, maybe it needs more
+pondering. Is it a limitation from the medium or from ourselves, what
+other types of media are we not using that could solve this?
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
A very well made page that has a list of the appearance and history
+of most unix tools, something I should've had during this podcast:
+https://nixers.net/showthread.php?tid=2191.
Another distro related (somehow) post. It's about managing dot files
+and reproducible setup. It is related to the podcast "less ties with
+a machine" https://nixers.net/showthread.php?tid=2051.
It might not look like it at first sight but this is related
+to "The Grand Analogy" in 66 and "The extended mind" in 64,
+and a bit of "Keeping track of your things" thread on the forums
+(https://nixers.net/showthread.php?tid=1637). This one challenges
+both of those ideas, true or not this will make it a good subject of
+discussion for the week.
Many don't like dotNet, but with it being now open source there's no
+reason not to give it a try. Also this should be of use for anyone
+going to a university that requires programming using dotNet.
A Mozilla initiative related to literacy and contribution in the
+ever-changing world of technology we live in. This is related to
+"Digital and technological literacy" in issue 65.
If you're into sec/crypto/pki topics then this is for you. The standard
+is coming together, read the section about "major differences from
+TLS 1.2" or enjoy the whole document.
Remember all the articles about digital identity (I'm not going to
+link them, I've been doing it too many times with those, just check
+the archive for that), well this is the state of affair for 2018.
+
+
+
Thoughts
+
+
+
A good model makes reality look normal, not weird; a good model assigns
+ high probability to that which is actually the case.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
We've shared a lot of articles related to not-so-obvious C behavior,
+so here's one more. It's the same puzzle as in "Why does it do
+this?" of issue 45 but better explained.
A walk through how sudo works by taking advantage of the setuid
+bit. Somehow related to "Bash is secure" in issue 13, "Oh so confusing
+setuid" in issue 8 and "Setuid... again!" in issue 28.
I haven't seen any custom extended attributes being frequently used
+in the wild other than for ACL and SELinux. The second link gives a
+general overview of common usage they can have, as metadata outside
+the file itself. It also explains something I've missed during
+the "default programs" podcast, such as setting user.mime_type
+to explicitly state the mime type of a file, along with other
+"proposed" attributes that could possibly be respected by softwares
+(http://dublincore.org/documents/dces/). The last 2 links are about
+the usage of the command line tools that can be used on linux and BSD
+to change the attributes.
In continuation with the previous links, let's discuss another type
+of metadata used for security, the POSIX ACLs. This is related to
+"Securelevel" in issue 34, "And more on real security" in issue 45, and
+"Procfs, capabilities, and netlinks" where we discussed capabilities in
+issue 59. The eiciel gui can manage both ACLs and extended attributes.
In a world of ever growing bloatware how do we cope with it. One
+solution is to increase the machine capacity, the other is to limit
+what the software can have access to. I think from now on whatever
+bloat software I want to keep running on my machine I'll start with
+a wrapper shell script adding memory limit.
The usual SVG showing a Linux system with zoomable and clickable text
+that sends you straight to the source. I've tackled the whole (or at
+least I've tried) storage one in the data storage on unix podcast
+(https://nixers.net/showthread.php?tid=2164), maybe we should do
+others about different layers.
This is an article that sums up a lot of what I hold close to my heart,
+namely building a base, not limiting yourself to a single domain,
+being inter-disciplinary at a minimum level.
+
Facebook
+All the clickbaity articles that have been spammed in the media the past few days
+
+
I don't think I have to say anything other then point you back to
+other issues in order, have fun going back in the archive: "SSI"
+13 , "Social Networks" 20 , "It's leaking from everywhere" 26 ,
+"Digital Identity" 27 , "More on digital identity" 36 , "In need
+of a website to understand a process that should be simple" 39 ,
+"Well researched and timely articles" and "Differential privacy" 47 ,
+"A continuation of last week "Random"" 48 , "Wear some colorful tight
+pants and continue on this crazy train with Ozzy!" 50 , "Propaganda"
+and "A timely article" 52 , "Are you tired of the articles of two weeks
+ago because there's more" 53 , "Create a category and people will get
+attached to it" 55 , "Will Geocities websites make a comeback?" 56 ,
+"Compartmentalization" 62 , "A story on privacy" 65
+
+
+
Thoughts
+
+
+
Organisms organize. human organisms organize reality - William Perry
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Sort of related to the previous link. Those links should clear your
+mind about how system calls can be mapped and used in a process. The
+linuxjournal article should covert the implementation part, which is
+super fun.
A guy takes the laws in his own hands, for personal benefits or
+not. Check out what happens and make your own opinion, be it according
+to the law or according to moral.
I've been delaying the podcast about init system for a long time,
+maybe even avoiding it purposefully. The next episode is about the
+role of distros, it's not even related at all. In all cases, read up
+those old articles, maybe we'll be able to do something about init
+and daemon managers soon, we've done one on daemons already.
The weird and obscure, all agglomerated in one place.
+
+
+
Thoughts
+
+
+
You need to be your own universe, to have your own dynamics, and only
+ then there'll be a place for others to be part of. Relationships are
+ stars in colliding universes.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Remember the past week series of nag about Debian, issue 64 "Nagging
+about Debian", it seems like there's a continuity there. The message has
+gone around and now people feel entitled to give their opinions. Read
+up, it's an interesting debate, is it ok to bring back to life old
+software projects. Is it more ok then to add new projects to the repo?
You might have heard of XFS once as the fs for "big files", you might
+have read a bunch of articles in the past weeks about filesystems in
+general and how data is layed out. This is time to mix those together
+and see what's up these days with XFS in the Linux realm. There's a
+nice talk about what subvolumes actually mean.
It's nice to explore different OS that are POSIX compliant. sortix
+has a lot of interesting stuffs going on, apart from all the underlying
+base, it has its own editor, package manager and much more. Download
+it and try it out.
On the topic of starting from scratch, very similar to "Tiny ELF"
+in issue 47 and "The world most prominent virus has erased all the
+source code" in issue 52, we're going to write executables without libc.
This is probably the blog I've shared the most so far but it's worth
+it. Related to the previous two posts, we again ask about the common
+root, this time we're taking a look at fread and fwrite.
After a hiatus of 4 months here comes a new episode of the podcast. In
+this episode we're tackling scripts, glue code, the original Unix tools,
+and their history. We're going to see why it matters nowadays. Be sure
+to also check the comments on the thread, as picky as they might seem
+they still bring some new info to the topic.
In the last section of the podcast I didn't cover any build tool,
+which there are way too many. I thought of mentioning cmake in this
+issue as I'm not familiar with it and this tutorial is good but cmake
+itself is kinda complex after all.
If you've ever wondered why there is a "Mozilla" in every single user
+agent out there then this is your answer. It's fun to think about how
+the technology has to squish itself to fit the current expectation of
+the users and not the other way around, even when sometimes it seems
+like the opposite.
We had quite the discussion about this rant thread during the week
+so I thought of sharing it so that you can have the same discussion
+(once more) with your peers.
A continuation on issue 63 "Privacy, confidentiality, and
+anonymity". This article emphasize how the perception of privacy
+evolved through time.
+
+
+
Thoughts
+
+
+
"Our riches of information are in some deep and perverse sense a
+ terrible burden to us. We have to artificially invent ways to forget..."
+ - Bruce Sterling
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Vain takes us on a journey to explore how to build a terminal
+emulator from scratch. Vain's approach at explaining is explorative,
+which brings it to life. As we all know this topic doesn't
+have many great articles and we're in need of more similar to
+this one. You can also check the nixers podcast about Terminals
+https://nixers.net/showthread.php?tid=2108 to refresh your mind
+about line discipline, escape sequences, and others.
I like colors but I can't help but think of this
+https://www.gilesorr.com/vim/slides/vimSyntaxOn.jpg, it must be the
+meme invasion that is influencing me. Regardless, we're reminded of
+something related to the previous article, termcap and terminfo and
+how it affects other programs such as less. It was nice to learn about
+lesskey.
The ins and outs of window managers. Those are quite old
+papers, 1988 and 2003 respectfully, and shamelessly we didn't
+innovate that much since then. The papers also debunk a lot
+of misconceptions, some discussions we already had on the
+forums too: https://nixers.net/showthread.php?tid=2135
+https://nixers.net/showthread.php?tid=2048.
What is a special character, what is not, how did we decide that? Why
+does it break everything. This is somewhat related to issue 59 "Procfs,
+capabilities, and netlinks".
The article goes over how to do good software engineering using the
+dreadful shell scripting languages. There's a lot to learn from this,
+open your eyes.
I found this amazing person who made a summary of two articles I've
+shared, the paper of Drepper in issue 58 "About memory" and Eric
+Raymond in issue 61 "On a roll with C". So if you've felt like you
+missed content from the previous two then here's your chance to get
+it back. Also, pay attention to the conclusion, some assumptions
+were wrong.
This is an article for both writers and software developers.
+
+
+
Thoughts
+
+
+
Many of us always think interesting things in their minds, but no one
+ other than themselves get to hear them because we don’t say those
+ things out loud, we don’t communicate them or sometimes can’t find
+ the exact words to describe them.
+
+
The only places in the world where this is possible might be the internet.
+
+
A black box for anonymized speech which unfortunately is misused.
+
+
+
I'm going to link the archived newsletter from now on because it seems
+like not everyone sees them. I'm also going to use different email titles
+for every issues, including the issue number in it, which is something
+I should've done a long time ago. Thanks for all the feedbacks, we now
+have 197 subscribers.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
This week there's a surge (resurge) of "typical blog posts", this
+time the "internet mind" has chosen Debian. Get your popcorn ready
+because this is gonna be fun. Would you call it the package managers
+war? Where do you stand on this, to centralize package management or
+not, discuss on the forums https://nixers.net/showthread.php?tid=1883
+and https://nixers.net/showthread.php?tid=2049 are relevant. The
+last post is the nail in the coffin, remember entry 60 "APT and https",
+well this guy is putting it down so badly it hurts.
This is a fascinating topic that was shared multiple times, the links
+are not new, check issue 34 "Xero's Weekly Ricing Tips". However,
+I still felt like sharing them again. I've dig into fontconfig from
+a developer point of view last weekend and noticed that I was wrong
+about the following assumption: I thought it was the Xft library that
+had the job of parsing the string representing how to match a font but
+it's not, it's a feature of fontconfig, and this makes sense, and a
+lot of articles online are full of misinformation about this. Xft sits
+in the middle, as the glue code only. This reminded me, once again,
+that: The font stack isn't that well understood. That we're still
+missing tools to manipulate fontconfig, though some exists such as
+fontik and fonts-tweak-tool, both from fedora. That the fontconfig
+xml language isn't well understood either. That the persons that are
+heavily involved in the projects are now Google employees and might
+be busy, Raph Levien
+and Behdad Esfahbob
+for example. And finally that maybe we can start to bring awareness
+to this topic if only we push out more demystifying posts in the
+wilderness for others to read.
From old to new, how the average blogger realized that BSDs are, like
+all, not-immune to security flaws. As was said in the previous article:
+"The promotion of the concept of magical immunity to computer viral
+attacks surfaces on a regular basis. This concept, while desirable, is
+misleading and dangerous since it tends to mask a real threat." Related
+to issue 60 "Cruncy click baity" (yes it's typo), the CCC presentation
+is what was discussed, it's a great presentation. The soldierx paper
+technical details are a bit beyond me but I could grasp the gist of
+the privilege escalation technique.
Setting up a mail server from scratch in 2018 is difficult, we need
+automation, like with iredmail and the likes. Does this mean emails
+are dead, probably not. The second article is about Wave a project
+that was meant to be a "revolutionary communication protocol". It
+didn't catch on and the author, which is also the creator of XCB,
+meditates on why.
The lead dev of Sway starts a series of articles about how to use the
+new lib wlroots to allow building compositor pieces more easily, so
+it's not really from scratch after all. However, even though you have
+a library get ready to be faced with a totally new world and learning
+curve (the author doesn't do that good of a job at explaining and
+throws specific words around assuming they are obvious).
This isn't a copy of wget, not even close, it's an example on how to
+use libdill, a new C concurrent library for concurrency (go-like). The
+low-level stacking of protocols was nice to read, it couples well with
+tls wrapping.
I didn't know this was a man page, man 4 console_codes. It would
+certainly have been useful during the research about terminals. Check
+it out and test/refresh your knowledge of what you've learned.
What is passion? This is a big question, should it be limited to work
+hours, 9 to 5? Should we be biased against the ones that don't work
+extra hours? Can we be passionate about something and not put the extra
+efforts into it, not choosing it as a priority? What's the effect of
+competition in today's world, is it a requirement to work more?
For the average person those terms might not look like they have
+a different meaning but they do and this is quite important to
+put forward what exactly we're talking about. Related to issue 47
+"Differential privacy" and all the digital identity related ones.
Free will and determinism, let's add "locus of control" in the mix. Take
+the test and see how much you score. How much do you think you are
+responsible for your own actions, who's to blame?
Fancy, memorable quote, what lies behind it? Here's an article to
+start some discussion.
+
+
+
Thoughts
+
+
+
"Rationality worship is central to many, perhaps most, of the
+ twistednesses of our culture."
+
+
+
This is a controversial quote but one that couldn't be more
+timely. Rationalizing our behaviors has become the everyday toy of many.
+
+
PS: There are some new changes on the forums, let us know what you think
+of them.
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
HCI applied to the command line. We already have backward search,
+now think about a kind of way the shell could help you write the next
+command, not only complete it.
I can't sum it up better than: If you're a human being and you're
+bothered by a human being, the only thing you can say is: "Not right
+now, I'm busy. Go away!"
Starting on a series of articles related to kernel modules on
+Linux. Those first ones should cover how to add, build, install,
+uninstall, and remove the modules.
...That it doesn't really matter anymore. There is a group of persons
+that are fanatics about that sort of things, not missing any tiny
+bit of info. I personally think that it's interesting but that the
+importance is not in those overly narrow details.
Regular expressions are one of the trademark of Unix history, in this
+article there's a discussion on the theory of it: automatons, which
+you might remember if you've ever taken a CS class.
An idiom that is embraced by many of us, put together by the novel
+concept of software as tools that was brought by Unix and more precisely
+pipelines. I don't agree with most of the opinions expressed in some
+of those articles nevertheless they're worth a read.
Those are timely articles, The Open Group was formed (by merging
+two other groups, OSF and X/Open) in 1996 and published the Single
+UNIX Specification: The end of the UNIX wars. Get ready for that
+second article because it's full of topics that were covered by this
+newsletter.
Hello there people that like to read stuffs related to psychology (and
+those who don't). The topic of compartmentalization has been one of my
+"Baader-Meinhof" aka frequency illusion for some time now... Well, it's
+more of a temporary kind of focus on a certain topic and what relates
+to it, it's deliberate and not really and illusion (I've seen the idea
+repeated in multiple books and articles I've read). Compartmentalization
+is the fabric of everyone of us, there are extreme cases like when
+those separated parts are contradictory but even so our personality
+lies within the connections of the compartment (which might explain
+why when there opposites it leads to personality disorders). This has
+been proven by many psychological experiments. Without them we do not
+exist, boundaries with links between them are what define an individual
+as a self. We can't be everything at once, we can't fulfil all our
+roles in life at once, we can't be all of our personality traits at
+once. The father cannot be at the same time the lover cannot be at the
+same time the worker cannot be at the same time the friend, etc.. And
+those have to stay within their confined boxes. Some social platforms
+nowadays try to destroy those and put everything in the same box. This
+turns an individual into a single blob, flattening their existence,
+labelling, simplifying, breaking down, and leading to the destruction
+of the self. Take this as food for thought for the week (and let me
+know if going on a tangent like that in the newsletter is too much).
+
+
+
Thoughts
+
+
+
We might be fighting with someone, and in the midst of the fight the
+ phone rings. After some heated argument as to who will pick it up, we
+ finally answer the phone with a voice and attitude that are in total
+ contrast with what we were just portraying of ourselves in the argument.
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Some ideas that you might want to use during the TTY week we usually
+do in summer. The tip that surprised me was that compose keys are
+supported in the console!
We discussed efficiency and optimization (pogo) in earlier issues,
+this time let's put an emphasis on C structures. This is something
+that is written in arguable depth in the paper of Drepper in issue 58
+"About memory" but that I felt needed more articles and discussion
+(because it's a super long paper packed with info).
I've had difficulties using pahole (which is also mentioned in Eric
+Raymond previous article but that he also hasn't tried himself either)
+so if anyone can figure it out properly and write a tutorial it would
+make the world a better place.
Well, it actually rebuilds a statically linked executable, which is
+really nifty in my opinion. Let's quote: "Exodus works around these
+issues by compiling a small statically linked launcher binary that
+invokes the relocated linker directly with any hardcoded RPATH library
+paths overridden. The relocated binary will run with the exact same
+linker and libraries that it ran with on its origin machine." If you
+have no clue what that means you might want to read issue 54 "LD.SO".
NetBSD is supported on a lot of platforms that are marked as deprecated
+for other OSs, this presentation quickly goes over some of the reasons
+why and examples of this.
There's a lot to learn about filesystems, what better way to do it than
+to have fun writing the interface to one. It's weird that I discovered
+this post after having done the research for the podcast about data
+storage on Unix, it could've been useful.
Flashy title, slow presenter (watch at least at 1.25x). To be fair the
+presentation is about teaching how to build and present BSD systems
+from scratch on boards (Raspberry Pi, BeagleBoard), though it goes a
+lot off topic with resources and OS ideas. Aka, "get a copy of the
+source, compile, build the OS, boot it on the ARM board, and work
+through some exercises".
OpenBSD has a good reputation as a platform that is to be put on the
+fighting lines of the network peripherals. The presentation goes over
+setting up a VPN solution using OpenBSD. Warning alert for the high
+amount of networking jargon (way more than I could grasp).
Issue 44 "The new Face ID is already a meme", issue 36 "More on digital
+identity", issue 27 "Digital Identity", issue 9 "Identity", we've been
+discussing this topic over and over again and I hope this becomes more
+and more of a hot topic in the coming years.
Fun DOS self-compilable chiptune player and research paper.
+
+
+
Thoughts
+
+
+
Have you ever noticed that when somebody says "That’s a good
+ question?" it’s usually because they don’t yet have an answer?
+
+
+
That quote couldn't be more wrong.
+Every single time I hear someone say "That's a good question" and remember
+the saying I pay extra attention to the discussion and realize that it's
+the total opposite.
+
+
What do you think?
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
A comprehensible explanation of what the meta tags on mp3 are, the
+ID3. Plus an article about their management under Linux (but it's more
+about using free software).
This is something I had no idea about but that makes total sense. It's
+funny how nowadays "app stores" are learning a lot from package managers
+that have been there for years.
This time about some memory access concepts and locks (Which is also
+covered in the book/paper by Drepper that I've mentioned the past
+weeks), and about why there's no xor condition (which I found a pretty
+weird question to ask in the first place).
We've already shared many articles from virtuallyfun, the name of the
+blog certainly stayed true to itself in all of them. I hope you're
+enjoying them as much as I am. Kudos for the great experimentations
+the author is doing. The article specifically deals with something
+we've discussed in the podcast about "bits and words".
I'm probably not the only one that kept thinking throughout the
+article about the security implications, what about the crashes and
+laws regarding those.
I've recently set adsuck on my machine, it's not really a full dns server but it does the job of filtering ads and unwanted traffic. What are other reasons for running your own DNS?
The first article is about a direct application of nihilism into
+websites (sarcasm). Second one is about extremism in blog size. The
+common thread going through those articles: the love of blogging and
+sharing information.
Beautiful reverse engineering of an unknown UDP packet.
+
+
+
Thoughts
+
+
+
"There are three deaths. The first is when the body ceases to
+ function. The second is when the body is consigned to the grave. The
+ third is that moment, sometime in the future, when your name is spoken
+ for the last time." - Those don't necessarily happen in this order.
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Remember the post of last week (issue 58) "About memory", you certainly
+didn't finish reading it (I didn't either, there are 30 pages left)
+so keep this blog post queued for when you reach a point where you've
+grasped how alignment affects code efficiency (as crazy as this sounds).
We've discussed sysdig in issue 18, let's talk about it again and
+about other process tracing programs. The tool itself is open source
+and the company seems to be making money from the web interfaces that
+it constructed around it, sort of added value benefits. There's also
+csysdig a very cool open source curses interface for it which
+resembles htop.
In 2013 the Oxford dictionary added grep as a noun and a verb:
+https://en.oxforddictionaries.com/definition/us/grep. In this article
+you learn about the magic of hardcoded values and adventures to dig
+them out of the ground.
There was a fruitful discussion on https://lobste.rs last week about
+procfs formatting. It made me think of netlink and other interfaces
+to get the same information. Then I've started testing with taskstats
+which forced me to set capabilities on a copy of a python interpreter
+so that I can try out a script using the gnlpy library without making
+my system insecure.
Insightful discussion about the way that processes should be managed
+if containerized (or not?). A bit of a reminder of the podcast about
+processes intro sections. I love this kind of article, a monologue
+based on questions after questions, expanding into deeper topics.
A tool for human view of the history of unix. "The coupling between
+such a utility and the community it serves, is so strong that the
+community is actually a part of the system itself." The article is
+quite long but it's worth the read.
This is from the guy that warns about not copy pasting command from
+a webpage, and that also worked on the recent Intel CPU bug.
+
+
+
Thoughts
+
+
+
"It is really true what philosophy tells us, that life must be
+ understood backwards. But with this, one forgets the second proposition,
+ that it must be lived forwards. A proposition which, the more it is
+ subjected to careful thought, the more it ends up concluding precisely
+ that life at any given moment cannot really ever be fully understood;
+ exactly because there is no single moment where time stops completely
+ in order for me to take position [to do this]: going backwards." -
+ Søren Kierkegaard, in his journals (1843)
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
A case against not mixing multiple package managers but to use the
+one of the distro. I'm in the favor of using a package from the repo
+instead of one from a pkg manager for a specific language.
Low bandwith and want to download something, let it be stopped by
+a proxy, saving the links to the usb, download on a computer with
+fast internet, put back on the first machine, and proxied again and
+downloaded from the usb. The other links are about inetd, which I just
+learned about. Proxying the connection and piping it to stdin to a
+program it will spawn on the fly to handle it.
Simulating PDP-11 Unix a.out binaries and reliving Unix V7. Those
+are some really cool tasks to put things of today's world into
+perspective. Remember when we discussed line discipline in the podcast
+about Terminals?
I like differing ideas about all subjects but be sure to take them with
+a grain of salt. Especially when the author seems a bit too enamored
+with being similar to and justifying his idols. Somewhat related to
+"Another old one that fires up arguments in the efficiency world" of
+issue 55. The usage of the terms "places" vs "tools" fits properly in
+my opinion.
Lasagna softwares can be tricky when its base is an ed-like ui. This is
+related to the above, gdb being a "place" and not a "tool". Remember the
+GUI for gdb in "A gui for gdb" of issue 23, this is criticized here too.
I've been reading this book for about 2 weeks now and I'm halfway
+through. It is by Ulrich Drepper which is the infamous lead developer
+of glibc. There's a lot of low level discussion so beware (from how
+the cpu cache works, to how the alignment affects performance, to how
+code structure affects it, prefetching, etc..)
Another article about the basics of VFS, reminding me that even if
+you do a research about a topic "Data storage on Unix" you might still
+forget it after a while.
I've noticed it first hand, it's getting harder and harder to get
+specific results from Google and the GoogleFu is getting removed
+from it.
+
+
+
Thoughts
+
+
+
The three golden rules to ensure computer security are: do not own a
+ computer; do not power it on; and do not use it. - Robert Morris
+
+
+
Note: There used to be a bug related to gmail where links weren't
+clickable. This has been fixed with the help of mort.
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Related to issue 25 "malloc never fails on Linux... or does it?" and the
+fork() part of the podcast called "Processes on Unix". After reading
+those you can continue with the new articles and learn about cloning
+and spawning paradigms like rfork, clone and spawn.
In the spirit of the last few weeks, let's continue on this series
+on articles about automating build. This is an ongoing public domain
+list of regrouping all annoying build systems (all of them basically)
+and why they are annoying.
I've seen that website a while ago but it has grown so much since
+then. It has become a beautiful resource that regroups a lot of the
+basic knowledge around Unix/Linux. I would definitely recommend it
+for anyone starting on their "journey".
Yet another case of "the more I learn, the less I'm surprised by
+the stupidity". The author says it best: "This sad situation is
+simultaneously a bit funny to me."
I don't usually click on articles that have numbers in their titles
+(the nasty "listicles") but this one was more or less good with some
+obvious content to many readers (though promoting the sale of a book -
+This was to be foreseen!). This is put in contrast with an unfinished
+mini book about shell portability, see issues 13 "Linters" with
+shellcheck, 49 with "josuah's shell tricks", 17 with "Expansion &
+Globs" for the Bash Beginners Guide. Actually there are so many issues
+discussing shell tricks and compatibility, I can't mention them all.
I'm not really sure how "plain text" has anything to do with the
+first post... But the author seems to imply what he's doing is plain
+text manipulation (inside a memory DB?). The other article is a case
+against plain text or a circular argument against encodings. The last
+project tries to fix unicode, it's impressive to see.
A backup that uses deduplication just like Hammer, this is truly
+fascinating. I don't know about many projects that uses this, maybe
+it would be nice to hear about them.
A tutorial in the form of a paper for novice (like me) who'd like to
+learn how to read mathematic scientific paper amongst other mathematical
+documents.
Diving into TempleOS the right way, taking its OS designs seriously. For
+a cheesy quote "There's something worthwhile to be found in everything."
+
+
+
Thoughts
+
+
+
Idle hands are the devil’s workshop; idle lips are his mouthpiece. -
+ Proverbs 16:27
+
+
+
We live in an age where we don't have to lift our fingers, so much that
+it has become an issue. This might be of religious origins but can easily
+be taken out of this context and applied to anyone.
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
Some older issues of the newsletter are required to solve parts of the
+hunt. The next two links are also hints for two of the early steps,
+newsletter readers will have an advantage.
This is one of those "the more you know, the more everything
+seems strange and nothing is strange anymore". You can take
+that as an extension of the podcast about "Bits and words"
+https://nixers.net/showthread.php?tid=2071.
OpenBSD has something similar that it newly implemented
+https://www.bleepingcomputer.com/news/security/openbsd-will-get-unique-kernels-on-each-reboot-do-you-hear-that-linux-windows/,
+at each reboot you have a different kernel (Linux had it since
+2013). Linux wants, KASLR, on the fly different memory mapping of the
+kernel, read up to know more... There's some weird conspiracy theory
+in the background which unfolded in the recent days. If you remember
+"JS is strong" from issue 33, it's related.
Send them to spamnesty, they'll take care of them. Great idea, let's
+see if this grows. I love how you can take a peek at the email threads.
+Go post it on the forums https://nixers.net/showthread.php?tid=437
+if I haven't already!
As usual. "Working in isolation from the mainstream community, attempts
+to reinvent the bicycle, abuse of jargon and re-implementing older
+technologies under the new fancy names."
Cloudflare always has good articles about the PKI.
+
+
+
Thoughts
+
+
+
"Don't worry if it doesn't work right. If everything did, you'd be
+ out of a job."
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
This is a tricky bug related to the C implementation of the Wayland
+protocol. It has to do with endless (fd) events going to non-existent
+objects which are redirected to a singleton object and never cleaned.
Learn to abuse the evil code that resides within some
+programming languages. Those C trigraphs and digraphs blew
+my mind! At least in gcc to enable trigraphs you have to add
+-trigraphs. https://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C
This is part of what we've discussed the past few weeks, optimization,
+caching, data storage. It shows where most of the time is spend while
+traveling through the computer.
Wikipedia links about interesting topics that can be linked together.
+
+
+
Thoughts
+
+
+
"It is a sad fate for a man to die too well known to everybody else
+ and still unknown to himself" - Francis Bacon in The Essays (Of Great
+ Place, referring to men in positions of power)
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
The dynamic loader is a program in itself and has options, those are
+implicit most of the time but you can be explicit about them. Here are
+some links to learn more about the topic, follow along using objdump
+-x <program>. LD_DEBUG is my favorite new finding.
Funny article about something we've all experienced and a solution
+to it. You can share your own experience in this old thread
+https://nixers.net/showthread.php?tid=307.
This one goes over the list of Unix mail clients. I'm definitely a
+fan of those type of articles, Kirby wrote one on the forums about
+reverse engineering tools, and I did three, one about game emulators,
+another about UML, and the last one about mind map creators.
They're everywhere, at every single level, hardware and software,
+everything is cache. Thus you need to know your share of info about
+them. In "Desktop Management Interface (DMI)" of issue 18 (Getting
+info from the bios and hardware) we discussed some of that topic too,
+hwloc is an amazing addition to the list.
Remember "Memory and optimizations" of issue 39, well this is from the
+same team called Directi, I'm not so sure what the company does but
+they do publish some amazing content online about optimization. It's
+probably more about the author, Bhavin Turakhia, also a founder of
+CodeChef amongst other companies. The article, which is really good,
+emphasises on processes scheduling and CPU utilization, you can
+read/listen to the podcast about processes before tackling it.
This is the paradise for anyone in QA. A lot of distributions (Debian,
+Fedora, Arch, NetBSD, FreeBSD, etc..) use this concept to ensure
+their packages are lean and clean. The documentation about it is more
+extensive than I had imagined and there are many tool to help with
+the process.
Those are my first finds about systemd graphical service manager and
+log viewer (one in rust the other in c++). They look quite nifty, though
+a sorrow reminder of the Windows-like aspect of systemd internals.
This is the podcast I've been listening to during the holiday traffic,
+I highly recommend it.
+
+
+
Thoughts
+
+
+
You need huge material wealth, acquired only through intense engagement
+ with the affairs of the world, to build monuments that inspire us to
+ abandon wealth and to leave the world behind.
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
If you've ever had trouble understanding linking and compiling then
+the first article is for you. The second article (from the amazing c2)
+can be summed up in this quote: "The problem with C is the techniques
+that help it compete with modern dynamic languages are invariably the
+techniques that make it dangerous."
There's nothing particular about OpenBSD in this document, it does
+a good job at hovering the advantages and complexities (interface,
+computational, space, implementation) of one type over another. There's
+a tool to calculate interface complexity that is linked in the Appendix
+(I couldn't extract it from the document though so this remains to
+be tested).
The first make boilerplate looks promising clean and simple, the second
+one looks confusing. Or you can opt for a nice from scratch make like
+this one http://git.nixers.net/libgbt/file/makefile.html.
It seems like queue.h (man (3) queue) is used in a lot of softwares
+https://github.com/openbsd/src/blob/master/sys/sys/queue.h, make sure
+to look into that. The post is straight forward and does a decent job
+at explaining what the software does and how it does it.
A lot of resources to get you started on the beautiful (or ugly)
+discovery of memory manipulation (and brainwash). Read those in the
+order posted, they are super fun.
Yes, I'm talking about the "state of the internet" type of
+articles. Tighten your belt because we've actually advanced in the
+discussion. We've now reached the Messiah stage where if someone has
+"insights" on the matter or "disconnects" they get a surge of visions of
+the world and are now entitled to extract facts from subjectivity. Kind
+of admirable how the interviewers and spectators are captivated by
+the paranoia and conspirational theories, I guess that's one deep
+dark perverse pleasure we have. Well done guys! (Please tell me if
+I'm stretching those too far...)
I was reading in my head with a serious tone until I reached the part
+where they actually did buy that other domain...
+
+
+
Thoughts
+
+
+
One regular chatter noted that on the CB Simulator "you meet someone
+ from the inside out. You judge them on their heart and values, not what
+ kind of jeans they wear." - About the 1980 CompuServe CB Simulator.
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
More on Linux! Documentation about proc is scarce and the tldp makes
+a good at regrouping all the info. Going back to issue 41 "Almost
+everywhere but not POSIX" and the /proc/sys/kernel/ctrl-alt-del
+of last issue.
Those are impressive. The level of skills required for those is beyond
+my imagination. The second article is full of insightful information
+about early day Unix such as: "The ';' escape sequence put that terminal
+in full-duplex mode. Hence, the UNIX greeting message contained this
+sequence. A terminal that does not understand this sequence, such as
+our GBA TTY, would print the semi-colon.".
The quest for optimization never ends, let's continue with the low
+level hacks for this issue. Surprisingly, the one thread per client
+paradigm isn't the recommended one.
This is an original idea. It doesn't run out of the box, there are
+some patches in the archive that you need to apply to the kernel. If
+someone is up to the task then it could be interesting to test.
Heavy and full of technical topics, this is the 52nd issue which
+completes a year worth of newsletters. Let's see what this new year
+has in store. Share with the world what you've thought of those past
+newsletters and what you're looking for in the future. Which issues were
+your favorite ones?
It's starting to get cold outside, keeping a Unix machine next to you
+ and running :(){ :|:& };: is a great way to stay warm.
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
What should you go for depends on your use case, this post dives into
+the intricacies of it explaining small differences of data packing
+between openvpn and ssh.
This blog is fantastic, I like how there are links to previously
+related ideas. Very imaginative! About the first post, this discusses
+the issue with licenses, the dilemma between morality and legality,
+this comes to mind: http://www.cs.vu.nl/~ast/intel/).
Interesting philosophy but this falls short, like any fatalism or
+absolutism, you need to go beyond that, it's but a stepping stone on
+the way you need to conquer.
"You and me are real people, operating in a real world. We are not
+ figments of each other’s imagination. I am the architect of my own
+ self, my own character and destiny. It is no use whingeing about what
+ I might have been, I am the things I have done and nothing more. We are
+ all free, completely free. We can each do any damn thing we want. Which
+ is more than most of us dare to imagine." – Jean-Paul Sartre talking
+ about how consciouscness is freedom but hell for most.
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate then
+you can send something to my btc address (ask for it) or patreon page:
+https://www.patreon.com/venam.
This is a follow up of issue 48 "Capturing and debugging user
+interaction on the shell". This blog regroups a gigantic extensive
+list of all available options to record the terminal.
This gets you thinking about the architecture... Anthropomorphizing
+our mystic view of the order of things. Hey, we might find ourselves
+in a future where we refer to computers the same way we refer to
+mythological gods!
More Linux specific topic for this newsletter! Self proclaimed: "the
+most comprehensive list of Linux distributions' problems on the entire
+Internet". On a side note, the person writing the article got other
+interesting ones on the blog such as a list of good fonts and more
+"this is best, this is worse"-kind of articles.
This was mostly explained in the podcast about processes
+(https://nixers.net/showthread.php?tid=2141) however if explanation
+with BIG fonts and icons are your thing then this will really help.
Recently I found myself wanting to do a simple implementation of a FAT16
+fs manipulation tool and this is the resource I looked into. FAT is
+easy to grasp and should get you started in the world of file systems
+(well, I say that but I didn't dig into the technical implementation
+of other file systems myself. The related podcast about data storage
+https://nixers.net/showthread.php?tid=2164).
Yet again on this railroad of "the state of the internet" articles. Like
+it or not it seems like a trend and it's fun to watch everyone going
+through the "Oh I just woke up to what the internet is about". You
+can't blame the trend, once you learn something you start to see
+it everywhere and want to shout your lungs out. Digital literacy
+is going up, non-technical persons are starting to be interested in
+the details. For us it's old news. It's also interesting how internet
+services are regarded as God-like entities that influences us and that
+we have to please, in the end the writers of those articles have to
+realize they can't anthropomorphize them, they can't consider them as
+carrier of the holy good will for the masses. Post hoc ergo propter
+hoc. This is not the internet this is their new religion; blaming it
+for the good days and bad days. But can we critic this behavior in a
+world that is frightening, slowly turning nihilistic, a world where
+its people are looking for a Leviathan to bring back the order.
Your dose of security for the week, botnets and honeypots to analyze
+them. This small book gives a good overview of the topic for both
+experts and beginners.
AKA living the dream life of the Hollywoodian hacker.
+
+
+
Thoughts
+
+
+
Whatever requires a bit of effort without prestige isn't that popular
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
If you've been following the past 3 weeks or so I've been sharing
+articles related to this subject. This person reiterates over it, yet
+again. Nothing new but it's nice to know someone is there to publish
+an article about it.
We've discussed a bit about RAID during the last podcast (Data Storage
+on Unix), here's a ridiculous myth busting article (refreshing your
+knowledge of probabilities).
Use this website instead (for example for the date search).
+
+
+
Thoughts
+
+
+
If it seems too good to be true it probably is.
+
+
if wishes were fishes, we'd all cast nets.
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
I wasn't sure last week if I should put the web rants in the Unix
+section or not. I think they fit somehow. Those two articles related to
+the "state and birth of the internet" + nostalgia kind of blog posts
+that are popular these days. Don't get me wrong, I love this kind of
+discussions, apart from the rosy retrospection there's some truth in
+them especially the kind of discoveries you make. The first link has
+a lot of politics and marketing topics, if you don't like that then
+skip it.
Last week I was discussing on IRC about creating a sort of mini-version
+of the internet, a closely linked one, with a net-art or "tilde"
+style. Well, this does the job well already.
Ever wanted to get a part of that dude inside your machine, your dream
+comes true. To be fair it's a good piece of software, I'm not sure if
+that's something they use to make a distribution "libre".
Scheduling processes is one of the core tasks of an OS, checkout some
+discussion about the implementation differences in the links. If you
+have no clue what this is about read up about processes in the podcast
+(https://nixers.net/showthread.php?tid=2141).
Nothing is so firmly believed as that which we least know - Michel De Montaigne
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
Want to go hardcore and learn how executables are made from the
+bottom up, read those links. The next question is: Does it matter
+if an executable is smaller than the size of a page? Let's make room
+for discussion!
Your dose of new security topic for the week - this one is fascinating.
+
+
+
Thoughts
+
+
+
Do not propose solutions until the problem has been discussed as
+ thoroughly as possible without suggesting any.
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
A web-encyclopedia about DEC terminals, I like the history and reference
+manual pages. Those manual are thorough, even documenting things such
+as the arrow keys and their functions which we take for granted today:
+"Cursor down (0138) causes the cursor to move down one line until the
+cursor reaches the bottom line. Once the cursor is in the bottom line,
+receipt of the cursor down code has no effect."
The iconic pioneer of current UX brought back to life. We discussed
+a bit of the story in the following podcast about WMs and DEs
+https://nixers.net/showthread.php?tid=2048. This article focuses on
+the smalltalk aspect of it.
Some insights from a BSD maintainer, teacher, and founder of the BSD
+certifications. Are you certified, looking to be certified, or are you
+not, and why (not limited to BSD)? We can discuss that on the forums.
However it's not as dark as the name implies it to be, food for
+thoughts.
+
+
+
Thoughts
+
+
+
Perfection is achieved, not when there is nothing more to add, but
+ when there is nothing left to take away. - Antoine de Saint-Exupery
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
I'm starting to buy into the idea however just as a thought experiment
+I love it for how it renew the FHS or maybe I would just like it for
+developement work. I'm not sure if I'd use it as my everyday drive of
+if it's better than vagrant or docker for developement only purpose.
At the same time be sure to checkout the most recent podcast about data
+storage on unix (https://nixers.net/showthread.php?tid=2164). After
+a long hiatus I finally managed to put it together.
If you haven't seen those already, October-November are going to
+be spicy for the crypto community. Though we've been through worse,
+it's ok, there are multiple layers of security and this is only one
+falling guard.
Just some nice terms and principles that are cool to learn about.
+
+
+
Thoughts
+
+
Internet arguments in a nutshell:
+
+
+
ednos: technically, I'm not pedantic
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
During my research for the podcast about licenses I've learned that
+you have to explicitly mention giving up some of your rights in the
+license. This is a try at creating a new license that has a set of
+tools to facilitate selling commercial licenses.
This wiki regroups a lot of information about Linux system without
+systemd, how to run some without it, the pros and cons (mostly cons),
+and info about init systems.
This sounds highly surprising but it's true, though it's not really awk
+but Arcan, think image magic piping style-like. Arcan is a multimedia
+framework (lua like). It is an impressive project, manipulating media
+on the fly from different sources, Qemu, Xorg, Wayland, libretro,
+SDL2, etc.. This is definitely something I'm hoping to learn in the
+next few months.
Those are about files I/O and different ways to read/write them, the
+first post is specific to the drawbacks of page disk caching (why not
+buffer?) on Linux and the second about generic POSIX I/O. The first
+article confuses a bunch of terms together but it's still fine. The
+second one argues the basic POSIX as a bottleneck to speed (metadata
+and permission checks, file descriptors, etc..).
There are many reasons to use Unix, a lot of Linux users find
+themselves in a sort of primeval dichotomy, or they are with something
+or against it. The webcomic is fun, check it!
This article regroups the most cliche Silicon Valley-type fan base
+with the most erroneous definitions and conflations of subjects you
+can imagine. I wish it was a satirical newspaper but it's not. All that
+apart from completely missing the point of what futurists do with what
+New Age divinists do.
+
+
+
And while religious futurists, astrologers, occultists, New Age
+ divinists, etc. use methodologies that include study, none of their
+ personal revelation or belief-based work would fall within a consensus
+ definition of futurology as used in academics or by futures studies
+ professionals.
A very well put article about VR and our perception of free will/power
+over our environment.
+
+
+
Thoughts
+
+
+
Someone complaining on social media is free advertising.
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
YACB (Yet another cool blog), this one page I've linked focuses on
+Unix compatibilities in C programming. There's a lot of good content
+and myth busters in there.
Yet again a rewrite of GNU utils. If you've listened to the podcast
+about unix file hierarchy then you'd like to know that one of the
+speaker worked the Filesystem Hierarchy Standard.
I'm halfway through this book, it's wonderfully written and is helping
+a lot in my current research. I'm not so sure if it's freely available
+or not, if not then I'm sorry about that, I highly recommend getting it.
I'm quite found of his proposal but standards are hard to shatter,
+but again, the OSI layers are about theory and not something that
+products depend on.
A walkthrough the countless tools for Linux tracing
+(sys/kernel/debug/tracing/). You certainly won't be able to remember
+them all so I've linked a blog post going through them.
If you've never knew about that then it's time to learn about this
+Linux kernel rescue mechanism (The kernel should be compiled with
+support for it).
The RFC is simple enough to grok and demystifies torrents, moreover
+this can get you started on helping with libgt.
+
+
+
Thoughts
+
+
+
"The Internet is not for sissies." -- Paul Vixie
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
This subtle trick to kill all processes, be sure to read the comment
+on the article as they are insightful. Also, be sure to follow this
+person's blog as it's always full of high quality content.
"It's the website of an old SonicPi band. these guys used to make
+live music by coding it", I didn't like the music at all but the
+concept is interesting. If you don't know about the demoscene check
+the documentary.
It adds the ability to compute hashes of the data on the fly amongst
+other things, which is nifty when doing analysis. The dcfl stands for
+"Defense Computer Forensics Lab".
If you've ever struggle with the details of a scientific paper then
+you need to listen to this.
+
+
+
Thoughts
+
+
Those are sentences that have resonated a lot with me the past few days.
+
+
+
To worship a phenomenon because it seems so wonderfully complex is to worship your own ignorance.
+ If a phenomenon feels complex, that is a fact about our state of knowledge, not a fact about the phenomenon itself.
+ Complexity is a property of questions, not answers.
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
This is a chapter of a larger book about filesystems and the details
+that need to be thought about when implementing one. It goes through
+some of the POSIX API needed and why cache is so important. It was a
+good read for my future podcast which has been, oh for so long, delayed.
"An operating system is said to be reliable when a typical user has
+never experienced even a single failure in his or her lifetime and
+does not know anybody who has ever experienced a failure". Too good
+to be true.
I ran killall cat to kill all the stray cats (pardon the pun), which
+ surprisingly took several seconds but cleaned everything up nicely.
+
+
+
Keep up with your projects, whatever those are, and if you don't have
+any then replace down time with one.
+
+
Have a wonderful week everyone!
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
You may remember this guy from a previous newsletter. He was the one
+that opened a discussion about the assholes in Unix communities and
+also had a nice article about PAM. Well, this time, he's taking it a
+bit far. I haven't read that book and I won't spend a dime on it but
+just checking out what this achieved is hilarious.
Other than humans doing inhumanes things to other humans what really
+bugs me is that we've lost a source of alternative reality, the
+"what ifs".
+
+
+
Thoughts
+
+
+
nobody needs to know but yourself
+
+
+
You can be content just within you.
+
+
Let's hope this newsletter makes you smile!
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
This go project aims at syncing and backing up anything, it's a
+"content adressable file storage" (files named by their hash) that
+syncs with remotes and generate "views" (FUSE filesystems) of the
+storage based off searches of the content. Which sounds super cool.
This article points in the direction of a bunch of scripts that do
+some reconnaissance, fetch info in a system, to check if it has been
+compromised or if someone has done privilege escalation.
The python book is for beginner but I love the interactive approach. The
+second one is: Learn Enough Command Line to Be Dangerous is an
+introduction to the command line for complete beginners, the first
+in a series of tutorials designed to teach the common foundations
+of "computer magic". I also love the fun way in which the
+command-line-tutorial book is written, it's very good for beginners.
Under docker you can do a bunch of weird stuffs, this one is an example,
+then you have to clean up. It also brings back the discussion about
+init that is so recurrent on IRC.
Is optimization evil? What if we become cyborgs, are we still not
+compilers? That first link is overwhelming, I've had it in my link-list
+for a while but was afraid to read it all until now. Good luck with
+that everyone! I highly advice listening to the podcast about processes
+before tackling this if you aren't familiar with memory. It's actually
+perfectly explained and I love the explanation of the tools and proc
+in the end.
Sometimes I wonder if guests are present at the table when they are
+ obsessing about photographing everything they eat, one time a guest
+ suggested I change the colour of the plates (from white to black)
+ because he said the photographs would look better. – Massimo Bottura
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
This is one of the oldest trick in the book. If you've been following
+this newsletter for a while you'd have already read a bunch of attack
+vectors based on this race-condition hack.
Maybe I should take the combination "small death" back as it's
+synonym with orgasm... Let's just say that it's the reverse in this
+case. Someone should definitely build a code obfuscator that uses
+everything mentioned in that article.
One article that frightens you and another that calms you. Actually
+both aren't frightening and are very well explained, read them in
+sequence and you'll see.
The Linux kernel documentation is a bit overwhelming but enjoyable to
+skim through. I should probably redo the podcast about logs with more
+depth. I particularly like how straight forward the ibm article goes
+through the Linux kernel logging mechanism.
Now brace yourself for next year week-in-the-terminal because this
+year didn't attract many. So standup soldiers and get ready from now,
+it's never too late.
Hek, the other day I was fixing a bug in a java code where there was an
+undefined behavior while casting from Byte to byte[], I just imagine
+how hard it can be to work on C projects that face the whole world
+in production-mod and not just hobby projects. Sure C is fun but it's
+hard to make it solid. This list is so extensive... and why do I know
+about most of those when I only do C for fun, this should be left to
+compiler developers, but in C-land it isn't (Just do sanitization with
+your compiler... Or maybe not, it might break).
I hope you're enjoying it as much as I'm enjoying putting this together!
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
Learn from history and don't repeat the same mistakes. This is a
+continuation from the series of articles we've already shared about
+systemd so be sure to read all the content before attacking this one.
I've been seeing some of those pasted on IRC lately, watch out! He
+gives a remediation to one of the issue which is nice (checking a key
+before importing it, common sense?).
I didn't know this was part of the gnupg suite. This is quite nifty
+and the server is very Unix-oriented with SMTP-like syntax. Though
+I've had issues using it in a real setup.
Was a bit surprising to me but it makes sense... Well,
+does it? Checkout the podcast about special files
+(https://nixers.net/showthread.php?tid=2052) maybe that can give a
+clue about hardlinks.
That's how you make the ricing legends rise up from their graves (IRC).
+
+
+
Xero's Weekly Ricing Tips
+
+
did you know there are multiple terminal multiplexers? features like
+persistence, multiple windows, and session sharing are the common features
+sets. the big three all can be customized with at least a statusbar.
+
+
+
screen - the prototype. hardstatus is the variable you want for customizing the statusbar.
+
tmux - the archtype. status-right and status-left configure it's statusbar.
+
dvtm - the leanest. uses dvtm-status is an add on statusbar.
+
+
+
if you like premade or configurationless setups:
+
+
+
mtm - as simple and streamlined as they get.
+
byobu - a suite of enhancements for screen and tmux
+
neercs - an ansi art style "windowed" multiplexer
+
twin - "Textmode WINdow enviroment" a full text only wm setup
Is it really the best to give the users what they always prefer? Isn't
+like a mother distributing surveys to her children after every
+meal.. After a while they would only get "icanhascheezburger". I guess
+AI would do a better job than big data.
And be sure to listen to the podcast about processes if you have no
+clue what that is.
+
+
+
Thoughts
+
+
+
If you're dreaming or complaining, it's the same shit. It means you're just not doing shit.
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
This is how written content on the internet has degraded over the
+years: From well polished and respected to rapid rants and attacks to
+"bloatwares" (but hey it's just my opinion).
If you've been following this newsletter for some time you would've
+noticed that I've been adding links related to digital identity, some
+philosophical and some technical. This one is about the crypto future.
+
+
+
Thoughts
+
+
+
Concentrate all your thoughts upon the work at hand. The sun's rays
+ do not burn until brought to a focus. - Alexander Graham Bell
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
This is the kind of subject that you need to grasp, otherwise when
+you run into the issue you are left wondering for hours why it's
+happening. Here the disk isn't full but it says it's full.
This discusses how to initialize a terminal manually using raw mode
+and terminfo so that you can have an interactive session through a
+simple telnet connection.
A must read article that leaves you pondering about the click-economy.
+
+
+
The terror was far more contagious than the virus itself, and had the
+ perfect network through which to propagate — a digital ecosystem
+ built to spread emotional fear far and wide.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees or simply donate
+then you can send something to my btc address or patreon page:
+19suN5V6nyKBvaeuAhghSMCzyQcZLGVNRy or https://www.patreon.com/venam.
For some systemd is the end of the world, for others it's a window of
+opportunity. If you haven't got accustomed to what systemd is then
+you can't even side yourself on this argument. This series of links
+should get you started.
If you want to be the next Google (or dream by comparing your business
+to it). If you were wondering the full acronym is: Bottleneck Bandwidth
+and Round-trip time.
+
+
+
Xero's Weekly Ricing Tips
+
+
tmux: programmatically change tmux tab names
+in your shell aliases
+
+
alias tshrug="printf '\033k┐(\`-\`)┌\033\\'"
+alias tlol="printf '\033k\(^0^)/\033\\'"
+
This isn't directly related to Javascript though. It discusses how
+ASLR can be bypassed by finding the location of the page that holds
+the MMU cache hierarchy.
The article and the interesting related discussion.
+
+
+
Thoughts
+
+
+
Figure 3.3: On-disk layout of a typical UNIX file system. Figure is
+ not drawn to scale, and files may appear larger in your rear-view mirror
+ than they do in real life.
Ever wondered if binary files (git-lfs) wasn't enough?
+
+
+
Thoughts
+
+
+
I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Aloha (on an HN thread)
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my patreon page: https://www.patreon.com/venam.
alias disks='echo "╓───── m o u n t . p o i n t s"; echo "╙────────────────────────────────────── ─ ─ "; lsblk -a; echo ""; echo "╓───── d i s k . u s a g e"; echo "╙────────────────────────────────────── ─ ─ "; df -h;'
They have computers, and they may have other weapons of mass destruction.
+
+
+
+
+
On a side note, this newsletter should now go straight to your inbox
+and not be flagged as spam anymore. I've fixed some issues related to
+the domain name.
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my patreon page: https://www.patreon.com/venam.
The mlde project aims at creating blocks for an XDG/freedesktop
+compliant desktop environment. The sub-projects have the name of
+chemical elements, which is nice. It's still a WIP, so keep your eyes
+on the progresssion or contribute to it.
This person got dedication and is pushing his skills forward. If you've
+got some time pass by and say hi or even participate in the code reading
+session, I'll definitely try, on #openbsd-daily on the Freenode server.
Top is one of those commands I just can't remember the keybinds of. This
+week let's force ourselves to remember it. Also the newest version of
+top has some nice fancy bars and colors.
Don't worry, you don't have to know much about crypto to enjoy
+this. France has their own curve too: FRP256, and the next version of
+openssl has brainpool (openssl ecparam -list_curves).
A benchmark from 2003 comparing Solaris UFS and RHEL ext3. Both of those
+OS have switched their default filesystems today, so it's interesting
+to look at the past. Usually Phoronix is the place to go when it
+comes to benchmarking but they used their own suite which doesn't
+always give some insights about how to do benchmarks yourself. The
+article also teaches you some benchmarks tricks, which is neat.
What's up with that #! at the top of files? This is a highly recommended
+article. The exploit listed in part3 is still very usable but inside
+sudo check that second link to make sure (We shared a previous link
+in issue 20170311 related to this under the name "Bash is secure")
Memory allocation, heap, stack, local variables, alternatives to malloc,
+memory fragmentation, garbage collection. If those are the things you
+find interesting then be sure to checkout the links above.
I used to have a bit of difficulty memorizing what every one of the
+exec function did, now that I get the thing about environment variables,
+path, and variadic functions I totally get it.
Community members project highlight!
+It's cool to build your own hardware piece. Half has been working on one
+and I thought I would share. mort on the other side has been working on
+a new style of config to json.
"That's what it feels like when debugging your code."
+ - Suddenly sputtered someone
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
I showed that to someone and they said it was "lame".
+
+
Thoughts
+
+
+
"Someone that cannot respect another's journey hasn't traveled very
+ far himself."
+ - A random guy on youtube
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
This questionaire might help you choose the best "distro" for you. Now
+imagine if Google could do that with all the tracking information it
+has accumulated over the years!
I keep wondering at which point this was added in useradd but can't
+find any date, it's in POSIX. In older Unix accounts were created using
+passwd (http://man.cat-v.org/unix-6th/1/passwd) or by changing the
+/etc/passwd directly.
The hate of GUI on the side, this is really nifty.
+
+
Xero's Weekly Ricing Tips
+
+
it's a .vimrc file that makes you look like a ninja. it's the absolute
+minimal setup. no colors, no highlights, no messages, no status bar,
+nothing. just text.
I'm glad we can have those these days, excellent way for a 8-12yo to
+have fun and learn something along the way. It's fascinating that this
+generation of kids and beyond will learn programming just like learning
+to read and write. We'll see how it changes how people perceive life. The
+last link is about explorable explanation.
Solving today's problems with yesterday's technology, someday.
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
Yet another rant, a good one though a bit immature. I agree with most
+of the points he put forward. I guess the more you understand something
+the more you see its faults and the more you can expect the unexpected
+from it. That's still better than a black box.
Related to the previous video, it's funny when you look at the marketing
+aspect of Unix, the feud (Unix) wars and partnership between companies,
+some partnering with others you wouldn't guess. For example in the last
+video you had the Sun386i which ran DOS and UNIX on the same machine and
+using the OpenLook design by Sun partnering with AT&T plus some licensed
+technology from Xerox corporation. You also had the HP360 using the OSF
+Motif tech from both DEC, IBM, and HP. Then the Mac2cx by NextStep with
+the MAC user interface which was the cheapest of them all, unlike today's
+Apple product.
By the way: I was a mediocre writer whenI started out. Explaining
+technical concepts is hard. Coming up with good examples takes time, and
+explaining a diicult concept takes time. So it’s easiest to gloss over
+the hard stuf. I thought I was doing a pretty good job, until ater one
+of my posts got popular, a coworker came up to me and said, “I read
+your post and I still don’t understand this.” I still had a lot to
+learn about writing.
+
+
+
Aditya Y. Bhargava
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
"Chris Dixon captured this guerrilla pattern of the ongoing shift in
+political power with a succinct observation: what the smartest people
+do on the weekend is what everyone else will do during the week in
+ten years."
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
To continue with the horror stories, there are many arguments on the
+internet about Linux and it's purity as a Unix system. Some of those
+arguments are just to be discarded, others are serious. Like any criticism
+if it's not constructive you have to take it lightly.
All that is required is that it stays stable for the enterprise world by
+following the POSIX and Open Group standards. The EulerOS 2.0 and K-UX
+3.0, derived from Red-Hat prove that, even though they aren't derived
+from the original UNIX and under the hood have a different architecture.
To continue on with our series of links about JS and the web, here's
+one that's not about emulation but about running a shell in the
+browser. Last time I've heard of that it was about pwning websites
+through web-shells. The last link, the research paper, gives another
+interesting side to the story.
Programmers get pissed off a lot by useless semantics, etymologies,
+and epistemology. This is a fun way to put things back in
+perspective, which reminds me of the new-age bullshit generator
+(http://sebpearce.com/bullshit/)
Last week I mixed up two links.. https://vim-adventures.com/ and
+passweird, sorry 'bout that fellows. Vim adventure is a great and really
+addictive way to learn about vim. Though, it's only free until lvl3.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
So many minimal system, here are two new ones you can add to your list,
+and a link to pidsley from the linuxbbq community who always impresses
+us with his ricing. On a side note, Linuxbbq has a wonderful and thriving
+community.
I always find those kind of reverse hacking/(script kiddie ddos
+botnet) post interesting, even though his post is more or less
+of a bragging about the sysdig utility, which is not that bad
+(http://www.sysdig.org/wiki/sysdig-examples/), you can get it from your
+distro's repo.
This goes along well with the book we shared some weeks ago "The Craft
+of Text Editing" (https://www.finseth.com/craft/), I read only half of
+that book, it was too much indepth for me. However some readers might
+find value in this and so I'm sharing!
A play on word with how the internet of things is "secure".
+
+
Thoughts
+
+
Yeah, but people still use this stuff - Tony Lawrence
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
...and it's a dead link! But don't worry there are Firefox addons (Hey,
+you're getting away from Google so you're certainly not gonna start
+using Chrome) that can disable tracking such as beef taco, the builtin
+"opt out" mechanism in the settings, privacy badger, disconnect, or any
+EFF approved addon..
+
+
Thoughts
+
+
If you understand something, it is probably already obsolete - James Burke
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
This is a beautiful, extensive, and visual guide/book to writing
+manpages. Keep this bookmarked so that you can use it as a reference
+next time you need it.
Doug McIlroy recently released a paper, it discusses communication files,
+which were a not well known and complext IPC tech. He also mentions the
+directed shell: https://www.dmst.aueb.gr/dds/sw/dgsh/
A follow up on last week sharings about creativity, this website allows
+you to create dynamic directed graphs where you can explore the relation
+between the nodes live.
The phrack hacking magazine has been ongoing since 1985 and still uses
+the same ascii format for releases, which is perfect for us. Most of the
+articles are technical ones but you can find philosophical ones such as:
+http://phrack.org/issues/69/6.html#article
We all feel like newbies... and if you don't you're nuts!
+Peanuts peanuts peanuts.
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
I've shared this project during the podcast about window managers
+(https://nixers.net/showthread.php?tid=2048), I keep coming back to
+it and want the readers to at least give it a glance if they didn't
+already. A lot of the videos are dead but the concepts still live.
No, this isn't the matrix you know but it's related. The matrix protocol
+tries to create a ubiquitous standard for anonymous communication.
+
+
Thoughts
+
+
+
"What we see depends mainly on what we look for." - John Lubbock
+
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
Probably one of the best document I've read about "Explaining the whole of
+Unix in one shot", he even uses the prompt "GREENSCREEN". I can't emphases
+how good this page is. The author is a Google Engineer and has also
+written a beautiful window manager ahwm ( http://www.hioreanu.net/cs/ahwm/
+) which is especially well documented.
A story about digital data PTSD. we all cherish our data - so run your
+backups and think about having less ties with your machine. The author
+is a MacOS user so it'll only be relevant to the readers who are on
+this OS however I really like the description of the state of mind he
+got into which is the main reason I am sharing it.
To innovate you have to see beyond your closed field of study.
+
+
Thoughts
+
+
This is the issue number 13.
+
+
It is weird that we associate so much with numbers
+https://en.wikipedia.org/wiki/13_(number) some use it as a lucky number
+and others as an unlucky one. Many benign things are culture dependent.
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
Code of conducts, rules, FAQ, README_BEFORE_FREAKING_POSTING, so many
+documents writen to deter people from doing stupidities (or what that
+group considers stupidity). Why not cat | sort | uniq those and take
+the best? Would it amount to "Don't be a jackass"?
...And adding to this, before reaching the TTY the keybind has to pass by
+maybe some program, some terminal emulator plugins, and the shell. You
+can use the RFC as a reference for when you don't know what a control
+character is suppose to do. Use infocmp and script to debug those.
Davinci Resolve 12.5, a professional and proprietary software for video
+editing, was recently ported to CentOS 6.x (Yeah, only one specific
+distro). I'm not into video editing but as I've read the state of
+professional video editing softwares on Unix is not so good.
It really makes you think about how automated an free the world can
+become. From 1946 to today where we're dreaming of seasteading and
+modular houses built with 3d printers. What do you think?
+
+
Thoughts
+
+
Show me how you spend your day and I'll tell you what you care about.
Why complicate things? The software industry and programmers of today
+are looking for too much achievements, stacking the "green blocks"
+on GH, looking for confirmation of their existence, checking graphs
+and statistics about their "progress", wanting to raise on the "SSI",
+social selling index.
+
+
Let's slow down a bit! Small changes for a small group is more valuable
+than running against titans
+
+
If it is useful to someone and kind of serves the purpose then that is
+enough for a start.
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
I don't really know who this guy is but he's earned my respect. His
+resume is orgasmic http://icculus.org/resume and he even taught me how
+to make mushroom burgers http://chef.icculus.org/ ... who knows it might
+be Gordon Ramsey's relative.
Some times ago it wasn't as frequent to share your special dots
+and scripts. Those are the one of the author of "Beginning Perl" and
+"Advanced Perl Programming".
That thought alone can lead you to cognitive dissonance.
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
Again so many softwares doing the same thing, we need more comparative
+reviews/articles about them. I don't have any personal favorite, I
+would've liked to use terminal markdown viewer mdv but it doesn't
+seem to respect everything I'm looking for. Hopefully there are many
+in-browser markdown viewers.
I had never wondered about this topic before, are our current font
+dialogs designed in the most efficient manner? Now that the topic is
+brought to light I can't help but think of it everytime I choose a font
+in an application.
We're brainstorming on the topic of "digital focus/attention studies
+and tools, stuffs that are truly scientifically proven"
+https://titanpad.com/digital-focus-scientifically-proven-wiki
+If you have some thoughts on that they would be greatly appreciated,
+hop in and edit the public pad.
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
Firefox is undergoing a lot of changes lately. Are those changes
+influenced by competition, do you like what is happening, are the addons
+support left out of the plan? Whatever the case, it's still free software.
Talking about unstandard standards, here's our last one that has
+finally been christened (after so many years of being a lonely unamed
+orphan). Prepare your mimedb because you'll need to add text/markdown.
Looking for inspiration, here's a phenomenal website.
+
+
Thoughts
+
+
You can learn from anyone, you simply have to approach the situation
+with this intent and keep reminding yourself of this.
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
Identity
+http://www.moxytongue.com/2016/02/self-sovereign-identity.html
+http://www.lifewithalacrity.com/2016/04/the-path-to-self-soverereign-identity.html
+https://en.wikipedia.org/wiki/Digital_identity
+Those are deep discussions about the nature of online identity and
+identity in general.
+
Unix haters handbook
+http://www.mindspring.com/~blackhart
+Ever wanted to know about what the haters thought?
+
Digital Minimalism
+http://calnewport.com/blog/2017/01/28/on-value-and-digital-minimalism/
+Another article that takes the approach of value.
+
How to ask a question
+http://www.catb.org/~esr/faqs/smart-questions.html
+An extensive guide on how to ask a "smart" question in the most
+appropriate manner.
+
Frequently asked questions
+http://www.unix.com/answers-to-frequently-asked-questions/
+The unix.com frequently asked questions, most related to shell scripting.
+
A story about cron
+https://blog.notfoss.com/posts/a-tale-of-two-crons-or-how-cron-helped-me-spot-an-infection-on-a-server/
+I just love reading stories about real life scenarios.
+
Corporate Unix conference
+https://www.youtube.com/watch?v=gYtMWfyYWIU
+Thanks a-109-107 for reminding us that Corba used to be the standard
+corporations loved in 1993.
+
X11 Clipboard
+http://unix.stackexchange.com/questions/136229/copy-paste-does-not-always-work-from-firefox-to-terminal
+http://superuser.com/questions/68170/how-can-i-merge-the-gnome-clipboard-and-the-x-selection
+https://bbs.archlinux.org/viewtopic.php?id=144741
+Some info about the clipboard and as bonus an hilarious renaming of a
+clipboard manager by an Arch user.
+
One Thing Well
+http://onethingwell.org
+In the same fashion as the kmandla blog, this blog lists multiple
+softwares that do one thing well.
+
List of debug/analysis tools
+https://remnux.org/docs/distro/tools/
+Again a list of cool softwares used in the remnux distro, it's worth
+taking a look at.
+
+
+
Random
+
+
+
"the end of the internet
+http://hmpg.net
+That's it you've found it!
+
Wormholes
+https://fauux.neocities.org
+http://jodi.org
+http://0100101110101101.org/files/hell.com/
+Net art is amazing.
+
+
+
Thoughts
+
+
The last episode of the nixers podcast took me a huge amount of
+research unfortunately the audio recording didn't turn out as good as
+I wanted (I was too tired.) You can read the transcript on the forums:
+https://nixers.net/showthread.php?tid=2052&pid=17479#pid17479
+I've learned quite a lot of things during the preparation and you
+might too.
+
+
The thought of this week is: A community is a community because it's
+community driven. Share your knowledge and your time with others, you're
+running the show!
+
+
I love you guys.
+
+
Contribute
+
+
(Thanks to everyone who contributed with links.)
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
There are things we only learn when we have to face them.
+
+
Don't be stagnant.
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
We were discussing street riots and I pointed out how berserk they were
+and acted out fearing their annihilation. We'll that's exactly what
+berserker are about.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
When we copy we justify, when others copy we vilify.
+
+
+
What does it mean to have a copy-left license?
+What does open source mean?
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
Woah, this newsletter packs up a lot of content.
+You won't be able to consume it all but don't worry you have all of 2017
+to do so.
+
+
Let's make 2017 a dynamic year, full of projects, interactions, and new
+phenomenal people joining in.
+
+
Stay updated!
+
+
Contribute
+
+
There are many ways to contribute:
+
+
+
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC or any other services.
netdata only work on Linux and seems to be a memory hog but it's still
+interesting to look at what the next-gen ui look like (until we can
+afford to run them.)
A Harward teacher reference web page.
+http://www.in-ulm.de/~mascheck/
+And yet another university teacher reference page, this one follows the
+old Unix tilde homepage url formula, which reminds me of...
This website let's you send an email to your future self. I've tried
+it myself and it's surprising. With the new year arriving it might be a
+great way to tell your future self if you've achieved what you wanted to.
If you find anything interesting you can contact venam on the
+forums and that may be featured in the next newsletter.
+
Share it with your friends.
+
Share your point of view about the newsletter.
+
Open a thread on the forums to discuss one of the topics that has
+been brought by reading this newsletter.
+
If you want to help with the forums server fees you can send something
+to my (new) patreon page: https://www.patreon.com/venam or you can
+ask dcat how you can help with the IRC.
The university days of a student and how a simple event can impact a life.
+We all live in a world where traffic is thought to be a positive word, but traffic is looking at a car accident an forgetting the next second.
+What about less people and more value.
A section of a book, "Code Quality: The Open Source Perspective", analyzing the
+source code of the banner program. banner was the predecessor to figlet.
+It's interesting how the characters were printed.
+You can find the source code here: https://packages.debian.org/stable/sysvbanner
+It's very small, and it uses one character variables.
This is an unfamous tool that has history engrained in TCL.
+However it can still be useful to script command line programs that only
+have an interpreter like interface and nothing else.
Two of our community members, pranomostro and z3bra, are working on
+a secure messaging application built on top of tox core.
+Read the manpage, and give it a try by send a request to the id
+AA72C255E14A6214E0E368F5882A6B7CF235F8F3CCE0321EDBFBC5F2C065E3173337CFD9B594
We've discussed input devices on Unix during a previous podcast episode,
+found here https://nixers.net/showthread.php?tid=1970 and this blog post
+is a great way to exercise your knowledge.
Setting up 2FA using another hardware device you plug in, a USB,
+a yubikey, or anything else, is an interesting concept. Here are
+some links about the procedure for usb and yubikeys.
+
nixers holiday colly (by xero) DONT OPEN TILL XMAS!
+DONT OPEN TILL XMAS!
+http://0w.nz/nixmas
A wargame setup by SANS, interesting for those who like those kinds
+of challenges.
+
+
+
Thoughts
+
+
It's starting to get cold outside, keeping a Unix machine next to you
+and running :(){ :|:& };: is a great way to stay warm.
+
+]]>
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_nixos.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_nixos.xml
new file mode 100644
index 000000000..c4d59b36e
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_nixos.xml
@@ -0,0 +1,898 @@
+
+NixOS Newshttps://nixos.orgNews for NixOS, the purely functional Linux distribution.NixOShttps://nixos.org/logo/nixos-logo-only-hires.pnghttps://nixos.org/
+ NixOS 18.09 released
+https://nixos.org/news.html
+
+
+
+ NixOS 18.09 “Jellyfish” has been released, the tenth stable release branch.
+ See the release notes
+ for details. You can get NixOS 18.09 ISOs and VirtualBox appliances
+ from the download page.
+ For information on how to upgrade from older release branches
+ to 18.09, check out the
+ manual section on upgrading.
+Sat Oct 06 2018 00:00:00 GMT
+ Fastly supports NixOS
+https://nixos.org/news.html
+ We are happy to announce that we have moved our binary cache to Fastly. Fastly
+ is a big supporter of open source projects and now NixOS is one of them! Fastly provides us with CDN capability,
+ which previously was running on AWS CloudFront. Big thanks go to Fastly, in particular Tom Denniston and Elaine
+ Greenberg, our friends at Infor and Packet.net
+ and Graham Christensen for making this possible.
+Thu Oct 04 2018 00:00:00 GMT
+ Nix 2.1 released
+https://nixos.org/news.html
+ Nix 2.1
+ has been released. See the release
+ notes for a list of changes and new features.
+Sun Sep 02 2018 00:00:00 GMT
+ NixOS Discourse forum
+https://nixos.org/news.html
+ The nix-devel mailing list is now replaced by our discourse forum instance which is also usable by email:
+ discourse.nixos.org.
+Tue Aug 14 2018 00:00:00 GMT
+ NixCon 2018
+https://nixos.org/news.html
+ We're happy to announce that NixCon 2018, the
+ third Nix Conference, will take place October 25-27 2018 in London
+ For more information, see the
+ NixCon 2018 website.
+ And please consider
+ submitting a talk!
+Mon May 21 2018 00:00:00 GMT
+ NixOS 18.03 released
+https://nixos.org/news.html
+
+
+
+ NixOS 18.03 “Impala” has been released, the ninth stable release branch.
+ See the release notes
+ for details. You can get NixOS 18.03 ISOs and VirtualBox appliances
+ from the download page.
+ For information on how to upgrade from older release branches
+ to 18.03, check out the
+ manual section on upgrading.
+Wed Apr 04 2018 00:00:00 GMT
+ Nix 2.0 released
+https://nixos.org/news.html
+ Nix 2.0
+ has been released. See the release
+ notes for a list of changes and new features.
+Thu Feb 22 2018 00:00:00 GMT
+ NixOS 17.09 released
+https://nixos.org/news.html
+ NixOS 17.09 “Hummingbird” has been released, the eigth stable release
+ branch. See the release notes
+ for details. You can get NixOS 17.09 ISOs and VirtualBox
+ appliances from the download
+ page. For information on how to upgrade from older release
+ branches to 17.09, check out the manual section on
+ upgrading.
+Mon Oct 02 2017 00:00:00 GMT
+ Nix-dev mailing list moved
+https://nixos.org/news.html
+ The nix-dev mailing list has moved to
+ nix-devel
+ on Google Groups.
+Wed Jul 12 2017 00:00:00 GMT
+ NixCon 2017
+https://nixos.org/news.html
+ We're happy to announce that NixCon 2017, the
+ second Nix Conference, will take place October 28–31 2017 in Munich
+ For more information, see the
+ NixCon 2017 website.
+ And please consider
+ submitting a talk!
+Sun Jun 18 2017 00:00:00 GMT
+ NixOS 17.03 released
+https://nixos.org/news.html
+ NixOS 17.03 “Gorilla” has been released, the seventh stable release
+ branch. See the release notes
+ for details. You can get NixOS 17.03 ISOs and VirtualBox
+ appliances from the download
+ page. For information on how to upgrade from older release
+ branches to 17.03, check out the manual section on
+ upgrading.
+Fri Mar 31 2017 00:00:00 GMT
+ NixOS 16.09 released
+https://nixos.org/news.html
+ NixOS 16.09 “Flounder” has been released, the sixth stable release
+ branch. See the release notes
+ for details. You can get NixOS 16.09 ISOs and VirtualBox
+ appliances from the download
+ page. For information on how to upgrade from older release
+ branches to 16.09, check out the manual section on
+ upgrading.
+Mon Oct 03 2016 00:00:00 GMT
+ NixOps 1.4 released
+https://nixos.org/news.html
+ NixOps
+ 1.4 has been released. This release contains contains many
+ nice new features. See the manual
+ for details.
+Wed Jul 20 2016 00:00:00 GMT
+ NixOS 16.03 released
+https://nixos.org/news.html
+ NixOS 16.03 “Emu” has been released, the fifth stable release
+ branch. See the release notes
+ for details. You can get NixOS 16.03 ISOs and VirtualBox
+ appliances from the download
+ page. For information on how to upgrade from older release
+ branches to 16.03, check out the manual section on
+ upgrading.
+Sun May 01 2016 00:00:00 GMT
+ Nix 1.11 released
+https://nixos.org/news.html
+ Nix 1.11
+ has been released. See the release
+ notes for a list of changes and new features.
+Fri Feb 19 2016 00:00:00 GMT
+ NixOS 15.09 released
+https://nixos.org/news.html
+ NixOS 15.09 “Dingo” has been released, the fourth stable release
+ branch. See the release notes
+ for details. You can get NixOS 15.09 ISOs and VirtualBox
+ appliances from the download
+ page. For information on how to upgrade from older release
+ branches to 15.09, check out the manual section on
+ upgrading.
+Fri Oct 30 2015 00:00:00 GMT
+ Nix 1.10 released
+https://nixos.org/news.html
+ Nix 1.10
+ has been released. See the release
+ notes for a list of changes and new features.
+Sat Oct 03 2015 00:00:00 GMT
+ NixCon 2015
+https://nixos.org/news.html
+
+ We're happy to announce that NixCon 2015, the
+ first Nix Conference, will take place on November
+ 14—15th 2015 in Berlin. For more information, see the
+ NixCon website. And please
+ consider submitting a
+ talk!
+Thu Sep 03 2015 00:00:00 GMT
+ NixOS Foundation
+https://nixos.org/news.html
+ The NixOS Foundation
+ was started to improve our ability to maintain and extend the infrastructure
+ used by the Nix related projects. If you would like to support us, please go
+ here and donate some money!
+Sun Aug 09 2015 00:00:00 GMT
+ Nix 1.9 released
+https://nixos.org/news.html
+ Nix 1.9
+ has been released. See the release
+ notes for a list of changes and new features.
+Sun Jul 12 2015 00:00:00 GMT
+ NixOS 14.12 released
+https://nixos.org/news.html
+ NixOS 14.12 “Caterpillar” has been released, the third stable
+ release branch. It brings Linux 3.14, systemd 217, Glibc 2.20,
+ KDE 4.14.1, and much more. See the release notes
+ for details. You can get NixOS 14.12 ISOs and VirtualBox
+ appliances from the download
+ page. For information on how to upgrade from older release
+ branches to 14.12, check out the manual section on
+ upgrading.
+Fri Jan 30 2015 00:00:00 GMT
+ Nix 1.8 released
+https://nixos.org/news.html
+ Nix 1.8
+ has been released. See the release
+ notes for a list of changes and new features.
+Wed Jan 14 2015 00:00:00 GMT
+ NixOS sprint in Ljubljana
+https://nixos.org/news.html
+ We’re having a NixOS sprint at the Kiberpipa hackerspace
+ in Ljubljana, Slovenia, on August
+ 23—27. Joining is free! For more information and to
+ register, please go to the sprint
+ page.
+Sat Aug 30 2014 00:00:00 GMT
+ NixOS 14.04 released
+https://nixos.org/news.html
+ NixOS 14.04 “Baboon” has been released, the second stable
+ release branch. It brings Linux 3.12, systemd 212, GCC 4.8,
+ Glibc 2.19, KDE 4.12, light-weight NixOS containers, and much
+ more. See the release
+ notes for details. You can get NixOS 14.04 ISOs and
+ VirtualBox appliances from the download page. For information on
+ how to upgrade a 13.10 system to 14.04, check out the manual
+ section on upgrading.
+Fri May 30 2014 00:00:00 GMT
+ NixOps 1.2 released
+https://nixos.org/news.html
+ NixOps
+ 1.2 has been released. This release contains contains many nice new features. See the manual
+ for details.
+Fri May 30 2014 00:00:00 GMT
+ Nix 1.7 released
+https://nixos.org/news.html
+ Nix 1.7
+ has been released. See the release
+ notes for a list of new features.
+Sun May 11 2014 00:00:00 GMT
+ Heartbleed vulnerability in OpenSSL
+https://nixos.org/news.html
+ A serious security
+ vulnerability has been discovered in OpenSSL. All stable
+ NixOS releases prior to version
+ 13.10.35708.15a465c are vulnerable. (You can
+ see your current version by running nixos-version.) To
+ upgrade to the latest NixOS version, run nixos-rebuild
+ switch --upgrade. You can verify whether you are safe by
+ running
+
+
+
+ If this shows any OpenSSL version prior to 1.0.1g, you may be
+ vulnerable.
+Fri May 09 2014 00:00:00 GMT
+ FOSDEM talks
+https://nixos.org/news.html
+ Domen Kožar gave a
+ talk at FOSDEM about NixOS (video).
+ Also, Ludovic Courtès gave a talk on
+ Guix, the Nix- and Guile-based package manager.
+Sun Mar 02 2014 00:00:00 GMT
+ Stdenv updates branch merged into master
+https://nixos.org/news.html
+ The stdenv-updates branch has
+ been merged into the master branch of Nixpkgs. The main
+ change are that brings is that Nixpkgs/NixOS are now based on
+ GCC 4.8 and Glibc 2.18, in addition to many smaller updates.
+Fri Feb 21 2014 00:00:00 GMT
+ NixOS 13.10 released
+https://nixos.org/news.html
+ We have released NixOS 13.10, the first stable branch of NixOS.
+ Its goal is to provide a safe branch for production environments
+ that need bug fixes and security updates, but not the
+ potentially destabilising changes that sometimes occur on the
+ unstable branch. You can get NixOS 13.10 ISOs and VirtualBox
+ appliances from the download
+ page. See the announcement
+ for more information. For information on how to switch an
+ existing NixOS machine from the unstable channel to 13.10, check
+ out the manual
+ section on upgrading.
+Sun Dec 01 2013 00:00:00 GMT
+ Nix 1.6.1 released
+https://nixos.org/news.html
+ Nix
+ 1.6.1 has been released. This is primarily a bug fix
+ release but has some minor new features. See the release
+ notes for details.
+Thu Nov 28 2013 00:00:00 GMT
+ NixOS sources merged into Nixpkgs
+https://nixos.org/news.html
+ The NixOS Git tree has been merged into the Nixpkgs tree in
+ order to simplify development. The sources now live in the nixos
+ subdirectory of the Nixpkgs repository on GitHub. See the
+ announcement
+ for more information.
+Sun Nov 10 2013 00:00:00 GMT
+ NixOps 1.1.1 released
+https://nixos.org/news.html
+ NixOps
+ 1.1.1 has been released. This release consists mostly of minor bugfixes. See the manual
+ for details.
+Sat Nov 02 2013 00:00:00 GMT
+ Nix 1.6 released
+https://nixos.org/news.html
+ Nix 1.6
+ has been released. See the release
+ notes for details.
+Thu Oct 10 2013 00:00:00 GMT
+ NixOps 1.1 released
+https://nixos.org/news.html
+ NixOps
+ 1.1 has been released. This release brings a backend for Hetzner,
+ a German data center provider, support for EC2 spot instances and some
+ minor bugfixes. See the manual
+ for details.
+Wed Oct 09 2013 00:00:00 GMT
+ NixOS sprint in Slovenia
+https://nixos.org/news.html
+ A sprint focused on NixOS and Kotti will be held 22-26
+ July 2013 in Lokve, Slovenia. It is organised by Termitnjak and sponsored
+ by LogicBlox.
+Thu Aug 15 2013 00:00:00 GMT
+ NixOps 1.0.1 released
+https://nixos.org/news.html
+ NixOps
+ 1.0.1 has been released, a minor bug fix release. See the manual
+ for details.
+Sun Aug 11 2013 00:00:00 GMT
+ NixOS presentation at EuroPython
+https://nixos.org/news.html
+ Domen Kožar gave a presentation at EuroPython
+ 2013: “NixOS
+ Operating System: Declarative Configuration Distribution”.
+Mon Aug 05 2013 00:00:00 GMT
+ NixOps 1.0 released
+https://nixos.org/news.html
+ NixOps
+ 1.0 has been released, the inaugural release of the NixOS
+ cloud deployment tool. See the announcement
+ and the manual
+ for details.
+Thu Jul 25 2013 00:00:00 GMT
+ Nix 1.5.3 released
+https://nixos.org/news.html
+ Nix 1.5.3
+ has been released. This is primarily a bug fix release. See the release
+ notes for details.
+Wed Jul 17 2013 00:00:00 GMT
+ PhD thesis: A Reference Architecture for Distributed Software Deployment
+https://nixos.org/news.html
+ Today Sander van
+ der Burg successfully defended his PhD thesis entitled A
+ Reference Architecture for Distributed Software
+ Deployment! It describes (among other things) Disnix, a system for
+ deployment of service-oriented architectures.
+Wed Jul 03 2013 00:00:00 GMT
+ Nix 1.5.2 released
+https://nixos.org/news.html
+ Nix 1.5.2
+ has been released. This is a bug fix release.
+Thu Jun 13 2013 00:00:00 GMT
+ Nix 1.5.1 released
+https://nixos.org/news.html
+ Nix 1.5.1
+ has been released. It fixes a regression introduced in Nix 1.4. See the release
+ notes for details.
+Thu Mar 28 2013 00:00:00 GMT
+ Nix 1.4 released
+https://nixos.org/news.html
+ Nix 1.4
+ has been released. This is primarily a bug fix release that
+ addresses a security problem in multi-user mode. See the release
+ notes for details. For installation information, see the manual.
+Tue Mar 26 2013 00:00:00 GMT
+ NixOS switched to systemd
+https://nixos.org/news.html
+ NixOS has switched from Upstart to systemd!
+ Systemd brings many advantages such as better dependency
+ management, socket-based activation of services, per-service
+ logging, cgroup-based process management, and much more. (Read
+ the announcement.)
+Thu Feb 21 2013 00:00:00 GMT
+ Nix 1.3 released
+https://nixos.org/news.html
+ Nix 1.3
+ has been released. This is primarily a bug fix release. See
+ the release
+ notes for details. For installation information, see the manual.
+Tue Feb 05 2013 00:00:00 GMT
+ Nix 1.2 released
+https://nixos.org/news.html
+ Nix 1.2
+ has been released. See the release
+ notes for details. For installation information, see the manual.
+Sun Jan 06 2013 00:00:00 GMT
+ Nix 1.1 released
+https://nixos.org/news.html
+ Nix 1.1
+ has been released. See the release
+ notes for details. For installation information, see the manual.
+Sat Aug 18 2012 00:00:00 GMT
+ Binary Nix tarballs available
+https://nixos.org/news.html
+ Our continuous build system, Hydra, now produces binary
+ tarball distributions of Nix for Mac OS X (Darwin), FreeBSD
+ and Linux. The tarballs contain all dependencies of Nix, making
+ it a lot easier to install Nix on those platforms. To install,
+ download a binary tarball, unpack it in the root directory, then
+ run nix-finish-install. See the manual
+ for more information.
+Sun Jun 24 2012 00:00:00 GMT
+ Nix 1.0 released
+https://nixos.org/news.html
+ After almost two years of development, Nix 1.0
+ has been released. See the release
+ notes for an overview of the most important improvements.
+ For installation information, see the manual.
+Mon Jun 11 2012 00:00:00 GMTPatchELF 0.6 releasedhttps://nixos.org/news.html
+ PatchELF
+ 0.6 has been released. Apart from some bug fixes, it adds
+ support for executables produced by the Gold linker. See the README
+ for details.
+Wed Dec 07 2011 00:00:00 GMTHydra talk at Inriahttps://nixos.org/news.html
+
+
+
+ Ludovic Courtès gave a talk on Hydra at Inria (which has
+ its own Hydra instance for building Inria software) entitled “Hydra:
+ continuous integration for demanding people”.
+Sat Dec 03 2011 00:00:00 GMTMoving to GitHubhttps://nixos.org/news.html
+ The NixOS project is (slowly) migrating from Subversion to Git!
+ The master repositories will be hosted in the NixOS organization on GitHub. For the moment, just a
+ few subprojects have been migrated, such as Hydra and Charon. Thanks to
+ Tianyi Cui for donating the NixOS GitHub organization.
+Mon Nov 28 2011 00:00:00 GMT
+ Nix-dev mailing list moved
+https://nixos.org/news.html
+ The nix-dev mailing list has moved. The address is now
+ nix-dev@lists.science.uu.nl (web
+ interface).
+Fri Oct 14 2011 00:00:00 GMT
+ FOSDEM talk about NixOS
+https://nixos.org/news.html
+
+ Sander van der
+ Burg gave a talk about NixOS at the CrossDistro
+ track of FOSDEM (video, slides).
+Sat Mar 05 2011 00:00:00 GMT
+ ISSRE paper on NixOS-based system testing
+https://nixos.org/news.html
+ The paper “Automating System
+ Tests Using Declarative Virtual Machines” (by Sander van der
+ Burg and Eelco Dolstra) has been accepted for presentation at
+ the 21st IEEE International
+ Symposium on Software Reliability Engineering (ISSRE 2010).
+ It describes how system tests with complex requirements on the
+ environment (such as remote machines, network topologies, system
+ services or root privileges) can be written succinctly using declarative
+ specifications of the machines needed by the test
+ environment. From these specifications we can automatically
+ instantiate (networks of) virtual machines. This is what we use
+ for automated
+ regression testing of NixOS itself. A draft
+ of the paper is available.
+Sat Sep 18 2010 00:00:00 GMT
+ Xfce in NixOS
+https://nixos.org/news.html
+
+ NixOS now supports Xfce, a
+ modern, light-weight desktop environment. It can be enabled by
+ setting the NixOS configuration value
+ services.xserver.desktopManager.xfce.enable to
+ true. (Screenshot)
+Sat Sep 18 2010 00:00:00 GMT
+ Nix 0.16 released
+https://nixos.org/news.html
+ Nix
+ 0.16 has been released, featuring a much faster evaluator
+ and support for configurable parallelism inside builders. See
+ the release
+ notes for details. For installation information, see the manual.
+Fri Sep 17 2010 00:00:00 GMT
+ NixOS talk at LSM
+https://nixos.org/news.html
+ Ludovic Courtès gave a talk about Nix and NixOS at the Libre Software Meeting
+ in Bordeaux, entitled “NixOS:
+ The Only Functional GNU/Linux Distribution” (slides).
+Mon Aug 09 2010 00:00:00 GMT
+ Nix 0.15 released
+https://nixos.org/news.html
+ Nix
+ 0.15 has been released. This is a bug fix release. See the
+ release
+ notes for details. For installation information, see the manual.
+Sat Apr 17 2010 00:00:00 GMT
+ Nix 0.14 released
+https://nixos.org/news.html
+ Nix
+ 0.14 has been released. This is primarily a bug fix
+ release. See the release
+ notes for details. For installation information, see the manual.
+Thu Mar 04 2010 00:00:00 GMT
+ Nix logo
+https://nixos.org/news.html
+
+ Long overdue, the Nix project finally has a logo!
+ The logo was originally created by Simon Frankau for the Haskell
+ logo competition, who kindly gave us permission to use it
+ for the Nix project. (The snowflake motif is even more
+ appropriate for Nix, because nix is Latin for
+ snow.) Any further modifications are entirely our
+ fault.
+Fri Dec 25 2009 00:00:00 GMT
+ Nix 0.13 released
+https://nixos.org/news.html
+ Nix
+ 0.13 has been released. This is mostly a bug fix release,
+ although it also adds some new language features. See the release
+ notes for details. For installation information, see the manual.
+Sat Dec 05 2009 00:00:00 GMT
+ LWN.net article on NixOS
+https://nixos.org/news.html
+ LWN.net has an article about NixOS
+ written by Koen Vervloesem.
+Sun Jul 26 2009 00:00:00 GMT
+ Nixpkgs 0.12 released
+https://nixos.org/news.html
+ Nixpkgs
+ 0.12 has been released. See the release
+ notes for details. Meanwhile, the Nixpkgs trunk has been
+ updated
+ to GCC 4.3.3, Glibc 2.9 and X.org 7.4.
+Sun May 24 2009 00:00:00 GMT
+ OpenOffice.org 3 in Nixpkgs
+https://nixos.org/news.html
+
+
+ Lluís Batlle has updated OpenOffice.org in Nixpkgs to 3.0.1
+ (screenshot).
+Thu May 21 2009 00:00:00 GMT
+ KDE 4.2 in Nixpkgs/NixOS
+https://nixos.org/news.html
+
+
+ We now have a fairly complete set of KDE 4.2 packages in Nixpkgs
+ and NixOS. Previously we had KDE 3.5, but it was rather
+ incomplete: just kdelibs and kdebase.
+ Now we have all that desktop
+ goodness, such as kdemultimedia,
+ kdenetwork and kdegames. You can
+ enable KDE 4 in NixOS by setting the
+ services.xserver.sessionType option to
+ kde4. Thanks go to Yury G. Kudryashov, Andrew
+ Morsillo and Sander van der Burg for doing the hard work on
+ adding KDE 4 to Nixpkgs. (Screenshot 1,
+ screenshot
+ 2.)
+Thu May 07 2009 00:00:00 GMT
+ Hydra
+https://nixos.org/news.html
+
+
+
+ Nix
+ and NixOS
+ releases are now built in Hydra, the new Nix-based
+ continuous build system. Hydra replaces our old Nix-based
+ build farm, which will be phased out soon. There are
+ several advantages over the old build farm: the build tasks for
+ a project are scheduled and published separately, so that for
+ instance a (fast) tarball build doesn’t have to wait for a
+ (slow) Cygwin build; build results are stored in a database,
+ which will enable all sorts of interesting queries; better error
+ reporting; a better web interface; and much more. We have
+ written a draft
+ paper about Hydra. There are some instructions
+ available about how to set up your own Hydra server.
+Thu Feb 05 2009 00:00:00 GMT
+ Linux.com article about Nix
+https://nixos.org/news.html
+ There is an article on Linux.com about Nix: “Nix fixes dependency
+ hell on all Linux distributions”.
+Thu Jan 22 2009 00:00:00 GMT
+ Nix 0.12 released
+https://nixos.org/news.html
+ Nix
+ 0.12 has been released. The most important change is that
+ Nix no longer needs Berkeley DB to store metadata, but there are
+ many other improvements. See the release
+ notes for details.
+Sun Dec 21 2008 00:00:00 GMT
+ DisNix paper accepted at HotSWUp
+https://nixos.org/news.html
+
+ The paper “Atomic Upgrading of Distributed Systems” (by Sander
+ van der Burg, Eelco Dolstra and Merijn de Jonge) has been
+ accepted for presentation at the First ACM Workshop on Hot
+ Topics in Software Upgrades (HotSWUp). A draft
+ of the paper is available. It describes Sander’s master’s
+ thesis research on DisNix, an extension to Nix that allows
+ deployment and upgrading of distributed systems from a single
+ declarative description. We will continue this research in
+ the Jacquard PDS
+ project, which has now started. (We still have an opening
+ for a PhD student or a postdoc; please contact us if you’re
+ interested.)
+
+Thu Oct 09 2008 00:00:00 GMT
+ NixOS paper accepted at ICFP!
+https://nixos.org/news.html
+
+ The paper “NixOS: A Purely Functional Linux Distribution” (by
+ Eelco Dolstra and Andres Löh) has been accepted
+ for presentation at the 2008
+ International Conference on Functional Programming (ICFP).
+ It describes NixOS in much greater detail than last year’s
+ HotOS paper, and argues why the purely functional style and
+ features such as laziness are important for system
+ configuration management. It also provides some measurements
+ on the actual purity of Nix build actions. A draft
+ of the paper is available.
+
+Wed Jul 16 2008 00:00:00 GMT
+ Website back up
+https://nixos.org/news.html
+
+ The Nix website was down for a few days due to cooling
+ problems in the server room causing the machine to overheat.
+ These should be resolved now. Apologies for the
+ inconvenience.
+
+Fri Jun 06 2008 00:00:00 GMT
+ Website / SVN repositories moved
+https://nixos.org/news.html
+
+Mon May 05 2008 00:00:00 GMT
+ Jacquard grant proposal accepted!
+https://nixos.org/news.html
+
+
+ The Jacquard program of
+ NWO and EZ has granted funding for the Nix-related project “Pull
+ Deployment of Services” (PDS), which is about improving the
+ deployment of software and services in complex heterogenous
+ environments. The grant consists of 368 K€ for a PhD student (4
+ years) and a postdoc (3 years). If you’re interested in these
+ positions, please have a look at this page,
+ and don’t hesitate to contact Eelco
+ Visser or Eelco Dolstra.
+
+
+Fri Mar 14 2008 00:00:00 GMT
+ New NixOS ISOs
+https://nixos.org/news.html
+
+
+
+
+ New NixOS installation CD images for i686 and
+ x86_64 are available,
+ which is a good thing as the previous ones were already a few
+ months old. The new images are Nix 0.11-based, contain Memtest86+ as a
+ convenience, should support more SATA drives, and show online
+ help (the NixOS
+ manual) on virtual console 7.
+
+
+Wed Feb 06 2008 00:00:00 GMT
+ Nix 0.11 released
+https://nixos.org/news.html
+ Nix
+ 0.11 has been released. This is a major new release
+ representing over a year of development. The most important
+ improvement is secure multi-user support. It also features many
+ usability enhancements and language extensions, many of them
+ prompted by NixOS, the purely functional Linux distribution
+ based on Nix. See the release
+ notes for details.
+Thu Jan 31 2008 00:00:00 GMT
+ Nixpkgs 0.11 released
+https://nixos.org/news.html
+ Nixpkgs
+ 0.11 has been released. See the release
+ notes for details.
+Fri Oct 12 2007 00:00:00 GMT
+ OpenOffice in Nixpkgs
+https://nixos.org/news.html
+
+
+
+
+ OpenOffice is now in
+ Nixpkgs (screenshot of
+ OpenOffice 2.2.1 running under NixOS, and another
+ screenshot). Despite being a rather gigantic package (it
+ takes two hours to compile on an Intel Core 2 6700), OpenOffice
+ had only two “impurities” (references to paths outside of the
+ Nix store) in its build
+ process that had to be resolved — a reference to
+ /bin/bash and one to /usr/lib/libjpeg.so.
+
+
Armijn Hemel, Wouter den
+ Breejen and Eelco Dolstra contributed to the Nix expression for
+ OpenOffice.
+
+
+
+ Wine now runs on NixOS!
+ Finally we can run all those legacy
+ applications... Thanks to Michael Raskin for adding Wine
+ and a NPTL-enabled Glibc (which Wine seems to need). This is a
+ nice application of purely functional package composition, by
+ the way: Wine didn’t work with the standard Glibc in Nixpkgs, so
+ we just pass
+ it another Glibc at build time.
+
+
In other news, Nix 0.11
+ and Nixpkgs 0.11 will be released soon.
+ There is now a mailing
+ list (nix-commits@cs.uu.nl) that you can
+ subscribe to if you want to receive automatic commit
+ notifications from the Nix Subversion repository.
+
+Fri Sep 14 2007 00:00:00 GMT
+ HotOS paper on NixOS
+https://nixos.org/news.html
+
+
+
+
+ We now have KDE running on
+ NixOS (obligatory
+ screenshot). Just kdebase for now (Martin
+ Bravenboer already added kdelibs a long time ago so
+ that we could run the wonderful KCachegrind),
+ but it contains all the important stuff (Konqueror, KDesktop,
+ Kicker, Konsole, Control Center, etc.).
+
+
In related news, we can
+ safely say that, rumours to the contrary notwithstanding, NixOS
+ is not an April
+ Fools’ Joke.
+
+Wed May 02 2007 00:00:00 GMT
+ NixOS progress report
+https://nixos.org/news.html
+
+
+ NixOS is now almost usable as a desktop OS ;-). We
+ have an X server, a bunch of Gnome packages, basic wireless
+ support, and of course all the applications in Nixpkgs that we
+ had all along running on other Linux distributions. Here are a
+ few screenshots:
+
+Thu Apr 05 2007 00:00:00 GMT
+ NixOS manual
+https://nixos.org/news.html
+ There is now some basic
+ documentation for NixOS.
+Mon Mar 19 2007 00:00:00 GMT
+ NixOS for x86_64
+https://nixos.org/news.html
+ NixOS now works on x86_64 machines. A 64-bit ISO is available.
+Fri Feb 23 2007 00:00:00 GMT
+ New build farm hardware at TUD
+https://nixos.org/news.html
+
To quote Eelco Visser: new
+ hardware for buildfarm at Delft University of Technology has
+ arrived.
+
+
Here’s what we have: 5 Intel Core 2 Duo DualCore machines
+ with 1GB RAM, 2 Mac minis with 1,83-GHz Intel Core
+ Duo-processor, another Core 2 Duo a UPS to deal with spikes in
+ power supply, a console with integrated monitor and keyboard
+ switches, a rack with room for a couple more machines.
+
+
Here’s what we’re going to do with the goodies. The five
+ Intel machines and the two MacMinis (also Intel) are going to
+ be used to crank at building hundreds of software
+ packages. Using virtualisation we should be able to run builds
+ on multiple operating system distributions. Read
+ more…
+Fri Feb 23 2007 00:00:00 GMT
+ Nixpkgs 0.10 released
+https://nixos.org/news.html
+ Nixpkgs
+ 0.10 has been released. See the release
+ notes for details.
+Sun Nov 12 2006 00:00:00 GMT
+ Nix 0.10.1 released
+https://nixos.org/news.html
+ Nix
+ 0.10.1 has been released. It fixes two obscure bugs that
+ shouldn’t affect most users.
+Sat Nov 11 2006 00:00:00 GMT
+ Nix 0.10 released
+https://nixos.org/news.html
+ Nix
+ 0.10 has been released. This release has many
+ improvements and bug fixes; see the release
+ notes for details.
+Mon Nov 06 2006 00:00:00 GMT
+ Nixpkgs 0.9 released
+https://nixos.org/news.html
+ Nixpkgs
+ 0.9 has been released.
+Fri Mar 03 2006 00:00:00 GMT
+ PhD thesis defended
+https://nixos.org/news.html
+ Eelco Dolstra
+ defended his PhD
+ thesis on the purely functional deployment model.
+Sat Feb 18 2006 00:00:00 GMT
+ Nix 0.9.2 released
+https://nixos.org/news.html
+ Nix
+ 0.9.2 has been released released. This is a bug fix
+ release that addresses some problems on Mac OS X.
+Fri Oct 21 2005 00:00:00 GMT
+ Nix 0.9 released
+https://nixos.org/news.html
+ Nix 0.9
+ has been released. This is a new major release that provides
+ quite a few performance improvements and bug fixes, as well as a
+ number of new features. Read the release
+ notes for details.
+Sun Oct 16 2005 00:00:00 GMT
+ Secure sharing paper accepted for ASE 2005
+https://nixos.org/news.html
+ The paper “Secure Sharing Between Untrusted Users in a
+ Transparent Source/Binary Deployment Model” has been accepted at
+ ASE 2005. This
+ paper describes how a Nix store can be securely shared by
+ multiple users who may not trust each other; i.e., how do we
+ prevent one user from installing a Trojan horse that is
+ subsequently executed by some other user?
+Sun Aug 28 2005 00:00:00 GMT
+ Service deployment paper accepted for SCM-12
+https://nixos.org/news.html
+ The paper “Service Configuration Management” (accepted at the
+ 12th
+ International Workshop on Software Configuration
+ Management) describes how we can rather easily deploy
+ “services” (e.g., complete webserver configurations such as our
+ Subversion server) through
+ Nix by treating the non-component parts (such as configuration
+ files, control scripts and static data) as components that are
+ built by Nix expressions. The result is that all advantages
+ that Nix offers to software deployment also extend to service
+ deployment, such as the ability to easily have multiple
+ configuration side by side, to roll back configurations, and to
+ identify the precise dependencies of a configuration.
+Mon Aug 22 2005 00:00:00 GMT
+ Patching paper accepted for CBSE 2005
+https://nixos.org/news.html
+ The paper “Efficient Upgrading in a Purely Functional Component
+ Deployment Model” has been accepted at CBSE 2005.
+ It describes how we can deploy updates to Nix packages
+ efficiently, even if “fundamental” packages like Glibc are
+ updated (which cause a rebuild of all dependent packages), by
+ deploying binary patches between components in the Nix store.
+ Includes techniques such as patch chaining and computing deltas
+ between archive files.
+Thu Mar 17 2005 00:00:00 GMT
+ Paper “Imposing a Memory Management Discipline on Software
+ Deployment” accepted for presentation at ICSE 2004!
+https://nixos.org/news.html
+ The first Nix paper.
+Fri Jan 16 2004 00:00:00 GMT
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_peertube.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_peertube.xml
new file mode 100644
index 000000000..6053a07be
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_peertube.xml
@@ -0,0 +1,656 @@
+
+
+
+ Framasoft
+ https://framatube.org
+
+ Wed, 20 Nov 2019 20:40:20 GMT
+ http://blogs.law.harvard.edu/tech/rss
+ Toraifōsu
+
+ Framasoft
+ https://framatube.org/client/assets/images/icons/icon-96x96.png
+ https://framatube.org
+
+ All rights reserved, unless otherwise specified in the terms specified at https://framatube.org/about and potential licenses granted by each content's rightholder.
+
+
+
+ https://framatube.org/videos/watch/ed5c048d-01f3-4ceb-97db-6e278de512b0
+ https://framatube.org/videos/watch/ed5c048d-01f3-4ceb-97db-6e278de512b0
+ Mon, 18 Nov 2019 09:25:45 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/fec25007-be8e-4e65-b461-40ce435179ec
+ https://framatube.org/videos/watch/fec25007-be8e-4e65-b461-40ce435179ec
+ Mon, 18 Nov 2019 09:04:12 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/f06ad0f4-d585-4aa4-a184-91a33ef89081
+ https://framatube.org/videos/watch/f06ad0f4-d585-4aa4-a184-91a33ef89081
+ Mon, 18 Nov 2019 08:50:52 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/bf4a9913-a3b8-4a5f-ae45-611f78bdf526
+ https://framatube.org/videos/watch/bf4a9913-a3b8-4a5f-ae45-611f78bdf526
+ Mon, 18 Nov 2019 08:19:32 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/0ac267f2-0ab8-4ee6-af4a-6d2d77bafb8e
+ https://framatube.org/videos/watch/0ac267f2-0ab8-4ee6-af4a-6d2d77bafb8e
+ Sun, 17 Feb 2019 12:09:23 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/e328bf32-ff8e-4d1d-a7a9-2a8a18f28b41
+ https://framatube.org/videos/watch/e328bf32-ff8e-4d1d-a7a9-2a8a18f28b41
+ Fri, 08 Feb 2019 19:31:14 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/4d661d5f-a884-4510-bca8-15cb19aa3fe5
+ https://framatube.org/videos/watch/4d661d5f-a884-4510-bca8-15cb19aa3fe5
+ Fri, 08 Feb 2019 19:17:24 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/32e5175c-c799-48d3-a0c7-dcf051584600
+ https://framatube.org/videos/watch/32e5175c-c799-48d3-a0c7-dcf051584600
+ Fri, 08 Feb 2019 18:55:37 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/3fff751a-a5d4-4a1a-b1b9-94f24f4b9c5b
+ https://framatube.org/videos/watch/3fff751a-a5d4-4a1a-b1b9-94f24f4b9c5b
+ Fri, 08 Feb 2019 17:08:27 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/20358afa-4d88-4902-8c6f-9525d0920af0
+ https://framatube.org/videos/watch/20358afa-4d88-4902-8c6f-9525d0920af0
+ Fri, 08 Feb 2019 16:25:18 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/5b28ec58-d1e0-4b64-b55d-c80f9778b355
+ https://framatube.org/videos/watch/5b28ec58-d1e0-4b64-b55d-c80f9778b355
+ Fri, 08 Feb 2019 15:46:53 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/7e261f9e-242c-4100-a0bd-268dab321114
+ https://framatube.org/videos/watch/7e261f9e-242c-4100-a0bd-268dab321114
+ Mon, 26 Nov 2018 17:11:02 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/fff79bf3-99c8-4601-9a05-f64561d97d09
+ https://framatube.org/videos/watch/fff79bf3-99c8-4601-9a05-f64561d97d09
+ Tue, 16 Oct 2018 17:40:05 GMT
+
+
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/f4a68510-d819-44b2-9d93-c5fa642116d7
+ https://framatube.org/videos/watch/f4a68510-d819-44b2-9d93-c5fa642116d7
+ Tue, 16 Oct 2018 17:30:19 GMT
+
+ redundancy of videos with webseed
+
+ Call for developers! Join the revolution!]]>
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/f57da309-6b92-4fe0-9267-ff8188cc050c
+ https://framatube.org/videos/watch/f57da309-6b92-4fe0-9267-ff8188cc050c
+ Tue, 02 Oct 2018 15:20:57 GMT
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/8968dbe1-a387-433b-a20f-37fe9f3ca8d5
+ https://framatube.org/videos/watch/8968dbe1-a387-433b-a20f-37fe9f3ca8d5
+ Tue, 02 Oct 2018 14:43:37 GMT
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/60c4bea4-6bb2-4fce-8d9f-8a522575419d
+ https://framatube.org/videos/watch/60c4bea4-6bb2-4fce-8d9f-8a522575419d
+ Tue, 02 Oct 2018 12:27:30 GMT
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/edd7a468-08d5-4877-b62b-61c5f3f83ceb
+ https://framatube.org/videos/watch/edd7a468-08d5-4877-b62b-61c5f3f83ceb
+ Tue, 02 Oct 2018 11:48:27 GMT
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/dcad56d9-9fe6-45bc-96aa-3d778f6804c1
+ https://framatube.org/videos/watch/dcad56d9-9fe6-45bc-96aa-3d778f6804c1
+ Tue, 02 Oct 2018 11:46:59 GMT
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
+ https://framatube.org/videos/watch/59d306c0-fc5b-493a-956a-43785693346b
+ https://framatube.org/videos/watch/59d306c0-fc5b-493a-956a-43785693346b
+ Tue, 02 Oct 2018 11:46:00 GMT
+ Framasoft
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nonadult
+
+
+
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_theguardian.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_theguardian.xml
new file mode 100644
index 000000000..780e6bab4
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_theguardian.xml
@@ -0,0 +1,1196 @@
+
+
+ World news | The Guardian
+ https://www.theguardian.com/world
+ Latest World news news, comment and analysis from the Guardian, the world's leading liberal voice
+ en-gb
+ Guardian News and Media Limited or its affiliated companies. All rights reserved. 2022
+ Sun, 25 Sep 2022 09:32:21 GMT
+ 2022-09-25T09:32:21Z
+ en-gb
+ Guardian News and Media Limited or its affiliated companies. All rights reserved. 2022
+
+ The Guardian
+ https://assets.guim.co.uk/images/guardian-logo-rss.c45beb1bafa34b347ac333af2e6fe23f.png
+ https://www.theguardian.com
+
+
+ Saudi foreign minister defends role in securing Ukraine prisoner swaps
+ https://www.theguardian.com/world/2022/sep/23/saudi-foreign-minister-defends-role-in-ukraine-prisoner-swaps-khashoggi
+
Prince Faisal bin Farhan al Saud decries as ‘cynical’ accusations his country was trying to improve its image after Khashoggi killing
It would be cynical to see Saudi Arabia’s efforts to secure the release of international prisoners held by Russian proxies in Ukraine as an attempt to improve the country’s image after the killing of Jamal Khashoggi, its foreign minister has said.
Prince Faisal bin Farhan al Saud said on Friday that Riyadh had first approached the UK government in April, shortly after Aiden Aslin, a British citizen, and others were captured at Mariupol, and had acted for compassionate reasons, hoping to negotiate their release.
This story was amended on Friday 23 September 2022 to correct the name of the Saudi foreign minister.
Continue reading...
+ Saudi Arabia
+ Ukraine
+ Jamal Khashoggi
+ Europe
+ Middle East and north Africa
+ World news
+ Mohammed bin Salman
+ UK news
+ Morocco
+ Africa
+ Roman Abramovich
+ Fri, 23 Sep 2022 10:11:21 GMT
+ https://www.theguardian.com/world/2022/sep/23/saudi-foreign-minister-defends-role-in-ukraine-prisoner-swaps-khashoggi
+
+ Photograph: AP
+
+
+ Photograph: AP
+
+ Dan Sabbagh Defence and security editor
+ 2022-09-23T10:11:21Z
+
+
+ ‘Humanitarian crime’: fighting cuts off insulin supply in Tigray
+ https://www.theguardian.com/global-development/2022/sep/23/fighting-cuts-off-insulin-supply-tigray-diabetic-ethiopia
+
International Diabetic Federation decries reports ongoing war has led to shortages of life-saving drug at Ethiopian region’s biggest hospital
Doctors at the biggest hospital in Tigray say they have just days supply left of insulin, as the resumption of fighting between rebels and Ethiopian government troops once again cuts off supplies to the region.
In what the head of the International Diabetes Federation (IDF) has branded “a humanitarian crime,” medics at Ayder specialist referral hospital warn they have already run out of one kind of the life-saving medicine and have only a week’s supply of another.
Continue reading...
+ Global development
+ Ethiopia
+ World news
+ Diabetes
+ Society
+ Africa
+ Conflict and arms
+ Fri, 23 Sep 2022 10:03:09 GMT
+ https://www.theguardian.com/global-development/2022/sep/23/fighting-cuts-off-insulin-supply-tigray-diabetic-ethiopia
+
+ Photograph: Ben Curtis/AP
+
+
+ Photograph: Ben Curtis/AP
+
+ Lizzy Davies
+ 2022-09-23T10:03:09Z
+
+
+ Church of England bars Desmond Tutu’s daughter from officiating at funeral
+ https://www.theguardian.com/world/2022/sep/22/church-of-england-bars-desmond-tutus-daughter-from-officiating-at-funeral
+
Church says same-sex marriage means Mpho Tutu van Furth cannot preside over godfather’s service
The daughter of the late Anglican archbishop Desmond Tutu has been barred by the Church of England from officiating at her godfather’s funeral in a Shropshire church because she is married to a woman.
Mpho Tutu van Furth, an ordained priest in the Anglican church, was invited to preside over the funeral of Martin Kenyon, who died last week at the age of 92. The C of E said its actions were “in line with the House of Bishops current guidance on same-sex marriage”.
Continue reading...
+ Anglicanism
+ South Africa
+ Desmond Tutu
+ Christianity
+ Religion
+ UK news
+ World news
+ Africa
+ Thu, 22 Sep 2022 15:38:45 GMT
+ https://www.theguardian.com/world/2022/sep/22/church-of-england-bars-desmond-tutus-daughter-from-officiating-at-funeral
+
+ Photograph: Foto24/Getty Images
+
+
+ Photograph: Foto24/Getty Images
+
+ Harriet Sherwood
+ 2022-09-22T15:38:45Z
+
+
+ Horn of Africa drought puts 3.6m children at risk of dropping out of school
+ https://www.theguardian.com/global-development/2022/sep/22/horn-of-africa-drought-puts-36m-children-at-risk-of-dropping-out-of-school
+
Experts warn that girls’ education will be worst hit, as many families are forced to move away from schools
More than 3.5 million children are at risk of dropping out of school due to the drought in the Horn of Africa, the United Nations has said, amid warnings the crisis could lead to “a lost generation” that misses out on education.
According to new figures shared with the Guardian, Unicef now estimates that 3.6 million children in Kenya, Somalia and Ethiopia are in danger of leaving school as a result of the cumulative pressure on households caused by the unrelenting drought.
Continue reading...
+ Global education
+ Child marriage
+ Global development
+ Drought
+ Hunger
+ Children
+ Somaliland
+ Ethiopia
+ Africa
+ Education
+ Environment
+ Society
+ World news
+ Kenya
+ Water
+ Thu, 22 Sep 2022 09:38:40 GMT
+ https://www.theguardian.com/global-development/2022/sep/22/horn-of-africa-drought-puts-36m-children-at-risk-of-dropping-out-of-school
+
+ Photograph: Armstrong Kiprotich/Plan International
+
+
+ Photograph: Armstrong Kiprotich/Plan International
+
+ Lizzy Davies
+ 2022-09-22T09:38:40Z
+
+
+ Tigrayan forces accuse Eritrea of launching full-scale offensive on border
+ https://www.theguardian.com/world/2022/sep/20/tigrayan-forces-accuse-eritrea-of-full-scale-offensive-on-ethiopia-border
+
Tigray People’s Liberation Front says Eritreans are fighting alongside Ethiopian government forces
Forces in Ethiopia’s Tigray region said troops from neighbouring Eritrea launched a “full-scale offensive” on Tuesday and heavy fighting was ongoing in several areas along the border.
Reuters was not immediately able to verify the account on Twitter from Getachew Reda, a spokesperson for the Tigray People’s Liberation Front (TPLF).
Continue reading...
+ Eritrea
+ Ethiopia
+ Africa
+ World news
+ Tue, 20 Sep 2022 12:11:50 GMT
+ https://www.theguardian.com/world/2022/sep/20/tigrayan-forces-accuse-eritrea-of-full-scale-offensive-on-ethiopia-border
+
+ Photograph: AP
+
+
+ Photograph: AP
+
+ Reuters in Nairobi
+ 2022-09-20T12:11:50Z
+
+
+ Ukraine war to take centre stage at UN as west and Russia vie for support
+ https://www.theguardian.com/world/2022/sep/20/united-nations-ukraine-russia-war-climate-crisis-famine-global-south
+
General assembly is expected to see fresh tussles over future of Ukraine, as well as famine and climate crisis threats in global south
The UN general assembly summit this week will be dominated by a struggle – between the US and its allies on one side and Russia on the other – for global support over the fate of Ukraine, as the global south fights to stop the conflict from overshadowing the existential threats of famine and the climate crisis.
With a return to fully in-person general debate, presidents and prime ministers will be converging on New York, many of them direct from London, where the diplomacy got under way on the sidelines of the Queen’s funeral.
Continue reading...
+ United Nations
+ World news
+ China
+ Russia
+ Ukraine
+ India
+ Joe Biden
+ Narendra Modi
+ Volodymyr Zelenskiy
+ Vladimir Putin
+ Africa
+ New York
+ Europe
+ South and central Asia
+ Tue, 20 Sep 2022 05:00:03 GMT
+ https://www.theguardian.com/world/2022/sep/20/united-nations-ukraine-russia-war-climate-crisis-famine-global-south
+
+ Photograph: Mike Segar/Reuters
+
+
+ Photograph: Mike Segar/Reuters
+
+ Julian Borger and Patrick Wintour in New York
+ 2022-09-20T05:00:03Z
+
+
+ Houses washed away after storm Fiona as Canada sends in military for cleanup
+ https://www.theguardian.com/world/2022/sep/25/canadas-military-sent-to-help-recovery-after-storm-fiona-batters-coast
+
Troops to remove trees and restore transport links after Fiona caused severe damage including torn-off roofs and flooding
Canadian troops are being sent to assist the recovery from the devastation of storm Fiona, which swept away houses, stripped off roofs and knocked out power across the country’s Atlantic provinces.
After surging north from the Caribbean as a hurricane, Fiona came ashore before dawn on Saturday as a post-tropical cyclone, battering Nova Scotia, Prince Edward Island, Newfoundland and Quebec with hurricane-strength winds, heavy rains and huge waves.
Post-tropical cyclone reaches Gulf of St Lawrence after racing through Nova Scotia forcing evacuations
Powerful storm Fiona ripped into eastern Canada on Saturday with hurricane-force winds, forcing evacuations, knocking down trees and powerlines, and reducing many homes on the coast to “just a pile of rubble in the ocean”.
The US National Hurricane Center (NHC) said the centre of the storm, downgraded to post-tropical cyclone Fiona, had reached the Gulf of St Lawrence after racing through Nova Scotia.
Continue reading...
+ Canada
+ Hurricanes
+ Americas
+ Extreme weather
+ Natural disasters
+ World news
+ Sat, 24 Sep 2022 21:50:28 GMT
+ https://www.theguardian.com/world/2022/sep/24/storm-fiona-ravages-canadas-east-coast-causing-terrifying-destruction
+
+ Photograph: Ted Pritchard/Reuters
+
+
+ Photograph: Ted Pritchard/Reuters
+
+ Reuters in Newfoundland
+ 2022-09-24T21:50:28Z
+
+
+ Riverdale actor Ryan Grantham receives life sentence for killing his mother
+ https://www.theguardian.com/world/2022/sep/24/ryan-grantham-sentencing-second-degree-murder
+
Canadian actor had pleaded guilty to second-degree murder over shooting near Vancouver
The actor Ryan Grantham – featured in the CW show Riverdale and the movie Diary of a Wimpy Kid – has been sentenced to life in prison for fatally shooting his mother in their home in Canada.
Grantham, 24, was sentenced on Wednesday after pleading guilty earlier this year to second-degree murder, which carries an automatic sentence of life in prison, reported the New York Times.
Continue reading...
+ Canada
+ US television
+ Film
+ Television
+ Television & radio
+ World news
+ Americas
+ Culture
+ Sat, 24 Sep 2022 20:00:05 GMT
+ https://www.theguardian.com/world/2022/sep/24/ryan-grantham-sentencing-second-degree-murder
+
+ Photograph: B Christopher/Alamy
+
+
+ Photograph: B Christopher/Alamy
+
+ Gloria Oladipo
+ 2022-09-24T20:00:05Z
+
+
+ Post-tropical cyclone Fiona hits eastern Canada with hurricane-force winds
+ https://www.theguardian.com/world/2022/sep/23/hurricane-fiona-canada-post-tropical-storm
+
Storm surges and heavy rainfall expected before weather event gradually weakens this weekend, say meteorologists
A powerful storm has hit eastern Canada with hurricane-force winds nearly a week after devastating parts of the Caribbean.
The US National Hurricane Centre (NHC) said the centre of Fiona, which transformed from a hurricane into a post-tropical cyclone late on Friday was crossing eastern Nova Scotia, bringing high winds and heavy rains.
Continue reading...
+ Canada
+ US news
+ Hurricanes
+ Americas
+ Natural disasters
+ Extreme weather
+ World news
+ Sat, 24 Sep 2022 16:02:50 GMT
+ https://www.theguardian.com/world/2022/sep/23/hurricane-fiona-canada-post-tropical-storm
+
+ Photograph: Darren Calabrese/AP
+
+
+ Photograph: Darren Calabrese/AP
+
+ Gloria Oladipo
+ 2022-09-24T16:02:50Z
+
+
+ Harry Styles stadium show falls foul of football fans in Bogotá
+ https://www.theguardian.com/music/2022/sep/24/harry-styles-bogota-stadium-show-football-fans
+
Bid to move pop star’s Colombian tour date to capital’s biggest venue has united supporters of clubs who play there
Rival Colombian football fans, more used to hurling insults at each other on the terraces, have united against a common enemy: Harry Styles. At stake is what takes place at Bogotá’s football stadium on 27 November: either the Colombian football championship final, or the latest leg of the British pop star’s world tour.
Styles had been scheduled to play in the car park of an amusement park in the capital city, but fans started a social media campaign for the concert to be moved after pop star Dua Lipa’s show there last weekend was plagued by logistical and technical problems.
Continue reading...
+ Harry Styles
+ Colombia
+ Americas
+ Music
+ Culture
+ World news
+ Football
+ Sport
+ Sat, 24 Sep 2022 13:00:05 GMT
+ https://www.theguardian.com/music/2022/sep/24/harry-styles-bogota-stadium-show-football-fans
+
+ Photograph: Kevin Mazur/Getty Images for Coachella
+
+
+ Photograph: Kevin Mazur/Getty Images for Coachella
+
+ Luke Taylor in Bogotá
+ 2022-09-24T13:00:05Z
+
+
+ ‘How are we not included?’: rural Puerto Ricans struggle to get help after hurricane
+ https://www.theguardian.com/world/2022/sep/24/hurricane-fiona-puerto-rico-fema
+
Fema makes individual assistance available to only 55 of the 78 municipalities on the island, leaving some feeling ignored
Six days after Hurricane Fiona struck Puerto Rico, Alexiz and Roberto Núñez still don’t know where their next meal is coming from.
The couple, whose home in Arecibo flooded during the storm, is relying on a neighbor’s cooking and some canned goods delivered by the government to get by.
Storm set to be the strongest to hit the Philippines this year after a period of ‘explosive intensification’, weather agency says
Philippine authorities started evacuating people from coastal areas on Sunday and hundreds were unable to travel by sea as a super typhoon barrelled towards the country.
Super typhoon Noru was packing maximum sustained wind speeds of 185km/h (115mph) after an unprecedented “explosive intensification”, the state weather forecaster said.
Continue reading...
+ Philippines
+ Asia Pacific
+ Extreme weather
+ Sun, 25 Sep 2022 05:22:07 GMT
+ https://www.theguardian.com/world/2022/sep/25/philippines-evacuates-towns-as-super-typhoon-noru-barrels-towards-coast
+
+ Photograph: Ryan Eduard Benaid/SOPA Images/REX/Shutterstock
+
+
+ Photograph: Ryan Eduard Benaid/SOPA Images/REX/Shutterstock
+
+ Guardian staff with agencies
+ 2022-09-25T05:22:07Z
+
+
+ North Korea fires ballistic missile towards sea, says South Korean military
+ https://www.theguardian.com/world/2022/sep/25/north-korea-fires-ballistic-missile-says-south-korean-military
+
Launch of an unidentified missile is the latest in a record-breaking blitz of weapons tests by nuclear-armed Pyongyang this year
North Korea fired a short-range ballistic missile on Sunday towards its eastern seas, extending a provocative streak in weapons testing as a US aircraft carrier visits South Korea for joint military exercises in response to the North’s growing nuclear threat.
South Korea’s joint chiefs of staff said the missile launched from the western inland town of Taechon flew 600km (370 miles) cross-country on a maximum altitude of 60km (37 miles) before landing in waters off North Korea’s eastern coast.
Continue reading...
+ North Korea
+ South Korea
+ Asia Pacific
+ Sun, 25 Sep 2022 02:27:02 GMT
+ https://www.theguardian.com/world/2022/sep/25/north-korea-fires-ballistic-missile-says-south-korean-military
+
+ Photograph: 朝鮮通信社/AP
+
+
+ Photograph: 朝鮮通信社/AP
+
+ Guardian staff with agencies
+ 2022-09-25T02:27:02Z
+
+
+ ‘They belong to Waramungu’: New Zealand museum agrees to return items to Indigenous Australians
+ https://www.theguardian.com/australia-news/2022/sep/25/they-belong-to-waramungu-new-zealand-museum-agrees-to-return-items-to-indigenous-australians
+
Warumungu people in Northern Territory negotiate return of four objects collected by anthropologist Baldwin Spencer in the early 1900s
Four objects from the Warumungu people will be returned from a New Zealand museum to country in the Northern Territory.
Two hooked boomerangs (wartilykirri), an adze (palya/kupija) and an axe (ngurrulumuru) were collected by well-known anthropologist Baldwin Spencer and telegraph operator James Field.
The owner of 21 tropical islands off the coast of Papua New Guinea says he never threatened to sell them to China and his main aim is to save the turtles that nest there.
Ian Gowrie-Smith, an Australian businessman and investor, bought the Conflict Islands, which lie less than 1,000km from the Australian coast, almost two decades ago.
Continue reading...
+ Asia Pacific
+ Conservation
+ Wildlife
+ Endangered species
+ Papua New Guinea
+ Pacific islands
+ Australia news
+ China
+ Penny Wong
+ Marine life
+ Animals
+ Environment
+ World news
+ Sun, 25 Sep 2022 01:00:19 GMT
+ https://www.theguardian.com/world/2022/sep/25/turtle-concern-australian-businessman-denies-threatening-to-sell-conflict-islands-to-china
+
+ Photograph: Roslan Rahman/AFP/Getty Images
+
+
+ Photograph: Roslan Rahman/AFP/Getty Images
+
+ Tory Shepherd
+ 2022-09-25T01:00:19Z
+
+
+ Typhoon Talas lashes Japan, setting off landslides with more rains to come
+ https://www.theguardian.com/world/2022/sep/24/typhoon-talas-lashes-japan-setting-off-landslides-with-more-rains-to-come
+
At least two people killed and 120,000 households without power as authorities urge caution for more landslides and flooding
A typhoon lashed central Japan on Saturday with torrential rain and fierce winds, killing two and leaving tens of thousands of households without power, the Kyodo news agency reported.
Shizuoka city, south-west of Tokyo, was hit especially hard, seeing a record 417mm (16.42 inches) of precipitation since the rain started on Thursday, the Japan Meteorological Agency (JMA) said.
Continue reading...
+ Japan
+ Extreme weather
+ Asia Pacific
+ Sat, 24 Sep 2022 06:00:09 GMT
+ https://www.theguardian.com/world/2022/sep/24/typhoon-talas-lashes-japan-setting-off-landslides-with-more-rains-to-come
+
+ Photograph: KYODO/Reuters
+
+
+ Photograph: KYODO/Reuters
+
+ Staff with agencies
+ 2022-09-24T06:00:09Z
+
+
+ China says US sending ‘dangerous signals’ on Taiwan
+ https://www.theguardian.com/world/2022/sep/24/china-says-us-sending-dangerous-signals-on-taiwan
+
Comments from Chinese foreign minister Wang Yi come after meeting with US secretary of state Antony Blinken on sidelines of UN general assembly
China has accused the United States of sending “very wrong, dangerous signals” on Taiwan after the US secretary of state told his Chinese counterpart on Friday that the maintenance of peace and stability over Taiwan was vitally important.
Taiwan was the focus of the 90-minute, “direct and honest” talks between the secretary of state, Antony Blinken, and the Chinese foreign minister, Wang Yi, on the margins of the UN general assembly in New York, a US official told reporters.
Continue reading...
+ China
+ United Nations
+ Asia Pacific
+ US news
+ Antony Blinken
+ Taiwan
+ Sat, 24 Sep 2022 02:28:29 GMT
+ https://www.theguardian.com/world/2022/sep/24/china-says-us-sending-dangerous-signals-on-taiwan
+
+ Photograph: David ’Dee’ Delgado/AP
+
+
+ Photograph: David ’Dee’ Delgado/AP
+
+ Reuters
+ 2022-09-24T02:28:29Z
+
+
+ Brisbane Lions stand behind senior coach Chris Fagan amid Hawthorn inquiry
+ https://www.theguardian.com/sport/2022/sep/25/brisbane-lions-stand-behind-senior-coach-chris-fagan-amid-hawthorn-inquiry
+
Club’s chairman says AFL investigation into allegations of misconduct at Hawthorn Football Club will provide ‘procedural fairness’
Chris Fagan, senior coach of the Brisbane Lions, has been defended by the club as he takes a leave of absence to cooperate with an AFL investigation into allegations of serious mistreatment of First Nations former players at Hawthorn Football Club.
The AFL chief executive, Gillon McLachlan, announced on Wednesday that an external independent panel would investigate “challenging, harrowing and disturbing” allegations detailed in a Hawks-commissioned review.
Continue reading...
+ Australia sport
+ Brisbane Lions
+ Hawthorn
+ AFL
+ Australia news
+ Sport
+ Indigenous Australians
+ Sun, 25 Sep 2022 08:45:58 GMT
+ https://www.theguardian.com/sport/2022/sep/25/brisbane-lions-stand-behind-senior-coach-chris-fagan-amid-hawthorn-inquiry
+
+ Photograph: Joel Carrett/AAP
+
+
+ Photograph: Joel Carrett/AAP
+
+ Donna Lu
+ 2022-09-25T08:45:58Z
+
+
+ End of fuel excise discount will be tough, Labor admits – as it happened
+ https://www.theguardian.com/australia-news/live/2022/sep/25/flood-warnings-in-nsw-as-geelong-celebrates-10th-afl-grand-final-win-follow-live
+
Assistant treasurer says Labor can’t keep the fuel relief going, despite cost-of-living pressures. This blog is now closed
The Tasmanian government is scaling down its operation at the site where hundreds of whales were stranded on the state’s west coast.
In a statement last night, the Department of Natural Resources and Environment said its staff will continue to monitor a “small number of whales” in Macquarie Harbour following the mass stranding this week.
Through extensive aerial and vessel surveillance of Macquarie Harbour we have identified a small number of whales within the harbour precinct.
A number of those are still free swimming. However, we do have a couple that are stranded in shallower waters. We currently have crews responding to those animals and we aim to free them and get them swimming out of the harbour throughout the course of the afternoon.
Given the current flooding, saturated catchments and full dams, this forecast front will likely exacerbate the current riverine flooding with multiple systems anticipated to see prolonged or renewed minor to major flooding.
With catchments wet and many dams at capacity, waterways are very sensitive to rainfall, and further river rises and renewed flooding are likely for the inland catchments.
Continue reading...
+ Australia news
+ New South Wales
+ Flooding
+ Australian politics
+ Environment
+ Extreme weather
+ Australia sport
+ Sun, 25 Sep 2022 07:01:26 GMT
+ https://www.theguardian.com/australia-news/live/2022/sep/25/flood-warnings-in-nsw-as-geelong-celebrates-10th-afl-grand-final-win-follow-live
+
+ Photograph: Russell Freeman/AAP
+
+
+ Photograph: Russell Freeman/AAP
+
+ Donna Lu (now) and Christopher Knaus (earlier)
+ 2022-09-25T07:01:26Z
+
+
+ NSW flood emergency forecast to continue as towns cut off by road
+ https://www.theguardian.com/australia-news/2022/sep/25/nsw-flood-emergency-forecast-to-continue-as-towns-cut-off-by-road
+
Warren and Wee Waa, in state’s north, expected to be inaccessible by road for days to come
The ongoing flood emergency in New South Wales is expected to continue due to a new trough forecast to bring further wet weather across the state from Monday.
The towns of Warren and Wee Waa, in the state’s north, are cut off by road and expected to remain that way for days. Emergency services are using aircraft to delivery water, medicine, food and other supplies to residents.
Continue reading...
+ Australia weather
+ New South Wales
+ Australia news
+ Environment
+ Extreme weather
+ Flooding
+ Sun, 25 Sep 2022 06:28:20 GMT
+ https://www.theguardian.com/australia-news/2022/sep/25/nsw-flood-emergency-forecast-to-continue-as-towns-cut-off-by-road
+
+ Photograph: Bianca de Marchi/AAP
+
+
+ Photograph: Bianca de Marchi/AAP
+
+ Donna Lu
+ 2022-09-25T06:28:20Z
+
+
+ SA premier says buying nuclear submarines directly from US would degrade Australian shipbuilding
+ https://www.theguardian.com/world/2022/sep/25/sa-premier-says-buying-nuclear-submarines-directly-from-us-would-degrade-australian-shipbuilding
+
Proposal to fast-track submarines by having them produced by US ‘would not be acceptable’, Peter Malinauskas says
The South Australian premier, Peter Malinauskas, has criticised a proposal for Australia to buy nuclear submarines directly from the US, saying it would “not be acceptable” for his state to miss out on promised submarine manufacturing jobs.
A report in the Wall Street Journal on Saturday suggested the Biden administration was considering a plan with the UK and Australia to fast-track nuclear-powered submarines for Australia by the mid-2030s by producing the first few submarines in the US.
The defence minister, Richard Marles, has condemned the latest nuclear threat from Russia as “appalling”, and says Australia is preparing to support Ukraine for a protracted military conflict.
Speaking on Sunday, the deputy prime minister said the threat from the Russian president Vladimir Putin last week to use the country’s nuclear arsenal as part of its ongoing war with Ukraine could “not be allowed to stand”.
Continue reading...
+ Australia news
+ Richard Marles (Australian politician)
+ Ukraine
+ Russia
+ Europe
+ Australian politics
+ World news
+ Sun, 25 Sep 2022 02:49:56 GMT
+ https://www.theguardian.com/australia-news/2022/sep/25/richard-marles-condemns-russias-appalling-nuclear-threat-and-pledges-long-term-ukraine-support
+
+ Photograph: François Mori/AP
+
+
+ Photograph: François Mori/AP
+
+ Sarah Martin
+ 2022-09-25T02:49:56Z
+
+
+ Mathieu van der Poel charged with assault before Road World Championship race
+ https://www.theguardian.com/sport/2022/sep/25/cycling-road-world-championships-favourite-mathieu-van-der-poel-charged-with-assault-in-sydney
+
Dutch cyclist retires early from Wollongong race following alleged night-time altercation with teenagers at hotel
Dutch cyclist Mathieu van der Poel, who was the favourite going into the UCI Road World Championships elite men’s road race in Wollongong, was arrested and charged with common assault on Saturday night following an incident at his hotel.
He started the race on Sunday morning but retired after less than an hour of racing.
Continue reading...
+ Cycling Road World Championships
+ Cycling
+ Sport
+ Australia news
+ New South Wales
+ Australia sport
+ Sun, 25 Sep 2022 02:18:19 GMT
+ https://www.theguardian.com/sport/2022/sep/25/cycling-road-world-championships-favourite-mathieu-van-der-poel-charged-with-assault-in-sydney
+
+ Photograph: REX/Shutterstock
+
+
+ Photograph: REX/Shutterstock
+
+ Kieran Pender in Wollongong
+ 2022-09-25T02:18:19Z
+
+
+ Italy braces for sharp move to the right after election voting closes
+ https://www.theguardian.com/world/2022/sep/24/italy-right-georgia-meloni-after-election-voting-closes
+
Giorgia Meloni, who leads Brothers of Italy, looks likely to become the first woman to head a government
Italians were braced for seismic change on Saturday, on the eve of an election forecasted to hand Italy the most rightwing government since the second world war.
Giorgia Meloni, the head of the post-fascist Brothers of Italy party, is widely tipped to become the country’s first woman to head a government.
Continue reading...
+ Italy
+ The far right
+ World news
+ Europe
+ Sun, 25 Sep 2022 09:29:54 GMT
+ https://www.theguardian.com/world/2022/sep/24/italy-right-georgia-meloni-after-election-voting-closes
+
+ Photograph: Alessandro Garofalo/AP
+
+
+ Photograph: Alessandro Garofalo/AP
+
+ Agence France-Presse
+ 2022-09-25T09:29:54Z
+
+
+ Russia-Ukraine war latest: what we know on day 214 of the invasion
+ https://www.theguardian.com/world/2022/sep/25/russia-ukraine-war-latest-what-we-know-on-day-214-of-the-invasion
+
More than 700 arrested in latest Russian protests against Putin’s military call-up as people who refuse to fight face jail sentences
Continue reading...
+ Ukraine
+ Russia
+ Europe
+ World news
+ Vladimir Putin
+ Sun, 25 Sep 2022 00:46:41 GMT
+ https://www.theguardian.com/world/2022/sep/25/russia-ukraine-war-latest-what-we-know-on-day-214-of-the-invasion
+
+ Photograph: Contributor/8523328/Getty Images
+
+
+ Photograph: Contributor/8523328/Getty Images
+
+ Nadeem Badshah with agencies
+ 2022-09-25T00:46:41Z
+
+
+ Russia’s allies China and India call for negotiations to end Ukraine war
+ https://www.theguardian.com/world/2022/sep/24/russias-allies-china-and-india-call-for-negotiations-to-end-ukraine-war
+
Moscow isolated at United Nations assembly, with no major country siding with it
China and India have called for a negotiated end to the Ukraine war, stopping short of robust support for traditional ally Russia.
After a week of pressure at the United Nations general assembly, Russia’s foreign minister took the general assembly rostrum to deliver a fiery rebuke to western nations for what he termed a “grotesque” campaign against Russians.
Continue reading...
+ China
+ India
+ United Nations
+ Ukraine
+ Russia
+ Europe
+ World news
+ Sat, 24 Sep 2022 22:26:27 GMT
+ https://www.theguardian.com/world/2022/sep/24/russias-allies-china-and-india-call-for-negotiations-to-end-ukraine-war
+
+ Photograph: Eduardo Muñoz/Reuters
+
+
+ Photograph: Eduardo Muñoz/Reuters
+
+ AFP in New York
+ 2022-09-24T22:26:27Z
+
+
+ Roger Waters cancels gigs in Poland amid row over Ukraine war comments
+ https://www.theguardian.com/music/2022/sep/24/roger-water-cancels-gigs-in-poland-amid-row-over-ukraine-war-comments
+
Pink Floyd co-founder's stance on Russia's war against Ukraine has sparked ‘indignation’ in Kraków
Pink Floyd co-founder Roger Waters has cancelled concerts planned in Poland amid outrage over his stance on Russia’s war against Ukraine, Polish media reported on Saturday.
An official with the Tauron Arena in Kraków, where the musician was scheduled to perform two concerts in April 2023, said they would no longer take place.
Continue reading...
+ Roger Waters
+ Pink Floyd
+ Music
+ Culture
+ Poland
+ Ukraine
+ Russia
+ Europe
+ Sat, 24 Sep 2022 19:41:03 GMT
+ https://www.theguardian.com/music/2022/sep/24/roger-water-cancels-gigs-in-poland-amid-row-over-ukraine-war-comments
+
+ Photograph: Rob Grabowski/Invision/AP
+
+
+ Photograph: Rob Grabowski/Invision/AP
+
+ Nadeem Badshah and agency
+ 2022-09-24T19:41:03Z
+
+
+ Russia-Ukraine war: at least 730 protesters detained in Russia; Europe urged to accept Russians fleeing draft – as it happened
+ https://www.theguardian.com/world/live/2022/sep/24/russia-ukraine-war-latest-updates-kyiv-says-residents-coerced-to-vote-as-moscow-holds-referendums-in-parts-of-ukraine
+
Arrests made in 32 cities at rallies against mobilisation; border crossings from Russia to Finland have doubled and 10km queue reported at frontier with Georgia. This blog is now closed
Russian forces launched new strikes on Saturday, targeting infrastructure facilities, Zaporizhzhia city’s administrative head, Oleksandr Starukh, said via his Telegram channel.
One missile hit an apartment building causing a fire, killing one person and injuring seven others.
But if you get into the Russian army, sabotage any activity of the enemy, hinder any Russian operations, provide us with any important information about the occupiers – their bases, headquarters, warehouses with ammunition. And at the first opportunity, switch to our positions.
Continue reading...
+ Ukraine
+ Russia
+ Europe
+ Volodymyr Zelenskiy
+ Vladimir Putin
+ World news
+ Sat, 24 Sep 2022 18:52:10 GMT
+ https://www.theguardian.com/world/live/2022/sep/24/russia-ukraine-war-latest-updates-kyiv-says-residents-coerced-to-vote-as-moscow-holds-referendums-in-parts-of-ukraine
+
+ Photograph: AFP/Getty Images
+
+
+ Photograph: AFP/Getty Images
+
+ Nadeem Badshah (now); Geneva Abdul and Adam Fulton (earlier)
+ 2022-09-24T18:52:10Z
+
+
+ Expect dissent to rise as Putin’s call-up brings Ukraine war home to Russians
+ https://www.theguardian.com/world/2022/sep/24/putins-call-up-brings-ukraine-war-home-to-russians
+
As men of fighting age flee the draft, observers say Kremlin should be more worried about mounting anger away from the cities
In a caricature by the country’s most prominent political cartoonist, Sergey Elkin, Vladimir Putin is standing on top of the Kremlin wall with his arms outstretched.
“So what else do I need to do for you guys to finally start rebelling,” Putin asks, with a look of desperation.
Continue reading...
+ Protest
+ Vladimir Putin
+ Russia
+ Volodymyr Zelenskiy
+ Ukraine
+ Europe
+ World news
+ Sat, 24 Sep 2022 16:54:06 GMT
+ https://www.theguardian.com/world/2022/sep/24/putins-call-up-brings-ukraine-war-home-to-russians
+
+ Photograph: AP
+
+
+ Photograph: AP
+
+ Pjotr Sauer and Andrew Roth in Moscow
+ 2022-09-24T16:54:06Z
+
+
+ Death toll from sinking of Lebanon boat rises to 94
+ https://www.theguardian.com/world/2022/sep/24/lebanon-migrant-boat-sinking-syria-death-toll
+
Survivors say boat that sank off Syrian coast had between 120 and 150 people onboard
The death toll from a boat that sank off the Syrian coast after sailing from Lebanon earlier this week has risen to 94, Syrian state TV said on Saturday.
The country’s transport ministry has quoted survivors as saying the boat left Lebanon’s northern Minyeh region on Tuesday bound for Europe with between 120 and 150 people onboard.
Continue reading...
+ Lebanon
+ Syria
+ Middle East and north Africa
+ Migration
+ World news
+ Sun, 25 Sep 2022 01:21:11 GMT
+ https://www.theguardian.com/world/2022/sep/24/lebanon-migrant-boat-sinking-syria-death-toll
+
+ Photograph: Wael Hamzeh/EPA
+
+
+ Photograph: Wael Hamzeh/EPA
+
+ Reuters in Cairo
+ 2022-09-25T01:21:11Z
+
+
+ Protests spread in Iran as President Raisi vows to crack down
+ https://www.theguardian.com/world/2022/sep/24/protests-spread-in-iran-as-president-raisi-vows-to-crack-down
+
Demonstrations that began with death of Mahsa Amini while detained by morality police pose biggest threat to regime in 13 years
Iran’s president has vowed to “deal decisively” with protests that are gathering momentum across much of the country one week after the death of a woman in custody who had been detained by the morality police.
Demonstrations have spread to most of Iran’s 31 provinces and almost all urban centres, pitting anti-government demonstrators against regime forces, including the military, and posing the most serious test to the hardline state’s authority in more than 13 years.
Continue reading...
+ Iran
+ Protest
+ Ebrahim Raisi
+ Middle East and north Africa
+ World news
+ The Iranian revolution
+ Human rights
+ Sat, 24 Sep 2022 17:41:24 GMT
+ https://www.theguardian.com/world/2022/sep/24/protests-spread-in-iran-as-president-raisi-vows-to-crack-down
+
+ Photograph: EPA
+
+
+ Photograph: EPA
+
+ Martin Chulov Middle East correspondent
+ 2022-09-24T17:41:24Z
+
+
+ Iranian authorities must ‘deal decisively’ with protests, says president
+ https://www.theguardian.com/world/2022/sep/24/at-least-35-dead-in-eight-nights-of-protests-iran-state-media-reports
+
At least 35 dead in eight nights of demonstrations after death of Mahsa Amini in custody, state media report
Iran’s president, Ebrahim Raisi, has said authorities must “deal decisively with those who oppose the country’s security and tranquility”, Iranian state media have reported.
Demonstrators have taken to the streets of Tehran and other major cities for eight straight nights since the death of Mahsa Amini.
Continue reading...
+ Iran
+ Middle East and north Africa
+ World news
+ Women's rights and gender equality
+ Protest
+ Joe Biden
+ Antony Blinken
+ US news
+ Sat, 24 Sep 2022 11:15:52 GMT
+ https://www.theguardian.com/world/2022/sep/24/at-least-35-dead-in-eight-nights-of-protests-iran-state-media-reports
+
+ Photograph: Anadolu Agency/Getty Images
+
+
+ Photograph: Anadolu Agency/Getty Images
+
+ Agence France-Presse in Tehran
+ 2022-09-24T11:15:52Z
+
+
+ Scores dead in worst sinking of migrant boat from Lebanon in recent years
+ https://www.theguardian.com/world/2022/sep/23/scores-dead-in-worst-sinking-of-migrant-boat-from-lebanon-in-recent-years
+
At least 77 people drowned and many still missing after shipwreck off coast of Syria
At least 77 people have drowned after the migrant boat they boarded in Lebanon sank off Syria’s coast, the deadliest such shipwreck from Lebanon in recent years, amid fears the death toll could be far higher.
The country, which has been mired since 2019 in a financial crisis the World Bank has described as one of the worst in modern times, has become a launchpad for migration, with its own citizens joining Syrian and Palestinian refugees clamouring to leave the country.
Continue reading...
+ Refugees
+ Migration
+ Lebanon
+ Middle East and north Africa
+ World news
+ Syria
+ Sat, 24 Sep 2022 02:08:50 GMT
+ https://www.theguardian.com/world/2022/sep/23/scores-dead-in-worst-sinking-of-migrant-boat-from-lebanon-in-recent-years
+
+ Photograph: Bilal Hussein/AP
+
+
+ Photograph: Bilal Hussein/AP
+
+ Weronika Strzyżyńska and agencies
+ 2022-09-24T02:08:50Z
+
+
+ Iran marchers call for execution of anti-government protesters
+ https://www.theguardian.com/world/2022/sep/23/iran-reportedly-arrests-journalist-activist-mahsa-amini-protests
+
Army signals it is prepared to crush dissent after unrest over death of Mahsa Amini in police custody
Pro-government rallies have taken place in several cities across Iran in an attempt to counter a week of mounting unrest triggered by the death of a woman in police custody.
Marchers called for anti-government protesters to be executed, while the army signalled that it was prepared to crush dissent by telling Iranians that it would confront “the enemies” behind the unrest.
Continue reading...
+ Iran
+ Protest
+ Middle East and north Africa
+ World news
+ Fri, 23 Sep 2022 17:28:24 GMT
+ https://www.theguardian.com/world/2022/sep/23/iran-reportedly-arrests-journalist-activist-mahsa-amini-protests
+
+ Photograph: Wana News Agency/Reuters
+
+
+ Photograph: Wana News Agency/Reuters
+
+ Patrick Wintour and agencies
+ 2022-09-23T17:28:24Z
+
+
+ Mahsa Amini’s death could be the spark that ignites Iran around women’s rights
+ https://www.theguardian.com/global-development/2022/sep/23/mahsa-amini-death-could-be-spark-broader-political-action-iran
+
The country faces a litany of problems, from inflation to a democratic deficit, and the women’s movement is seen as an agent of change
On the day that news of Mahsa Amini’s death spread throughout Iran, a young woman with a shaved head joined protesters who had gathered outside Kasra hospital, where Amini had lain in a coma since her violent arrest by Iran’s morality police days earlier.
In her hand she carried a plastic bag full of her long hair, shorn off in a gesture of solidarity with Amini and in defiance of the increasing crackdown on women by the regime.
Continue reading...
+ Iran
+ Women
+ Women's rights and gender equality
+ Protest
+ Islam
+ Religion
+ Middle East and north Africa
+ World news
+ Fri, 23 Sep 2022 15:56:51 GMT
+ https://www.theguardian.com/global-development/2022/sep/23/mahsa-amini-death-could-be-spark-broader-political-action-iran
+
+ Photograph: Murad Sezer/Reuters
+
+
+ Photograph: Murad Sezer/Reuters
+
+ Weronika Strzyżyńska
+ 2022-09-23T15:56:51Z
+
+
+ Lightning and heavy rains kill 36 in northern India in one day
+ https://www.theguardian.com/world/2022/sep/24/northern-india-lightning-heavy-rains-deaths
+
Authorities say climate breakdown is driving surge in deadly monsoon season weather events
Hazardous weather has killed at least 36 people in northern India over the past 24 hours, including 12 who were struck by lightning, officials said.
Across the northern state of Uttar Pradesh, at least 24 people died after their homes collapsed amid unrelenting rains, relief commissioner Shri Ranvir Prasad said.
Continue reading...
+ India
+ Extreme weather
+ World news
+ South and central Asia
+ Sat, 24 Sep 2022 10:20:25 GMT
+ https://www.theguardian.com/world/2022/sep/24/northern-india-lightning-heavy-rains-deaths
+
+ Photograph: Saqib Majeed/SOPA Images/REX/Shutterstock
+
+
+ Photograph: Saqib Majeed/SOPA Images/REX/Shutterstock
+
+ Associated Press in Lucknow
+ 2022-09-24T10:20:25Z
+
+
+ Less Bollywood, more Tollywood: how Indian cinema’s hit machine flopped
+ https://www.theguardian.com/film/2022/sep/23/string-of-bollywood-films-flop-at-box-office-as-india-turns-to-streaming
+
Big releases with usually bankable male stars criticised for formulaic storylines as audience taste evolves
The opening of a new big-name Bollywood film was once a national event across India, greeted by weeks of fanfare, long queues outside cinemas and halls packed to the rafters with audiences cheering and singing along.
But this year, with 77% of releases flopping at the box office, cinema halls have been left eerily quiet and Bollywood’s once unshakeable domination of the Indian film industry has begun to look uncertain.
Continue reading...
+ Bollywood
+ Film industry
+ India
+ Film
+ Culture
+ South and central Asia
+ World news
+ Fri, 23 Sep 2022 11:42:50 GMT
+ https://www.theguardian.com/film/2022/sep/23/string-of-bollywood-films-flop-at-box-office-as-india-turns-to-streaming
+
+ Photograph: Danish Ismail/Reuters
+
+
+ Photograph: Danish Ismail/Reuters
+
+ Hannah Ellis-Petersen in Delhi
+ 2022-09-23T11:42:50Z
+
+
+ ‘Give workers an equal seat’: pressure builds for Levi’s to protect factory employees
+ https://www.theguardian.com/global-development/2022/sep/23/levis-garment-workers-bangladesh-pakistan-international-accord-health-safety
+
Activists say that the company’s own audits have been ineffective and workers receive inadequate safety protections
Workers and activists have been campaigning to push Levi’s, one of the world’s largest clothing brands, to sign on to an international accord for workers’ health and safety in Bangladesh and Pakistan.
On 24 April 2013, the Rana Plaza building in Dhaka, Bangladesh, which housed five garment clothing factories, collapsed, killing 1,134 people and injuring approximately 2,500, in the deadliest disaster in the garment industry’s history.
Continue reading...
+ Garment workers
+ South and central Asia
+ Bangladesh
+ Pakistan
+ Rana Plaza
+ Fashion industry
+ Global development
+ Fri, 23 Sep 2022 08:00:30 GMT
+ https://www.theguardian.com/global-development/2022/sep/23/levis-garment-workers-bangladesh-pakistan-international-accord-health-safety
+
+ Photograph: Milo Hess/ZUMA Press Wire/REX/Shutterstock
+
+
+ Photograph: Milo Hess/ZUMA Press Wire/REX/Shutterstock
+
+ Michael Sainato
+ 2022-09-23T08:00:30Z
+
+
+ Myanmar model who criticised junta stuck in limbo after being denied entry to Thailand
+ https://www.theguardian.com/world/2022/sep/23/myanmar-model-who-criticised-junta-stuck-in-limbo-after-being-denied-entry-to-thailand
+
Han Lay appealed for help on social media after being stopped at Bangkok airport, saying Myanmar police there want to speak to her
A Myanmar model who has spoken out against the military junta that seized power last year says she has sought help from the UN’s refugee agency after she was denied entry to Thailand.
Han Lay, who was stopped at Suvarnabhumi airport in Bangkok this week, asked for help in a Facebook post on Thursday night, saying Myanmar police were at the airport and trying to speak with her.
Continue reading...
+ Myanmar
+ Thailand
+ Asia Pacific
+ South and central Asia
+ World news
+ Fri, 23 Sep 2022 05:58:45 GMT
+ https://www.theguardian.com/world/2022/sep/23/myanmar-model-who-criticised-junta-stuck-in-limbo-after-being-denied-entry-to-thailand
+
+ Photograph: Athit Perawongmetha/Reuters
+
+
+ Photograph: Athit Perawongmetha/Reuters
+
+ Rebecca Ratcliffe South-east Asia correspondent
+ 2022-09-23T05:58:45Z
+
+
+ Patience with Putin may be ebbing among friendlier countries
+ https://www.theguardian.com/world/2022/sep/22/patience-with-putin-may-be-ebbing-among-friendlier-countries
+
Turkey, India and China respond cooly to news of planned referendums in Ukrainian regions occupied by Russia
Signs that some countries willing to tolerate Russia’s invasion of Ukraine are losing patience have emerged as Turkey, India and China responded cooly to the announcement that four Ukrainian regions occupied by Russia were planning referendums on joining the Russian Federation.
Turkey, which has been at the centre of mediation between the west and Russia, issued a sharp rebuke, saying in a statement that it was concerned by attempts to stage unilateral referendums.
Continue reading...
+ Ukraine
+ Russia
+ Turkey
+ India
+ China
+ Asia Pacific
+ Europe
+ South and central Asia
+ World news
+ Thu, 22 Sep 2022 18:56:42 GMT
+ https://www.theguardian.com/world/2022/sep/22/patience-with-putin-may-be-ebbing-among-friendlier-countries
+
+ Photograph: Alexandr Demyanchuk/SPUTNIK/KREMLIN POOL/EPA
+
+
+ Photograph: Alexandr Demyanchuk/SPUTNIK/KREMLIN POOL/EPA
+
+ Patrick Wintour in New York
+ 2022-09-22T18:56:42Z
+
+
+ Four media outlets facing libel claims over Nursultan Nazarbayev reports
+ https://www.theguardian.com/world/2022/sep/21/four-media-outlets-facing-libel-claims-over-reporting-nursultan-nazarbayev-fund
+
Complaints filed by charity named after ex-president reopen the debate over legal action against public interest journalism
Four media outlets in the UK and the US are facing libel claims after publishing investigative reports into allegations about the assets of a fund named after the former Kazakh president Nursultan Nazarbayev.
The Bureau of Investigative Journalism (TBIJ), openDemocracy and the Telegraph received several “pre-action” letters between May and August claiming their reporting was inaccurate and caused financial losses to a UK-registered company.
Continue reading...
+ Nursultan Nazarbayev
+ Press freedom
+ Kazakhstan
+ South and central Asia
+ Newspapers & magazines
+ Media
+ World news
+ Newspapers
+ Business
+ Wed, 21 Sep 2022 10:00:25 GMT
+ https://www.theguardian.com/world/2022/sep/21/four-media-outlets-facing-libel-claims-over-reporting-nursultan-nazarbayev-fund
+
+ Photograph: Turar Kazangapov/Reuters
+
+
+ Photograph: Turar Kazangapov/Reuters
+
+ Rupert Neate Wealth correspondent
+ 2022-09-21T10:00:25Z
+
+
+ Labour would keep 19% basic rate but reinstate 45% top rate of income tax, says Keir Starmer – UK politics live
+ https://www.theguardian.com/politics/live/2022/sep/25/keir-starmer-labour-party-conference-uk-politics-live-news
+
Latest updates: all the developments from UK politics as the Labour party conference starts in Liverpool
Q: Does Labour support cutting the 45% top rate of income tax?
Miliband says that cutting the 45% rate is the wrong thing to do.
We’re going to be consistent in our election manifesto with our opposition to the 45p tax cut. We think it is the wrong thing to do for the country.
No, we don’t think that should be reversed. Remember, we are talking about this basic rate cut. People start paying that at £12,500.
Continue reading...
+ Politics
+ UK news
+ Labour
+ Labour conference
+ Keir Starmer
+ UK cost of living crisis
+ Tax and spending
+ Kwasi Kwarteng
+ Mini-budget 2022
+ Business
+ Energy
+ Climate crisis
+ Income tax
+ Ed Miliband
+ Andy Burnham
+ Sun, 25 Sep 2022 09:23:08 GMT
+ https://www.theguardian.com/politics/live/2022/sep/25/keir-starmer-labour-party-conference-uk-politics-live-news
+
+ Photograph: Stefan Rousseau/PA
+
+
+ Photograph: Stefan Rousseau/PA
+
+ Andrew Sparrow
+ 2022-09-25T09:23:08Z
+
+
+ Why the ‘Barber boom’ that Kwasi Kwarteng’s mini-budget recalls was destined for disaster
+ https://www.theguardian.com/uk-news/2022/sep/25/why-the-barber-boom-that-kwasi-kwartengs-mini-budget-recalls-was-destined-for-disaster
+
A reckless dash for growth is nothing new. Ted Heath’s chancellor Anthony Barber tried one in 1971, but it didn’t turn out well
The recklessness of chancellor Kwasi Kwarteng’s “budget for growth” evokes memories of the disastrous outcome of the last great Conservative “dash for growth”: the so-called “Barber boom” of 1971-73.
I say so-called because the wildly expansionist policy of those years was essentially the work of PM Edward Heath. His preferred chancellor, Iain Macleod, had died within a month of taking office in 1970, and Heath was thenceforth the driving force in economic policy.
Continue reading...
+ Mini-budget 2022
+ Politics past
+ Economic growth (GDP)
+ Economics
+ Tax and spending
+ Business
+ Politics
+ UK news
+ Edward Heath
+ Kwasi Kwarteng
+ Conservatives
+ Sun, 25 Sep 2022 09:00:30 GMT
+ https://www.theguardian.com/uk-news/2022/sep/25/why-the-barber-boom-that-kwasi-kwartengs-mini-budget-recalls-was-destined-for-disaster
+
+ Photograph: William Lovelace/Getty Images
+
+
+ Photograph: William Lovelace/Getty Images
+
+ William Keegan
+ 2022-09-25T09:00:30Z
+
+
+ Forget trickle down, what the UK needs is middle-out economics
+ https://www.theguardian.com/politics/2022/sep/25/forget-trickle-down-what-the-uk-needs-is-middle-out-economics
+
Liz Truss is banking on a failed policy. The focus should be on the real driving force behind economic growth
As millions of British families struggle to pay the costs of food, fuel and rent, Liz Truss and her chancellor, Kwasi Kwarteng, have unveiled their economic plan: cut taxes for corporations and rich people.
Continue reading...
+ Economic policy
+ Economics
+ Economic growth (GDP)
+ Business
+ Politics
+ UK news
+ Liz Truss
+ Kwasi Kwarteng
+ Sun, 25 Sep 2022 09:00:30 GMT
+ https://www.theguardian.com/politics/2022/sep/25/forget-trickle-down-what-the-uk-needs-is-middle-out-economics
+
+ Photograph: WPA/Getty Images
+
+
+ Photograph: WPA/Getty Images
+
+ Eric Beinhocker and Nick Hanauer
+ 2022-09-25T09:00:30Z
+
+
+ Steve Coogan sets his sights on the life of a fugitive king
+ https://www.theguardian.com/culture/2022/sep/25/steve-coogan-sets-his-sights-on-the-life-of-a-fugitive-king
+
Inspired by a book by Princess Diana’s brother, the actor is researching flight of Charles II from Oliver Cromwell’s troops
Steve Coogan, fresh from the story of the discovery of Richard III’s bones in The Lost King, is now to tackle the life of King Charles, with the help of Princess Diana’s brother, Charles Spencer, and his longtime writing collaborator, screenwriter Jeff Pope. The monarch in question is not, however, our current king, but one of his predecessors, Charles II.
“Rather than a sequel to The Lost King, I suppose you could call it a prequel to where we are now, with King Charles III,” the actor told the Observer.
Continue reading...
+ Steve Coogan
+ Culture
+ Alan Partridge
+ Monarchy
+ UK news
+ Television & radio
+ Sun, 25 Sep 2022 09:00:29 GMT
+ https://www.theguardian.com/culture/2022/sep/25/steve-coogan-sets-his-sights-on-the-life-of-a-fugitive-king
+
+ Photograph: Dave J Hogan/Getty Images
+
+
+ Photograph: Dave J Hogan/Getty Images
+
+ Vanessa Thorpe
+ 2022-09-25T09:00:29Z
+
+
+ Hybrid working may hold back women’s careers, say managers
+ https://www.theguardian.com/society/2022/sep/25/hybrid-working-may-hold-back-womens-careers-say-managers
+
Research suggests employers are overlooking people – particularly women - who work from home
The shift towards hybrid working could be holding back women’s career progression, as research suggests employers are overlooking people who spend more time working from home.
Experts have raised concerns that the post-Covid return to work is entrenching the gender pay and promotion gap, with employers failing to monitor its impact or properly design jobs for hybrid and remote working.
This especially affects women, who are more likely to choose flexible hours or work from home for childcare reasons. Male managers are significantly more likely to mostly or completely work from the office (48% v 38%), according to a survey of 1,300 managers from the Chartered Management Institute (CMI).
Two in five (40%) managers surveyed said they had already observed opinion or behaviours suggesting an inequality between those who work flexibly and those whodo not. Female managers were more likely than their male counterparts to believe hybrid working could negatively impact career progression.
Anthony Painter, the director of policy at the CMI, said: “Women could end up in a lose-lose situation if employers aren’t careful, needing to balance work and home life through flexible working but missing out on many opportunities that arise through in-person office interaction. That is intolerable and damaging for women and employers alike.”
Continue reading...
+ Women
+ Society
+ UK news
+ Work & careers
+ Money
+ Sun, 25 Sep 2022 08:27:50 GMT
+ https://www.theguardian.com/society/2022/sep/25/hybrid-working-may-hold-back-womens-careers-say-managers
+
+ Photograph: Joe Giddens/PA
+
+
+ Photograph: Joe Giddens/PA
+
+ Rachel Hall
+ 2022-09-25T08:27:50Z
+
+
+ Loafers, plaid skirts, varsity jackets … preppy look makes autumn comeback
+ https://www.theguardian.com/fashion/2022/sep/25/preppy-aesthetic-autumn-fashion-pastels-loafers
+
The trend can be seen everywhere – from the catwalk and films, to celebrities such as Zendaya and Kendall Jenner – and even Ikea
The preppy look, first popularised in the 50s, is back, with staples such as varsity jackets and loafers in vogue again this autumn.
The trend can be seen on the catwalk – at shows from the likes of Celine and Coach – and on celebrities such as Zendaya, Kendall Jenner and Hailey Bieber.
Continue reading...
+ Fashion
+ UK news
+ Life and style
+ Sun, 25 Sep 2022 08:00:27 GMT
+ https://www.theguardian.com/fashion/2022/sep/25/preppy-aesthetic-autumn-fashion-pastels-loafers
+
+ Photograph: Kim Simms/Netflix
+
+
+ Photograph: Kim Simms/Netflix
+
+ Lauren Cochrane
+ 2022-09-25T08:00:27Z
+
+
+ Head of World Bank under pressure after White House condemns his ‘climate denial’ comments
+ https://www.theguardian.com/environment/2022/sep/25/head-of-world-bank-under-pressure-after-white-house-condemns-his-climate-denial-comments
+
David Malpass apologises after saying he ‘doesn’t know’ if he accepts climate science
David Malpass, president of the World Bank, faces an uncertain future this week, after the White House joined a chorus of influential figures in condemning his apparent climate denialism.
Malpass remains in post for now but under severe pressure, despite issuing an apology and trying to explain his refusal last week to publicly acknowledge the human role in the climate crisis.
Continue reading...
+ Climate science scepticism and denial
+ Climate crisis
+ World Bank
+ US news
+ Environment
+ Joe Biden
+ Sun, 25 Sep 2022 08:00:28 GMT
+ https://www.theguardian.com/environment/2022/sep/25/head-of-world-bank-under-pressure-after-white-house-condemns-his-climate-denial-comments
+
+ Photograph: Issei Kato/AP
+
+
+ Photograph: Issei Kato/AP
+
+ Fiona Harvey, Environment Correspondent
+ 2022-09-25T08:00:28Z
+
+
+ ‘They’ve been an afterthought’: millions of elderly Americans still vulnerable as pandemic caution wanes
+ https://www.theguardian.com/world/2022/sep/25/covid-19-older-americans-risk
+
For older people, loneliness and the stress of weighing risk of ordinary activities have taken an additional toll
It was Mother’s Day in May 2020, and an elderly woman lay dying in a Rhode Island nursing home. Her children couldn’t visit because of Covid, and as much as Adelina Ramos, her certified nursing assistant, longed to provide comfort from her bedside, she had to leave, even though she could see the woman was slipping away.
She had 25 other patients to care for that day.
Continue reading...
+ Coronavirus
+ Older people
+ US news
+ House of Representatives
+ Sun, 25 Sep 2022 07:00:28 GMT
+ https://www.theguardian.com/world/2022/sep/25/covid-19-older-americans-risk
+
+ Photograph: Jae C Hong/AP
+
+
+ Photograph: Jae C Hong/AP
+
+ Melody Schreiber
+ 2022-09-25T07:00:28Z
+
+
+ QAnon follower who chased officer on January 6 convicted of felonies
+ https://www.theguardian.com/us-news/2022/sep/24/douglas-jensen-capitol-attack-january-6-qanon
+
Douglas Jensen could face more than 50 years in prison after federal jury found him guilty
A QAnon conspiracy theorist who led a pack of Donald Trump supporters that chased a solitary police officer around the US Capitol on the day of the January 6 attack has been found guilty of several felonies.
Douglas Jensen – the bearded 43-year-old Iowa man who appeared in several media photos of the attack while wearing a black T-shirt with a large “Q” – could in theory face more than 50 years in prison after a federal jury in Washington DC convicted him on Friday, US justice department prosecutors said in a statement.
Continue reading...
+ US Capitol attack
+ US news
+ Iowa
+ Washington DC
+ Sun, 25 Sep 2022 05:00:25 GMT
+ https://www.theguardian.com/us-news/2022/sep/24/douglas-jensen-capitol-attack-january-6-qanon
+
+ Photograph: Roberto Schmidt/AFP/Getty Images
+
+
+ Photograph: Roberto Schmidt/AFP/Getty Images
+
+ Ramon Antonio Vargas
+ 2022-09-25T05:00:25Z
+
+
+ Chicken farm giant linked to River Wye decline was sued over water blight in US
+ https://www.theguardian.com/environment/2022/sep/25/chicken-farm-giant-linked-to-river-wye-decline-was-sued-over-water-blight-in-us
+
Cargill was taken to court 20 years ago in Oklahoma over the same pollution issue it is now linked to in UK
One of the world’s biggest food giants with a supply chain linked to the ecological decline of the River Wye faced claims over similar pollution scandals in the US, the Observer can reveal.
Campaigners warned two years ago that the clear waters of the Wye, one of Britain’s best-loved rivers, were being blighted by thick green algae blooms linked to poultry production.
Continue reading...
+ Rivers
+ Farming
+ Chicken
+ Food
+ Pollution
+ Food & drink industry
+ Water
+ Oklahoma
+ Supermarkets
+ US news
+ Tesco
+ Asda
+ McDonald's
+ Sun, 25 Sep 2022 05:00:24 GMT
+ https://www.theguardian.com/environment/2022/sep/25/chicken-farm-giant-linked-to-river-wye-decline-was-sued-over-water-blight-in-us
+
+ Photograph: travellinglight/Alamy
+
+
+ Photograph: travellinglight/Alamy
+
+ Robin Eveleigh and Jon Ungoed-Thomas
+ 2022-09-25T05:00:24Z
+
+
+ Nasa delays Artemis 1 moon rocket launch again as tropical storm Ian looms
+ https://www.theguardian.com/science/2022/sep/25/nasa-delays-artemis-1-moon-rocket-launch-again-as-tropical-storm-ian-looms
+
Third delay in the past month for test flight as technical issues and weather hamper US effort to return to the moon after five decades
Nasa is skipping Tuesday’s launch attempt of its new moon rocket over concerns about a tropical storm headed to Florida that could become a major hurricane.
It’s the third delay in the past month for the lunar-orbiting test flight featuring mannequins but no astronauts, a follow-up to Nasa’s Apollo moon-landing program of a half-century ago.
Continue reading...
+ Nasa
+ US news
+ Space
+ Florida
+ Sun, 25 Sep 2022 01:40:30 GMT
+ https://www.theguardian.com/science/2022/sep/25/nasa-delays-artemis-1-moon-rocket-launch-again-as-tropical-storm-ian-looms
+
+ Photograph: John Raoux/AP
+
+
+ Photograph: John Raoux/AP
+
+ Staff and agencies
+ 2022-09-25T01:40:30Z
+
+
+ Florida prepares for hurricane as tropical storm Ian grows over Caribbean
+ https://www.theguardian.com/us-news/2022/sep/24/florida-tropical-storm-ian-hurricane-possible
+
Cayman Islands and Jamaica brace while Florida governor declares emergency, with storm headed to state by midweek
Florida residents on Saturday were bracing for a heavy tropical storm that weather experts warn could become a major hurricane.
Tropical storm Ian is poised to intensify into a hurricane within a few days after forming on Friday over the southern Caribbean. The storm could cross over into parts of Cuba before heading to Florida by the middle of next week, according to forecasts.
Continue reading...
+ Florida
+ Hurricanes
+ US news
+ Natural disasters
+ Extreme weather
+ Sat, 24 Sep 2022 20:50:30 GMT
+ https://www.theguardian.com/us-news/2022/sep/24/florida-tropical-storm-ian-hurricane-possible
+
+ Photograph: AP
+
+
+ Photograph: AP
+
+ Gloria Oladipo
+ 2022-09-24T20:50:30Z
+
+
+
diff --git a/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_ukrnet.xml b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_ukrnet.xml
new file mode 100644
index 000000000..1c9962e17
--- /dev/null
+++ b/fqnews2/app/src/androidTest/resources/com/nononsenseapps/feeder/model/rss_ukrnet.xml
@@ -0,0 +1,160 @@
+
+
+
+
+ https://suspilne.media/
+
+
+ Fri, 22 Dec 2023 01:04:55 +0200
+ 5
+
+
+ https://suspilne.media/645026-torgivla-miz-rosieu-ta-kitaem-u-2023-roci-perevisila-200-mlrd-dolariv-new-york-times/
+
+ Fri, 22 Dec 2023 01:04:55 +0200
+ Про це пише газета The New York Times.
Дилерський центр, який працює на кордоні Китаю з Росією та продає вантажівки, за минулий рік подвоїв продажі завдяки російським клієнтам. Китайський експорт до свого сусіда настільки сильний, що цього літа китайські будівельники побудували склади та 20-поверхові офісні вежі на кордоні, пишуть журналісти газети.
Епіцентром цих продажів стало прикордонне місто Хейхе. Європейські санкції проти РФ змусили країну-агресорку перейти на китайський ринок для закупівлі всього, від автомобілів до комп’ютерних мікросхем. Своєю чергою, Москва продавала нафту та природний газ Пекіну з великими знижками.
Російських продовольчих товарів у китайських супермаркетах стало набагато більше, а торгівля між двома країнами перевищила 200 мільярдів доларів за перші 11 місяців цього року, рівень, якого країни не очікували досягти до 2024 року.
Війна Росії в Україні також отримала позитивний імідж від Китаю. Державні ЗМІ постійно поширюють російську пропаганду в Китаї та по всьому світу. Російська культура просочилася у китайську і самі китайці почали фотографуватися у національному російському вбранні.
Експорт Китаю до Росії зріс на 69% за перші 11 місяців 2023 року порівняно з тим самим періодом до вторгнення в Україну.
"Збереження та розвиток китайсько-російських відносин є стратегічним вибором, зробленим обома сторонами на основі фундаментальних інтересів двох народів", — сказав китайський лідер Сі Цзіньпін.
Сполучені Штати рішуче застерегли Китай від відправки озброєнь до Росії, і поки не знайшли доказів того, що вони це роблять. Але деяке цивільне обладнання, яке Китай продає Росії, як-от безпілотники та вантажівки, також використовується у військових цілях.
Між країнами проведені трубопроводи, які потрібні для одного з найважливіших товарів, якими вони торгують — енергії. Експорт дешевих російських газу та нафти, які знаходяться під санкціями Заходу, допомогли китайським заводам конкурувати на світових ринках, тим самим витісняючи виробників якісних європейських товарів.
Росія нарощує до Китаю поставки природного газу через свій трубопровід "Сила Сибіру" та веде переговори про будівництво другого, який транспортував би газ із родовищ, які обслуговували Європу до війни проти України.
Китай і Росія також домовилися менше ніж за три тижні до вторгнення побудувати третій, менший трубопровід, який транспортуватиме газ. Його будівництво відбувається невпинно, йдеться у матеріалі.
]]>
+
+
+
+ https://suspilne.media/644674-u-sahnovsini-pohovaut-molodsogo-serzanta-akij-vouvav-na-bahmutskomu-napramku/
+
+ Fri, 22 Dec 2023 00:41:44 +0200
+ Про втрату повідомили у громаді.
"Олексій Миколайович боронив Україну в одній з найгарячіших точок боїв — Бахмутському районі", — сказано в повідомленні.
Загиблого поховають о 12:00 22 грудня у селищі Сахновщині
Підписуйтесь на новини Харкова та області в Facebook, Viber, Instagram, Telegram, Youtube
]]>
+
+
+
+ https://suspilne.media/645038-vibuhi-na-hmelnicini-22-grudna-so-vidomo/
+
+ Fri, 22 Dec 2023 00:25:33 +0200
+ Про це повідомив перший заступник очільника Хмельницької ОВА Сергій Тюрін.
"У Хмельницькому районі працюють сили ППО", — написав Тюрін.
Повітряна тривага на Хмельниччині почалась 21 грудня о 23:25.
Слідкуйте за новинами Суспільного Хмельницький у Telegram, Viber, YouTube, Instagram та Facebook.
]]>
+
+
+
+ https://suspilne.media/sport/645020-anatolij-trubin-z-benfikou-vijsov-u-final-cotiroh-kubka-portugalskoi-ligi-ak-zigrav-ukrainec/
+
+ Fri, 22 Dec 2023 00:09:20 +0200
+ Анатолій Трубін вдруге зіграв за "Бенфіку" в Кубку ліги. Український голкіпер взяв участь у поєдинку проти АВС з другого дивізіону Португалії.
Трубін перейшов до "Бенфіки" у серпні 2023 року. З того моменту український голкіпер закріпився в основі команди й зіграв 18 матчів у всіх турнірах, сім з яких завершив без пропущених м'ячів.
В Кубку ліги українець дебютував у кінці жовтня, допомігши "Бенфіці" здолати "Ароуку" (2:0) в першому матчі групи третього раунду. Другим суперником команди Трубіна став АВС — для виходу у півфінал лісабонців влаштовувала й нічия.
Як зіграв Трубін На старті матчу Трубін здійснив перший сейв, забравши м'яч до рук після удару півзахисника АВС Бернарду з лінії штрафного майданчика. На 21-й хвилині українець пропустив: форвард гостей Джон Меркадо завдав потужного удару з-за меж штрафного у дальній кут воріт, Трубін не зумів дотягнутися до м'яча.
Втім, "Бенфіка" не дозволила супернику з нижчого дивізіону піти на перерву з перевагою у рахунку — голи хавбеків Анхеля Ді Марії та Жоау Маріу вивели "орлів" вперед. На початку другого тайму Трубін відзначився другим сейвом у матчі: відбив удар автора голу Меркадо по центру воріт з-за меж штрафного. А наприкінці матчу парирував небезпечний удар нападника Васко Лопеса після подачі з кутового. Після перерви "Бенфіка" зуміла збільшити перевагу у рахунку: голом відзначився форвард Тьягу Гувея, також у власні ворота забив захисник АВС Антоні Коррея. У підсумку лісабонці здобули розгромну перемогу — 4:1.
Статистика Трубіна за повний матч: три сейви, 21 точна передача з 26, два точні дальні паси з семи. Що означає перемога "Бенфіки" Команда Трубіна виграла свою групу у третьому раунді Кубка ліги та вийшла у Фінал чотирьох турніру. Суперником "Бенфіки" у півфіналі стане "Ешторіл", який виграв групу з "Порту" та "Лейшойшем". Інша півфінальна пара наразі не визначена — за перше місце в групі А борються "Каса Пія" і "Брага", в групі С — "Спортінг" і "Тондела". Фінал чотирьох відбудеться у січні 2024 року в Лейрії. Півфінали пройдуть 23-24 січня, фінал — 27 січня. "Бенфіка" Анатолія Трубіна: що відомо "Бенфіка" — володар рекордних семи титулів Кубка ліги в історії турніру. Востаннє "орли" вигравали трофей у сезоні 2015/16. У турнірній таблиці чемпіонату Португалії "Бенфіка" з 33 очками йде на другому місці, поступаючись "Спортінгу" (34). Наступний матч колектив Трубіна проведе в чемпіонаті Португалії 29 грудня — проти "Фамалікана", сьомої команди в таблиці. Лісабонці посіли третє місце у групі Ліги чемпіонів. В останньому турі "Бенфіка" перемогла "Зальцбург" (3:1) та продовжить виступи в єврокубках у Лізі Європи, де у стикових матчах зіграє з "Тулузою".]]>
+
+
+
+ https://suspilne.media/645024-nicna-ataka-na-kiiv-u-misti-prolunali-vibuhi/
+
+ Thu, 21 Dec 2023 23:42:31 +0200
+ О 23:06 у Києві оголосили повітряну тривогу, а згодом у місті пролунала серія вибухів. Опісля Київська міська військова адміністрація повідомила, що у місті працюють сили ППО.
У Соломʼянському районі Києва влучання у житловий будинок, повідомив міський голова Віталій Кличко. На місці працюють рятувальники.
Близько опівночі у столиці знову пролунала серія вибухів, повідомили кореспонденти Суспільного.
Згодом у КМВА показали наслідки влучання у багатоповерхівку Києва. Наразі інформації щодо постраждалих не надходила.
Віталій Кличпо повідомив про одну постраждалу людину у Соломʼянському районі. Її госпіталізували.
Кількість постраждалих внаслідок падіння уламків збитого дрона на багатоповерхівку у Соломʼянському районі Києва зросла до двох. Міський голова Кличко повідомив, що постраждалій людині медики надали допомогу на місці.
У КМВА повідомили про ліквідацію загоряння у багатоповерховому житловому будинку в Соломʼянському районі. Попередньо, є руйнація між 24 і 25 поверхами.
В Голосіївському районі є потрапляння уламку в багатоповерхівку. В Дарницькому районі — падіння уламків на приватний житловий будинок. Інформація про потерпілих та руйнування встановлюється.
Новина оновлюється...
]]>
+
+
+
+ https://suspilne.media/645010-rf-vdarila-po-sahtah-na-doneccini-zelenskij-moze-zustritisa-z-orbanom-667-den-vijni-onlajn/
+
+ Thu, 21 Dec 2023 23:32:32 +0200
+ У Києві та низці областей оголошена повітряна тривога.
Над Сумщиною протиповітряна оборона збила безпілотник, повідомили в ОВА.
У місті та області триває повітряна тривога.
У Києві чутно звуки вибухів, повідомляють кореспонденти Суспільного.
Міський голова столиці Віталій Кличко підтвердив влучання в житловий будинок у Соломʼянському районі Києва. Палає на верхніх поверхах. Екстрені служби на місці, додав він.
У КМВА показали наслідки влучання у багатоповерхівку Києва. Наразі інформації щодо постраждалих не надходила. В Києві триває повітряна тривога.
У Соломʼянському районі Києва госпіталізували одного постраждалого, повідомив міський голова Віталій Кличко. Там уламки збитого дрона влучили у багатоповерхівку.
На Хмельниччині працюють сили ППО, повідомив перший заступник керівника ОВА Сергій Тюрін. Він уточнив, що протиповітряна оборона спрацювала у Хмельницькому районі.
Уламки збитих безпілотників попередньо зафіксували в Голосіївському і Дарницькому районах Києва, повідомили в КМВА. Інформація щодо руйнувань та потерпілих уточнюється. Також відомо про падіння уламків на багатоповерхівку у Соломʼянському районі столиці. Там госпіталізували одну людину.
]]>
+
+
+
+ https://suspilne.media/644168-cergovij-obstril-hersona-rozminuvanna-teritorij-666-den-vijni-hronika-podij-v-hersonskij-oblasti/
+
+ Thu, 21 Dec 2023 23:17:42 +0200
+ 666 день повномасштабного вторгнення Росії в Україну. Російська армія продовжує обстрілювати Херсон та Херсонську область з різних видів озброєння. Водночас Сили оборони створили кілька плацдармів на лівому березі Дніпра і продовжують контрбатарейну боротьбу, знищують командні пункти, склади, зброю та техніку військ РФ.
Суспільне слідкує за всіма подіями, що відбуваються в регіоні. Інформація оновлюється. Тут читайте новини за 20 грудня, відеосюжети та дайджести новин — на YouTube Суспільне Херсон.
Головне на цей час Зранку російські військові знову обстріляли Херсон. Поранена одна людина. Також російські війська завдали авіаційного удару в районі Кринок. На Херсонщині в ніч на 20 грудня під час чергової дронової атаки Сили оборони знищили шість російських БпЛА типу "Shahed-131/136. На Херсонщині розмінували майже 23 % правобережжя — понад 156 тисяч гектарів території. З них 133 тисячі — це поля. На цій площі піротехніки знищили 135 тисяч мін, розтяжок, снарядів. У тимчасово окупованому Генічеську на Херсонщині військові РФ вночі обшукували місцевих жителів. Людей, у яких знайшли книги українських письменників, затримали. Правоохоронці повідомили про підозру у колабораціонізмі ще одній жительці Херсонщини. Під час окупації вона погодилась організувати псевдореферендум в селі Шевченко: складала так звані "списки виборців" та агітувала місцевих жителів голосувати за приєднання до РФ
Минулої доби військові РФ завдали авіаційних ударів по Кринки та Ольгівці. Під артилерійським вогнем опинилися близько 100 населених пунктів з семи областей, зокрема, в Херсонській, йдеться у ранковому зведенні Генштабу ЗСУ.
Протягом дня по Херсону та області буде хмарно з проясненнями, опадів не очікується. Температура повітря коливатиметься від 4° до 9° тепла, повідомляє в Telegram обласний гідрометцентр.
Під час нічної дронової атаки в ніч на 21 грудня 2023 року на Херсонщині Сили оборони знищили три російські ударні безпілотники типу "Shahed-131/136", йдеться в їх Telegram.
Упродовж минулої доби російські війська випустили по Херсонській області 687 снарядів з різного виду озброєння. Поцілили по території заводу в обласному центрі. Поранені чотири людини, повідомив в Telegram голова ОВА Олександр Прокудін.
20 грудня 2023 року Сили оборони півдня знищили батарею систем "Ураган": три машини пуску та три машини до заряджання, яким російські військові обстрілювали Херсонщину.
+Про це в ефірі телемарафону "Суспільне. Спротив" повідомила начальниця координаційного пресцентру Сил оборони півдня України Наталія Гуменюк.
Внаслідок російської атаки по Херсону 20 грудня 2023 року знищений склад гуманітарної допомоги.
Про це в ефірі телемарафону "Суспільне. Спротив" розповіла виконувачка обов'язків голови обласної організації Товариства червоного хреста України Лариса Марченко.
За її словами, знищені всі запаси гуманітарної допомоги для жителів Херсонської області, які планували роздати протягом місяця
Херсонська область - повітряна тривога!
Внаслідок нічого обстрілу РФ Херсона пошкоджені контактні мережі, через це сьогодні не вийдуть на маршрути тролейбуси. Над усуненням пошкоджень працюють фахівці, повідомив в Telegram керівник МВА Мрочко.
Херсонська область - відбій повітряної тривоги!
Захищаючи Україну 11 грудня 2023 року від поранень загинув військовий з Каланчака Херсонської області Богдан Вознюк, повідомляє на сторінці у Facebook Каланчацька селищна військова адміністрація Скадовського району.
Вночі під російською атакою опинився один з медичних закладів Херсона. Снаряд пробив стіну на останньому поверсі, є руйнування в одному з відділень закладу. Також влучили по одному з будинків. Поранених немає, повідомив голова ОВА Прокудін.
Працівники КП "Херсонелектротранс" відновили контактну мережу. 21 тролейбус вийшов на маршрути, повідомив керівник МВА Мрочко.
Вчора близько 18:40 армія РФ 10 разів атакувала Шляхове на Херсонщині. Поранена 69-річна жінка, її у важкому стані доправили в лікарню, повідомляє ОВА.
Вчора також російська армія скинула керовану авіабомбу на Ольгівку Херсонської області. Вщент зруйнований освітній заклад, повідомляє поліція Херсонської області.
Армія РФ вчергове скинула з дрона вибухівку на Берислав Херсонської області. Поранений чоловік, медики надали йому необхідну меддопомогу, далі він лікуватиметься амбулаторно, повідомляє ОВА.
Російські військові випустили по одному з населених пунктів Херсонської області три ракети. Це сталось 13 грудня 2023 року.
+За словами місцевої жительки Тетяни Борисової, військові РФ атакували село ракетами близько опівночі.
+
+"Прилетіли ракети три: одна в лікарню, друга до мене в будинок, третя — у будинок сусідів. Загинула сусідка, поранені мої свекор та свекруха, ми дивом живі залишились. Я не знаю, як ми звідти змогли вилізти", — каже жінка.
Херсонська область - повітряна тривога!
Сьогодні у Херсоні попрощались з загиблими українськими захисниками Володимиром Бабенко та Миколою Колесником.
Володимир Бабенко загинув на Харківщині. У нього залишились дружина та 8-річний син. Микола Колесник поліг у бою на Донеччині, у нього залишились сестра та племінники.
Російська армія обстріляла Тягинку на Херсонщині. Загинула 54-річна жінка, яка йшла вулицею. Про це в Telegram повідомив голова ОВА Олександр Прокудін.
Херсонська область - відбій повітряної тривоги!
Херсонська область - повітряна тривога!
Благодійна організація ADRA Ukraine передала Дар'ївській громаді мобільну очисну станцію води. За годину система робить придатною для споживання 200 л води. Мобільна станція працюватиме за графіком у Дар’ївці, Понятівці та Токарівці, повідомила у Telegram ОВА.
На ТОТ Херсонщини військові РФ проводять нічні обшуки та арешти. В оселях людей шукають докази проукраїнської позиції. Жителів арештовують та відвозять на допити до катівень. Підставою для затримання можуть бути жовті та сині кольори побутових речей, книги українських авторів, повідомили в ГУР.
Херсонська область - відбій повітряної тривоги!
Херсонська область - повітряна тривога!
Сили оборони півдня показали, як збили шахед армії РФ вночі 21 грудня. Бойова робота тривала понад сім годин. Воїни Херсонської зенітної ракетної бригади знищили чотири "Shahed-131/136" на південному напрямку.
Херсонська область - відбій повітряної тривоги!
У Херсоні чутно вибухи, повідомив керівник МВА Мрочко.
Від початку обов'язкової евакуації з Херсонщини вивезли 784 дитини. Станом на 21 грудня в небезпечних населених пунктах залишаються 134 дитини. Про це під час пресконференції повідомив голова ОВА Олександр Прокудін.
За його словами, є такі батьки, які досі не хочуть евакуювати дітей, хоча їм показують, і яких умовах вони зможуть тимчасово жити. Також він додав, за 2023 рік з Херсонщини евакуювали 42 тисячі людей, з них 5800 дітей.
"Ми оголосили у примусовий спосіб у деяких 23 населених пунктах. Хмельницький, Одеса, Миколаїв, Київ, Кропивницький, Івано-Франківська та Чернівецька області приймають наших людей. Деякі навіть харчуються безплатно в закладах. Родинам надають гуманітарну допомогу та виплати. Не розумію цих батьків, які не вивозять дітей. Вчора, 20 грудня, був у лікарні, де внаслідок обстрілів РФ поранені три дівчинки, які маленькі, не винні, а батьки не хочуть їх евакуювати. Їх квартиру розтрощили, ми за день привели житло до ладу. Але навіть після обстрілу хочуть залишатись у своїй хаті. Хоча умови, куди ми відправляємо людей, бувають навіть кращі", — говорить Прокудін.
Протягом доби на Херсонському напрямку військові РФ завдали авіаудару в районі Кринок. З артилерії обстріляли Антонівку та Херсон.
Також здійснили 11 спроб штурмових дій, отримали відсіч та зазнали значних втрат, повідомив у Facebook Генштаб ЗСУ.
Херсонська область - повітряна тривога!
Російські військові 21 грудня продовжили обстрілювати правобережну частину Херсонської області. Вночі армія РФ завдала чергових ударів по обласному центру. Були пошкоджені будинки, гаражі, паркани, лінії електропередач.
Сьогодні, 21 грудня, в Одесі попрощалися із загиблим на війні херсонцем, військовослужбовцем 38 бригади морської піхоти Климом Мишанчуком. Чоловік загинув 14 грудня 2023 року на Херсонському напрямку під час виконання бойового завдання.
До початку повномасштабного вторгнення він працював моряком та перебував за кордоном. Чоловік повернувся до України та добровільно пішов до лав ЗСУ. Він загинув 14 грудня 2023 року на Херсонському напрямку під час виконання бойового завдання.
У загиблого захисника Клима Мишанчука залишилися мати, дружина і семирічна дочка Валерія.
]]>
+
+
+
+
+ https://suspilne.media/645016-valerij-kozir-z-grozi-vzav-opiku-nad-troma-onukami-ihni-batki-zaginuli-pid-cas-udaru-rf-po-kafe-suspilne-ludi/
+
+ Thu, 21 Dec 2023 23:01:29 +0200
+ Дарину, Дмитра та Анастасію Пантелеєвих після загибелі їхніх батьків під час удару по Грозі 5 жовтня взяв під опіку дідусь — 61-річний Валерій Козир. Як родина Пантелеєвих-Козирів переживає втрату половини сімʼї — дивіться у відео Суспільного. Що відомо про ракетний удар РФ по селу Грозі на Харківщині
Село Гроза розташоване у Куп'янському районі, за 35 кілометрів від лінії фронту. Вибух там пролунав 5 жовтня о 13:24.
Російські окупанти вдарили ракетою "Іскандер" по приміщенню магазину-кафе. Загинули 59 людей, удар став найбільшим за кількістю жертв з початку повномасштабної війни на Харківщині.
Село перебувало в окупації у 2022 році. За даними прокуратури Харківської області, на жовтень 2023 року у Грозі проживали близько сотні людей.
Понад 50 людей перевірили на причетність до наведення ракети на кафе в Грозі на Харківщині, повідомив Сергій Болвінов.
СБУ підозрює у наведенні ракети місцевих жителів — 30-річного Володимира Мамона та його молодшого брата 23-річного Дмитра Мамона, які під час окупації регіону перейшли на бік РФ. Їм заочно повідомили про підозру у державній зраді.
Діна Носова почала виконувати обов'язки старости з 1 грудня. Її попередник — Олександр Нечволод загинув під час ракетного удару 5 жовтня.
]]>
+
+
+
+ https://suspilne.media/645014-zaava-umerova-pro-mobilizaciu-ta-orban-proti-ukraini-v-es-ta-nato-suspilne-dajdzest/
+
+ Thu, 21 Dec 2023 22:49:14 +0200
+ Чи буде призов з-за кордону: в Міноборони пояснили заяву Умєрова. Українські парламентарі легалізували медичний канабіс, " Київстар" обіцяє компенсацію абонентам та підсумки пресконференції прем’єра Угорщини Орбана, який заявив, що боїться членства України в НАТО та ЄС.
Головні новини четверга 21 грудня — у дайджесті Суспільного "Несеться".
]]>
+
+
+
+ https://suspilne.media/645006-na-lvivsini-cerez-negodu-na-dvoh-dorogah-obmezili-ruh-vantazivok/
+
+ Thu, 21 Dec 2023 22:36:24 +0200
+ Про це повідомили в Telegram-каналі Патрульної поліції Львівської області.
Обмеження русі діють із 21 грудня із 21:30 для вантажних автомобілів:
на 620-750 км автодороги М-06 Київ — Чоп; на 80-195 км автодороги Н-13 Львів — Самбір — Ужгород.
Про скасування обмежень додатково повідомлять.
"Йдеться про ділянки доріг М-06 Київ – Чоп від села Козьова до Івашківського перевалу та Н-13 Львів – Самбір – Ужгород від Старого Самбора до Ужгородського перевалу на межі Львівської і Закарпатської областей", — уточнив начальник Львівської ОВА Максим Козицький.
У патрульній поліції просять водіїв скористатися місцями для відстою. На ділянках працює снігоприбиральна техніка.
Синоптики прогнозують погіршення погодних умов на Львівщині 22 грудня, зокрема мокрий сніг, хуртовини та сильний вітер.
]]>
+
+
+
+ https://suspilne.media/644990-prezident-energoatomu-kotin-pid-cas-vijni-oselivsa-u-maetku-za-7-mln-grn-rozsliduvanna-shem/
+
+ Thu, 21 Dec 2023 22:30:30 +0200
+ Про це йдеться у розслідування проєкту "Схеми".
Розслідувачі виявили, що елітну нерухомість та землю під Києвом під час війни придбала теща керівника "Енергоатому", при цьому офіційно не маючи на те власних доходів.
Наразі у будинку проживає сам Петро Котін: його службовий автомобіль журналісти неодноразово бачили біля маєтку. Сам будинок "Схемам" вдалося вирахувати за допомогою відкритого публічного акаунта доньки Котіна.
Розслідувачам вдалося отримати доступ до договору купівлі-продажу цього будинку від 8 червня 2023 року: виявилось, що будинок площею майже 300 квадратних метрів та земля під ним обійшлися 70-річній тещі Котіна у майже 7 млн гривень.
Крім того, зазначається, що теща Котіна володіє ще трьома земельними ділянками на Київщині загальною вартістю близько 40 тисячі доларів станом на 2021 рік, коли дані ділянки були придбані.
При цьому журналісти з'ясували, що з 2000 по 2009 рік теща президента "Енергоатому" отримала 79 тисяч гривень заробітної плати. Зараз вона, ймовірно, отримує пенсійні виплати й іншого майна або бізнесу, який можна продати, за даними "Схем" не має. Від коментарів жінка відмовилася.
Сам Котін у письмовому коментарі "Схемам" заявив, що його теща придбала нерухомість, використовуючи власні заощадження, запозичені кошти, а також кошти, що її родичі довірили їй вивезти з окупованих територій.
"За її словами, головною причиною прийняття нею такого рішення були прийнятні ціни, за якими попередні власники запропонували на продаж це майно", — написав Котін.
Він додав, що не приховує те, що відвідує це помешкання, і що дану інформацію зазначить у своїй декларації, "термін подання якої ще не настав".
Суспільне намагається отримати коментар у прессекретаря очільника "Енергоатома".
]]>
+
+
+
+ https://suspilne.media/644996-v-odesi-poprosalis-iz-zagiblim-na-vijni-hersoncem-klimom-misancukom/
+
+ Thu, 21 Dec 2023 22:28:53 +0200
+ Про це Суспільному розповіла його сестра Олена Покровська.
За її словами, Клим був 43 дні в навчальному центрі і чотири дні встиг бути на позиції. Присяга в нього була 11 грудня.
Військовий народився в Одесі, потім у шестирічному віці разом з матір’ю переїхав жити до Херсона, розказала його сестра. Там здобув освіту моряка.
"Він був справжній професіонал. Його поважали дорослі колеги. Вважали його хлопцем серйозним і відповідальним", — каже вона.
Загиблий працював другим штурманом і на початок повномасштабного вторгнення Російської Федерації перебував за кордоном у морському рейсі.
"Не міг бути осторонь. Йому просто треба було закінчити свою роботу до кінця в компанії. Він добровільно приїхав до України. Пішов сам у військкомат, пішов до лав ЗСУ. Така в нього була громадянська позиція, що він повинен, бо сказав так: “Як я буду дивитися в очі своєї дитини. Що я їй скажу?", — говорить Олена.
Сестра загиблого розповіла, що її брат Клим Мишанчук був добрим, відкритим та щирим, із загостреним відчуттям справедливості.
“Все в нього складалося так, що на його б місці, мабуть, інший би чоловік, мабуть би і не пішов сам, бо все складалося дуже добре в його житті. Але він зробив свій чоловічий складний вибір. Ми пишаємося ним, дуже вдячні йому за це. Побратими, з якими він разом проходив навчання, казали, що Клим був справжнім чоловіком і надійним побратимом", — каже жінка.
У загиблого захисника Клима Мишанчука залишилися мати, дружина і семирічна дочка Валерія.
На Донецькому напрямку 8 листопада 2023 року загинув житель Осокорівки на Херсонщині, військовий Юрій Матвійчук.
Під час виконання бойового завдання в Донецькій області 29 листопада загинув український військовослужбовець з села Хрещенівка Херсонської області Юрій Стецюк.
30 листопада на Авдіївському напрямку загинув житель села Милове Херсонської області Олег Чумак.
Підписуйтеся на новини Суспільне Херсон у Facebook, Telegram, Viber, Instagram та YouTube.
]]>
+
+
+
+ https://suspilne.media/644788-u-dnr-zasudili-do-22-rokiv-uvaznenna-ukrainskogo-vijskovogo-denisa-rasplu/
+
+ Thu, 21 Dec 2023 22:13:54 +0200
+ Про таке рішення 21 грудня пише Слідчий комітеті РФ. За твердженням, які представити у псевдосуді "слідчі", з лютого по квітень 2022 року Денис Рашпля нібито разом з іншими українськими бійцями у Маріуполі стріляв у 16 людей, з яких вижили дев'ятеро.
Фейковий суд засудив українця до 22 років ув'язнення з відбуванням у колонії суворого режиму.
За вересень 2023 року терористичні угруповання "Луганська народна республіка" та "Донецька народна республіка" засудили 21 українського військового, за жовтень — 24. У листопаді — 22, грудні — 8.
В окупованих Росією частинах Донецької та Луганської областей українських військових "звинувачують" та "судять" так звані суди за однаковими сценаріями, це або вбивство цивільних через неприязнь, замаху на вбивство або пошкодження майна.
Уповноважений Верховної ради з прав людини Дмитро Лубінець наголошує: що такі "суди" є порушенням права на справедливий судовий процес.
"Ці вироки суду "ДНР" є грубим порушенням Третьої Женевської конвенції в частині права полонених на справедливий суд та недопущення катування, їх можна вважати воєнним злочином. Донеччина є частиною України в міжнародно визнаних кордонах, на них розповсюджується юрисдикція українських судів. Лише вони мають право здійснювати правосуддя на цій території", — уточнив Дмитро Лубінець.
Читайте всі новини Донбасу в Telegram, Viber, Facebook, YouTube та Instagram
]]>
+
+
+
+ https://suspilne.media/culture/644982-oskar-2024-20-dniv-u-mariupoli-odrazu-u-dvoh-korotkih-spiskah-cogoricnoi-premii/
+
+ Thu, 21 Dec 2023 22:12:49 +0200
+
+
+
+
+ https://suspilne.media/644994-rada-legalizuvala-medicnij-kanabis-so-dozvolae-zakon-ta-za-so-jogo-kritikuut/
+
+ Thu, 21 Dec 2023 22:08:27 +0200
+ Законопроєкт №7457 регулює обіг канабісу в медичній, промисловій та науковій діяльності. Наприклад, рослини коноплі буде можна застосовувати для створення ліків, проведення наукових експериментів, а також як знеболювальне чи терапевтичний засіб для людей з епілепсією, хворобою Альцгеймера, синдромом Туретта, онкохворобами, захворюваннями травного тракту та для лікування розладів сну і наркотичної залежності.
Документ також дозволяє лікарям виписувати е-рецепти на препарати, у складі яких є канабіноїди, а пацієнти зможуть зберігати такі препарати (якщо є рецепт) і в’їжджати та виїжджати з України з ними за наявності рецепта та документів, які підтверджують діагноз.
Також можна буде отримати ліцензію на вирощування конопель для виробництва ліків. Але за деяких умов — цілодобовий відеонагляд та доступ поліції та кодування кожного куща.
Розповсюдження марихуани для інших цілей, окрім перерахованих вище і надалі заборонено. Тобто, вирощувати або продавати її просто для приватного споживання вважатиметься злочином.
Що таке медичний канабіс
Цінність конопель з точки зору медицини полягає у канабіноїдах — сполуках, що містяться у рослині. Більшість канабіноїдів нині досі добре не досліджена. Найбільш відомими є тетрагідроканабінол (ТГК або латинською THC) та канабідіол (КБД або CBD). Саме ці два канабіноїди найчастіше згадуються, коли йдеться про медичний канабіс.
Тетрагідроканабінол — наркотична складова конопель. Саме через неї у XX столітті коноплі віднесли до небезпечних наркотичних речовин. Медичний канабіс — це не лише коноплі з низьким вмістом наркотичної сполуки ТГК, а й ті, де відсоток тетрагідроканабінолу низький.
В Україні статус конопель регулюється, зокрема, постановою уряду 2000-го року. Згідно з нею канабіс, смоли, екстракти й настоянки з канабісу продовжують залишатися серед особливо небезпечних наркотичних засобів, обіг яких в Україні заборонено. Дозволено вирощувати лише технічні сорти конопель із вмістом тетрагідроканабінолу менше ніж 0,08% (до прикладу, у країнах ЄС допустимий відсоток ТГК для технічних сортів складає 0,2%, у США — 0,3%, у Швейцарії — 1%).
Закон встановлює в Україні норму вмісту ТКГ на рівні не вище 0.3% — для промислових цілей та понад 0.3% — для медичної марихуани.
Історія прийняття закону
Легалізувати медичний канабіс намагалися ще у 2021 році, проте тоді цього не зробили через недостатню кількість депутатів у сесійній залі. У червні 2022 у Верховній Раді зареєстрували новий законопроєкт. Розглядати його депутати почали за рік, зокрема після заклику президента Володимира Зеленського. 13 липня парламент підтримав законопроєкт у першому читанні.
22 листопада членкиня Комітету ВРУ з питань здоров’я нації, меддопомоги та медстрахування Ольга Стефанишина повідомила, що законопроєкт заблокований і не може потрапити на розгляд ВР, бо депутати внесли до нього 882 правки. Врешті, 21 грудня за нього проголосували в другому читанні.
Як сказав після ухвалення закону у коментарі Суспільному голова комітету ВР з питань здоров'я нації, медичної допомоги та медичного страхування Михайло Радуцький, тепер для імплементації закону потрібно "зробити дуже багато кроків" та прийняти велику кількість підзаконних актів: "Наприклад, МОЗ має затвердити медичні протоколи, при яких захворюваннях, у яких дозах мають застосовуватися ліки на основі медичного канабісу, треба створити електронний реєстр міністерства агрополітики".
Критика закону
У коментарі Суспільному народний депутат від "Європейської Солідарності" Микола Княжицький сказав, що через суперечності у тексті існує ризик того, що лікарі, які виписуватимуть рецепт на препарати з медканабісом можуть самі потрапити під кримінальну відповідальність: "В цьому законі багато суперечностей, тобто є такі певні [статті закону], які дозволяють використання канабісу в медичних цілях, а є такі…, які прямо його забороняють".
"Закон, який прийнято, з нашої точки зору буде неефективним, його втілити в життя буде складно. Тому, що потрібно створити електронну систему обігу, яка має запрацювати через 6 місяців, натомість коштів у бюджеті на це взагалі не передбачено", — додав Княжицький.
Також у законі, зазначив нардеп, є вимога щодо дозволу від Національної поліції для приміщень, де мають вирощувати канабіс, але при тому, не вказано, яким саме має бути цей дозвіл, що дозволить поліції трактувати це "як вони захочуть".
Тарас Ратушний, один з організаторів акції "Конопляний марш", також розкритикував документ. За його словами, у законопроєкті відсутні чіткі визначення і формулювання, та він не змінює статус канабісу, як "важкого наркотику".
Статус канабісу у світі
Станом на першу половину цього року канабіс повністю, або частково визнаний у понад 40 країнах світу. Майже 30 країн з них легалізували лише медичний канабіс.
Лише сім країн у світі легалізували канабіс для особистого вживання, а саме Нідерланди, Уругвай, Канада, Мальта, Іспанія, ПАР та США в частині штатів.
Про особливості застосування медичного канабісу розслідувачі Суспільного розповідають у фільмі " Особливо небезпечний".
]]>
+
+
+
+
+ https://suspilne.media/644190-golovni-novini-harkova-ta-oblasti-21-grudna-hronika/
+
+ Thu, 21 Dec 2023 22:04:52 +0200
+ Оновлений тролейбусний маршрут №2 запустять для жителів Олексіївки та Павлового Поля з 21 грудня.
Про це повідомила пресслужба міськради.
"Введення тимчасового маршруту пов’язано з необхідністю покращення пасажирських перевезень мешканців Олексіївки та Павлового Поля", — сказано в повідомленні з посиланням на департамент інфраструкутри.
Тролейбус №2 курсуватиме за маршрутом:
розворотне коло "Просп. Перемоги" — просп. Перемоги — просп. Людвіга Свободи — вул. Ахсарова — просп. Науки — пл. Свободи. Хмарно з проясненнями; Вночі без істотних опадів, вдень невеликий дощ; Вночі та вранці слабкий туман. На дорогах місцями ожеледиця; Вітер південно-західний, 7-12 м/с; Температура повітря у Харківській області: вночі 0-5° тепла, вдень 2-7° тепла; Температура повітря у Харкові: вночі 1-3° тепла, вдень 3-5° тепла.
Рух транспорту на вул. Богдана Хмельницького біля будинку №14 буде заборонений з 12:00 21 грудня по 12:00 22 грудня, повідомила пресслужба міської ради.
За її даними, перекриття пов’язане з проведенням ремонту магістральних трубопроводів КП "Харківські теплові мережі".
"Об’їхати закриту ділянку можна вул. Шота Руставелі, Молочною, просп. Героїв Харкова, майданом Захисників України", — сказано у повідомленні.
Авіаційних ударів зазнала Синьківка Харківської області; На Куп’янському напрямку українські захисники відбили 16 атак РФ в районах Синьківки, східніше Петропавлівки та Іванівки, де росіяни намагалися прорвати оборону українських військ.
О 18:53 виникла пожежа у приватному будинку на вул. Врубеля у Новобаварському районі Харкова, повідомили в обласному управлінні ДСНС.
На час прибуття рятувальників вогонь розповсюдився на площу два кв. м.
"Горів диван та домашні речі. В осередку пожежі рятувальники виявили 66-річного господаря оселі, який надихався диму. Його негайно винесли на зовні, врятувавши життя. Пожежу загасили о 19:47. Постраждалий від госпіталізації відмовився", — сказано у повідомленні.
За даними ДСНС, причиною виникнення загоряння стала необережність чоловіка під час куріння.
За даними керівника поліції Харківщини Володимира Тимошка, протягом доби поліцейські здійснили 15 оглядів місць подій, задокументували наслідки обстрілів, зібрали речові докази чергових воєнних злочинів російських військових, відкрили 12 кримінальних проваджень.
"Ворог продовжує тероризувати мешканців прикордоння Харківської області. Синьківка, Петропавлівка, Іванівка зазнали аварійних ударів. З артилерії та мінометів рашисти били по населених пунктах Куп'янського району. Внаслідок ворожих атак пошкоджені приватні будинки, територія приватних домоволодінь, господарчі будівлі", — сказано у повідомленні.
"У зв'язку з погодними умовами в області знеструмлено 1221 споживач. Ремонтні бригади продовжують працювати над відновленням електропостачання у Барвінківській, Близнюківській, Вовчанській і Куп'янській громадах", — сказано у повідомленні керівника ОВА Синєгубова.
За даними керівника ОВА Синєгубова:
Артилерійських та мінометних обстрілів РФ зазнали понад 20 населених пунктів Харківщини, зокрема: Ветеринарне, Вовчанськ, Бударки, Синьківка, Петропавлівка, Іванівка, Берестове; 21 грудня о 05:30 РФ вдарила по Куп'янську, пошкоджений житловий будинок; Внаслідок обстрілу Одрадного Дворічанської громади пошкоджена лінія електропередач; 20 грудня РФ обстріляла Вовчанськ, люди поранень не зазнали.
38 боєприпасів РФ знешкодили сапери ДСНС протягом 20 грудня, повідомили у пресслужбі управління. За добу сапери обстежили 4 га території, з них 2150 кв. м за допомогою машин механізованого розмінування, 659 м ліній електропередач, 836 м автодоріг, сім приватних домогосподарств у Харківському, Ізюмському, Куп’янському, Богодухівському та Чугуївському районах області.
Очільник Харківської правозахисної групи 71-річний Євген Захаров став одним з трьох номінантів Премії ім. Вацлава Гавела. Він отримає 20 тисяч євро: це третина грошового фонду, який здобув і вирішив розділити цьогорічний лауреат Премії — турецький правозахисник-політв’язень Осман Кавала.
Євген Захаров каже, що гроші планує віддати катованим під час окупації на зубні протези. Таких клієнтів у правозахисної групи зараз десятеро.
"Серед них є люди, яким повністю вибили зуби. Вони не можуть ані їсти, нічого. Їм потрібно ставити протези, а грошей у них немає. Майже у всіх так. Деякі якось працюють, але щоб встановити, я не кажу вже імпланти, повністю зубний протез, потрібно щонайменше тисяча євро. У людей таких грошей зараз немає, тому я вирішив віддати гроші з Премії", — сказав Захаров Суспільному.
Про це повідомило Міністерство енергетики.
Також 16,2 тис. споживачів не мають світла через обстріли.
"Наразі триває огляд пошкоджених мереж в одному з районів після нових обстрілів. Також через бойові дії був пошкоджений газопровід. Є відключені споживачі", — сказано у повідомленні.
На Харківщині повідомили про підозру чоловіку, якого вважають винним у смерті 45-річної жінки. За даними слідства, чоловік задушив її, а щоб 19-річна співмешканка не повідомила про це в поліцію, протягом трьох діб утримував дівчину у будинку.
Про це повідомила пресслужба поліції Харківщини 21 грудня.
За її даними, подія сталася 16 грудня у селі Каравані Красноградського району.
"Під час побутової сварки чоловік звʼязав і задушив жінку, тіло сховав. Кілька днів зловмисник тримав у неволі співмешканку, а потім вирішив втекти. Дівчина скористалася нагодою та звернулася до поліції", — сказано у повідомлення.
Тіло вбитої жінки три дні пролежало у покинутому будинку, кажуть у поліції. Підозрюваного взяли під варту. Йому загрожує довічне ув'язнення.
Про це 21 грудня розказав директор обласного департаменту містобудування та архітектури Антон Коротовських.
"Там будуть виконані всі вимоги, вже виконується робочий проєкт щодо створення цього простору. У наступному році вони планують замовляти роботи. На кожному пішохідному переході, вході до багатоквартирних будинків, доступах до об'єктів закладів освіти планують понизити тротуари, зробити пандуси та встановити тактильні плитки. Наразі дуже актуальна тема — доступ до споруд цивільного захисту, мабуть, це найбільша проблема. Ці споруди на глибині, і часто там немає можливості зробити там ні пандуса, ні ліфта", — сказав посадовець.
Скільки пандусів встановлять у Пісочині, Коротовських не каже. Проєкт, за його словами, ще не затверджений.
Історик Тімоті Снайдер збирає 950 тис. доларів, щоб захистити небо Харківської області, а також повітряні простори Кіровоградщини, Полтавщини та Черкащини від російських ракет та безпілотників, повідомила платформа United24.
За її даними, Тімоті Снайдер вже зібрав 950 тис. доларів разом із чотирма професорами вишів світу на 2 500 сенсорів, які допоможуть захистити від дронів та ракет Сумську, Одеську, Миколаївську та Херсонську області.
"Мені було дуже приємно бачити, як швидко люди відгукнулись на проєкт "Безпечне небо". Підтримка людей з усього світу врятувала життя і подарувала спокій сім'ям, які інакше могли б постраждати. Зараз, з початком зими, я сподіваюся, що ми зможемо зробити те саме ще в чотирьох областях України. Це час для щедрості, і всі ми можемо зробити свій внесок", — сказав Тімоті Снайдер.
Про це повідомила пресслужба поліції Харківщини.
За її даними, 55-річна перебігала проїзну частину у невідведеному для цього місці та потрапила під колеса ЗАЗ, за кермом якого був 58-річний чоловік.
"Від удару жінку відкинуло на смугу зустрічного руху, де на неї наїхав автомобіль ВАЗ 11183. Від отриманих тілесних ушкоджень потерпіла загинула на місці аварії", — сказано у повідомленні.
Справу про загибель жінки розслідують як порушення правил безпеки дорожнього руху.
У Харкові та області синоптики оголосили штормове попередження: у другій половині 21 грудня до 22 грудня у регіоні очікується туман, видимість складатиме 200-500 метрів. Такі погодні умови відповідають першому рівню небезпечності, повідомили у регіональному гідрометцентрі.
З Дворічанської громади Куп'янського району евакуювали 83-річну жінку: тиждень тому вона травмувала ногу та не виходила з дому — про неї дбав сусід, щоб пенсіонерка не померла від голоду. У жінки немає рідних, повідомила пресслужба поліції Харківщини.
Поліцейські виявили пенсіонерку, коли обходили населений пункт.
"Співробітники поліції запропонували жінці евакуюватися, на що вона відразу погодилася. З будинку, в якому мешкала літня жінка, працівники поліції виводили її під ворожими обстрілами. Жінку у супроводі поліції, представників органів влади й волонтерів доставили до більш безпечного місця, де надали необхідну допомогу", — сказано у повідомленні.
Підрив машини механізованого розмінування Armtrac 400 стався під час розмінування ліній електропередач на деокупованій території Харківщини. Інформації про поранених немає.
Про випадок 21 грудня повідомила пресслужба ДСНС України.
"Унаслідок спрацювання протитранспортної потужної міни фугасної дії підірвався робочий орган машини Armtrac 400", — сказано в повідомленні.
34-річний Сергій Філоненко на початку повномасштабного вторгнення РФ працював на Золочівщині. 7 березня 2022 року він разом з військовими 93-ї бригади та іншими поліцейськими прийняв бій проти російських окупантів, чия кількість переважала українські сили у п'ять разів.
Поліцейського поранили у бою, він проходив лікування та планував повернутися на службу. Але на День Незалежності 2023 року Сергія Філоненко помер: на розтині виявили гематому, яку лікарі приймали за велику підшлункову залозу.
"Я пам'ятатиму його як веселого, усміхненим. Він любив риболовлю та спорт. Завжди хотів бути героєм, всім допомагати, завжди поспішав на поміч", — розповідає дружина померлого Тетяна Філоненко. Читайте її спогади у матеріалі.
Прокуратура направила до суду обвинувальний акт проти колишнього поліцейського, який 2 серпня на службовому авто на смерть збив 15-річну дівчину.
Його судитимуть у Харківському районному суді Харківської області, повідомила пресслужба Харківської облпрокуратури.
Що відомо про смертельне ДТП поблизу Пісочина 2 серпня — читайте у матеріалі.
Артилерійських та мінометних обстрілів зазнали близько 10 населених пунктів, серед них Веселе, Гатище, Дворічанське, Дворічна, Синьківка, Петропавлівка, Іванівка, Берестове Харківської області; На Куп’янському напрямку українські військові відбили 18 атак РФ у районах Синьківки Харківської області та Стельмахівки Луганської області, де ворог, за підтримки авіації, намагався прорвати оборону наших військ.
Жителька Куп'янська Валентина Нечволод сім місяців провела в окупації, а коли росіяни після звільнення почали обстрілювати місто, була змушена евакуюватися. Майже рік Валентина не могла знайти роботу у Харкові, а потім виграла грант і відкрила жіночий простір на Салтівці.
Дарину, Дмитра та Анастасію Пантелеєвих після загибелі їхніх батьків під час удару по Грозі взяв під опіку дідусь — 61-річний Валерій Козир. Через російський "Іскандер", що влучив по кафе, де відбувалися поминки за полеглим військовим, Валерій поховав доньку, зятя та сватів: "Я мав трьох онуків. Після 13:15 (часу, коли ракета влучила — ред.), трьох дітей". Нині родина вчиться жити після втрати: дідусь каже, що діти подорослішали, а він щодня чекає рідних на каву.
Як родина Пантелеєвих-Козирів переживає втрату половини сімʼї та як осиротілим дітям допомагають благодійники — матеріал Суспільне Харків.
]]>
+
+
+
+
+ https://suspilne.media/644992-86-vibuhivvijskovi-rf-obstrilali-8-gromad-sumsini/
+
+ Thu, 21 Dec 2023 22:01:56 +0200
+ Про це інформують у військовій адміністрації.
Військові РФ обстріляли мінометом Середино-Будську, Юнаківську, Хотінську громади.
Краснопільська громада обстріляна армією РФ з артилерії (20 вибухів) та мінометів (12 вибухів).
Великописарівську та Миропільську громади обстріляли з СПГ. Загалом було 19 вибухів.
На Білопільську громаду російські військові скинули 22 міни.
З кулемета та артилерії обстріляли Есманьську громаду на Сумщині.
Що відомо про обстріли Сумщини 20 та 21 грудня
Вночі 21 грудня російські військові з мінометів обстрілювали Краснопільську громаду на Сумщині, зафіксовано 8 вибухів, повідомили в ОВА.
Протягом 20 грудня російські війська здійснили 14 обстрілів територій Сумської області. Зафіксовано 62 вибухи. Обстрілів зазнали шість громад області.
Читайте Суспільне у Telegram
Долучайтесь до нашої спільноти у Viber
Підписуйтеся на наш Instagram
]]>
+
+
+
+ https://suspilne.media/644454-vtrati-volini-povidomili-pro-zagibel-se-dvoh-bijciv-5/
+
+ Thu, 21 Dec 2023 21:59:25 +0200
+ Про загибель бійця повідомили в Олицькій селищній раді.
Микола Сосницький загинув 18 грудня внаслідок поранення, несумісного з життям в районі населеного пункту Роботине, Запорізької області.
Микола Сосницький служив старшим солдатом. Він був багатодітним батьком, також уже став дідусем.
Про чин прощання та поховання повідомимо згодом.
Володимир Ткачук
10 грудня поблизу населеного пункту Богданівка Бахмутського району Донецької області, під час виконання бойового завдання загинув 42-річний військовослужбовець Володимир Ткачук, повідомив голова Зимнівської громади В'ячеслав Католик.
Боєць був уродженцем села Фалемичі.
Володимир Ткачук був командиром механізованого відділення, командиром машини механізованого взводу механізованої роти. Мав офіцерське звання старшого сержанта.
Термінові новини читайте в Telegram та Viber Суспільного Луцьк.
]]>
+
+
+
+
+ https://suspilne.media/culture/644982-oskar-2024-20-dniv-u-mariupoli-odrazu-u-dvoh-korotkih-spiskah-cogoricnoi-premii/
+
+ Thu, 21 Dec 2023 21:47:16 +0200
+ Список опублікували на сайті премії "Оскар" 21 грудня.
Кожен шортліст визначається членами відповідної секції, окрім категорій "Міжнародний повнометражний фільм" та "Анімаційний короткометражний фільм".
Остаточних номінантів на 96-ту премію "Оскар" оголосять у вівторок, 23 січня 2024 року. А сама церемонія відбудеться 11 березня о першій годині ночі у театрі "Долбі" у Голлівуді.
Документальний повнометражний фільм
До участі у номінації допустили 167 стрічок, а от до короткого списку потрапило лише 15.
American Symphony Apolonia, Apolonia Beyond Utopia Bobi Wine: The People’s President Desperate Souls, Dark City and the Legend of Midnight Cowboy The Eternal Memory Four Daughters Going to Mars: The Nikki Giovanni Project In the Rearview ("Звідки куди", стрічка польського режисера Мачека Хамели, знята у копродукції з Україною) Stamped from the Beginning Still: A Michael J. Fox Movie A Still Small Voice 32 Sounds To Kill a Tiger 20 Days in Mariupol Міжнародний повнометражний фільм
До наступного туру голосування в категорії "Міжнародний повнометражний фільм" обрали також 15 фільмів. У номінації брали участь стрічки з 88 країн і регіонів.
Вірменія, Amerikatsi Бутан, The Monk and the Gun Данія, The Promised Land Фінляндія, Fallen Leaves Франція, The Taste of Things Німеччина, The Teachers’ Loungs Ісландія, Godland Італія, Io Capitano Японія, Perfect Days Мексика, Totem Марокко, The Mother of All Lies Іспанія, Society of the Snow Туніс, Four Daughters Україна, 20 Days in Mariupol Велика Британія, The Zone of Interest
Короткі списки усіх 10 категорій можна переглянути тут.
"20 днів у Маріуполі"
Це режисерський дебют воєнного кореспондента, фотографа, відеографа та письменника Мстислава Чернова. До створення картини долучилися фотограф Євген Малолєтка та продюсерка й журналістка Василіса Степаненко. Вони стали останніми журналістами, які висвітлювали початок знищення Росією Маріуполя — за це усі троє отримали Пулітцерівську премію.
Світова прем'єра стрічки відбулася на фестивалі незалежного кіно у США "Санденс", де фільм отримав приз глядацьких симпатій.
"Звідки куди"
Також на участь претендує і стрічка, знята в українській копродукції польським режисером Мачеком Гамелою " Звідки куди".
Це повнометражний документальний фільм, знятий в українській копродукції польським режисером Мачеком Гамелою. Він ілюструє збірний образ українських переселенців: дітей, жінок, літніх людей та чоловіків, які після вторгнення Росії змушені були залишити свої домівки і їхати у невідоме майбутнє.
Читайте нас у Facebook, Instagram і Telegram, дивіться наш YouTube і TikTok
Поділіться своєю історією з Суспільне Культура. З нами можна зв'язатися у соціальних мережах та через пошту: culture@suspilne.media
]]>
+
+
+
+
+ https://suspilne.media/644980-nadbudova-nad-zamkom-ricarda-v-kievi-so-zobovazavsa-vikonati-vlasnik/
+
+ Thu, 21 Dec 2023 21:45:01 +0200
+ Про це йдеться у дописі Facebook Департаменту охорони культурної спадщини КМДА.
Повідомляється, що замовник робіт виконав припис Департаменту і надав на ознайомлення проєктну документацію щодо об'єкта по вул. Андріївський узвіз, 15. Представники Міністерства культури і Департаменту охорони культурної спадщини оглянули будівельні роботи на місці.
За результатами огляду, з метою збереження пам'ятки власника, зокрема, зобов'язали:
актуалізувати паспорт пам'ятки, в якому будуть детально описані автентичні елементи та історичні нашарування та уточнено предмет охорони; оновити охоронний договір, в якому врахувати усі необхідні заходи з реставрації пам'ятки, зокрема невідкладні консерваційні роботи і терміни їх виконання. доповнити проєкт заходами з благоустрою території, реставрації автентичних елементів інтер'єрів будівлі.
У Департаменті охорони культурної спадщини висловились і стосовно надбудови на даху "Замку Річарда".
"…цей об'єм був свого часу виконаний з невідповідних і не автентичних матеріалів (що спричинило незадовільний стан цієї частини будинку та необхідність заміни конструктивних елементів)..." — зазначили у відомстві. Новозведена частина споруди не є об'єктом охорони, тож її перебудуть. Власник зобов'язався:
привести надбудову у відповідність до погодженого паспорта опорядження фасадів, з частковим демонтажем верхніх декоративних елементів (зубців) з бетонних блоків, і виконати їх з цегли, характерної для пам'ятки; забезпечити влаштування дахового накриття на відкритих ділянках даху, згідно з погодженою проєктною документацією, щоб уберегти інтер'єри пам'ятки від негативного атмосферного впливу.
Наприкінці листопада стало відомо, що на Подолі почали зводити надбудову на пам'ятці архітектури національного значення "Замок Річарда". Тоді у КМДА говорили, що не отримували на погодження науково-проєктну документацію стосовно виконання робіт в історичній будівлі.
"Замок Річарда — Левове серце" — це п'ятиповерховий будинок на Андріївському узвозі в неоготичному стилі. Його збудували протягом 1902-1904 років.
Будівлю назвали кияни на честь англійського короля Річарда I Левове Серце, героя роману Вальтера Скотта "Айвенго".
Do you develop on GitHub? You can keep using GitHub but automatically sync your GitHub releases to SourceForge quickly and easily with this tool so your projects have a backup location, and get your project in front of SourceForge's nearly 30 million monthly users. It takes less than a minute. Get new users downloading your project releases today!
+
+
+ There's a tiny, black-freckled toad that likes the water in hot springs.
+
+ Unfortunately, the only place in the world where the species is found is on 760 acres of wetlands about 100 miles east of Reno, Nevada, according to the New York Times. And that's near the site for two renewable-energy geothermal plants which poses "significant risk to the well-being of the species," according to America's Fish and Wildlife Service — which just announced an emergency measure declaring it an endangered species.
+
+ The temporary protection, which went into effect immediately and lasts for 240 days, was imposed to ward off the toad's potential extinction, the U.S. Fish and Wildlife Service said in a statement, adding that it would consider public comments about whether to extend the toad's emergency listing.
+
+ The designation would add another hurdle for a plan to build two power plants with the encouragement of the U.S. Bureau of Land Management. The project is already the subject of a lawsuit filed by conservationists and a nearby Native American tribe. They hope the emergency listing can be used to block construction, which recently resumed.... The suit contended that the geothermal plants would dry up nearby hot springs sacred to the tribe and wipe out the Dixie Valley toad species.
+
+ The U.S. Fish and Wildlife Service argues that "protecting small population species like this ensures the continued biodiversity necessary to maintain climate-resilient landscapes in one of the driest states in the country."
+
+ They were only recently scientifically described — or declared a unique species — in 2017, making the Dixie Valley toad ">the first new toad species to be described in the U.S. in nearly 50 years. And they are truly unique. When they were described, scientists analyzed 14 different morphological characteristics like size, shape, and markings. Dixie Valley toads scored "significantly different" from other western toad species in all categories.
+
+ Thanks to long-time Slashdot reader walterbyrd for sharing the link!
+
+
+
+
+ Did we pass a privacy milestone without realizing it? Computer science professor Ken Perlin writes on his blog:
+
+ Recently I was traveling internationally. I have the Global Traveller option, so I could just to a machine, put in my passport, put my face in front of a camera, and get a piece of paper to hand to the immigration officer. But I was really tired from the flight. So I forgot to put my passport into the slot — I just posed for the camera.
+
+ And it worked anyway. The paper came out saying that I was me, I handed it to the immigration officer, and I was done. It seems that just my photo was enough to identify me.
+
+ Apparently sticking your passport into the slot is essentially theater. Your government can already tell who you are just from analyzing a photo of you, and they will let you into the country on that basis.
+
+ Where does this lead? In a follow-up blog post, Perlin offers one example, imagining a professor looking at a new class and already knowing "everyone's name, what their interests were, the date of their birth, and whether they played a musical instrument.
+
+ "In other words, I would be able to know far too much about them."
+
+ This is, in my opinion, not a good thing. And yet it might be the future we are about to go into headlong.
+ I think we should be giving this a lot of thought. We take for granted now that when people look at us, they don't immediately know everything about us.
+
+ I'm not sure that particular right to privacy is something we should be willing to give up.
+
+ Thanks to Slashdot reader saccade.com for sharing the story
+
+
+
+
+ "The GNOME desktop environment is one of the most popular user interfaces and suites of apps available for desktop Linux distributions," writes Liliputing.
+
+
+ Like other modern mobile user interfaces, you interact with GNOME shell using taps, swipes, and other gesture-based navigation. What's different is that Android has three different views for navigation: a home screen, app drawer, and multitasking view. iOS has two: home screen and multitasking. But GNOME Shell has a single screen that allows you to view and launch apps and switch between running apps using gestures. There's no need to wait for a new screen to load. In a nutshell, you can swipe up from the bottom of the any screen to view a list of installed apps, thumbnail images showing all currently running apps, and a search box. You can tap an app icon to launch a new app, enter a term in the search box to find an app, or swipe between running apps to switch which app runs in the foreground.
+
+ You can also keep swiping upward to shrink the multitasking thumbnails and provide more room for app icons. And you can flick thumbnail previews upward to remove an app from the multitasking section. Typing in the search box will bring up relevant results including apps and settings.
+
+ "One interesting new feature here is that notifications can be swiped away horizontally to close, and notification bubbles can be swiped up to hide them..." the developers point out. "While the current version is definitely still work in progress, it's quite usable overall, so we feel it would make sense to start having experimental GNOME OS Nightly images with it."
+
+ But Liliputing also notes that it's not the only GNOME-based UI for mobile devices. There's also Purism's Phosh UI — the default UI for the PureOS on its Librem 5 smartphone (and available for other mobile Linux distros including Debian).
+
+ And Purism recently bragged that its smartphone is now also "the first mobile computer with a truly convergent OS" — meaning it can run on multiple hardware platforms, with apps adapting to their hardware.
+
+ The Librem 5 [smartphone] uses the same convergent PureOS as our Librem 14 laptop and Mini PCs, with the same adaptive applications that make the Librem 5 more than merely a phone, it's a mobile computer in your pocket that can shape shift into a laptop, tablet, desktop, or even a server.... Scale your Librem 5 up to be a full laptop by attaching the Nexdock. Because our core apps are adaptive, they are ready to run on whatever screen you have....
+
+ With phosh-mobile-settings installed, you can flip the nexdock around and use the big screen just like a tablet.... Don't have a laptop dock? The Librem 5 can also act like a desktop computer when connected to a screen, keyboard, and mouse using our USB-C dock. Using the beta phom virtual mouse app, you can turn your Librem 5 into a touchpad mouse while it's connected to the big screen.
+
+ With the Librem 5, you can keep your desktop computer in your pocket and connect to a bigger screen at home or at the office and use the same apps on the bigger screen without restarting....
+
+ With the Librem 5 phone, you're getting much more than smartphone to run mobile-only apps; you're getting a laptop, tablet, desktop, all running software that respects your privacy and freedom.
+
+
+
+
+ Here's a warning from the threat intelligence unit of AT&T Cybersecurity, AT&T Alien Labs:
+ With a rise of nearly 650% in malware and ransomware for Linux this year, reaching an all-time high in the first half year of 2022, threat actors find servers, endpoints and IoT devices based on Linux operating systems more and more valuable and find new ways to deliver their malicious payloads. New malwares like BotenaGo and EnemyBot are examples of how malware writers rapidly incorporate recently discovered vulnerabilities to find new victims and increase their reach.
+
+ But they've discovered a new malware targetting Linux endpoints and IoT devices, stealthily "delivered in a multistage infection chain where each module responds to a part of the payload and downloads and executes the next one. An attacker can gain full control of the system, in addition to the cryptocurrency miner that will be executed and set to persist."
+
+ The Register summarizes their report:
+
+ The malware was dubbed "Shikitega" for its extensive use of the popular Shikata Ga Nai polymorphic encoder, which allows the malware to "mutate" its code to avoid detection. Shikitega alters its code each time it runs through one of several decoding loops that AT&T said each deliver multiple attacks, beginning with an ELF file that's just 370 bytes... AT&T didn't say how the initial infection occurs, but it did say Shikitega exploits two Linux vulnerabilities disclosed in 2021 to achieve its ultimate objective, which AT&T said appears to be the installation and execution of the XMRig cryptocurrency miner.
+
+ The final stage also establishes persistence, which Shikitega does by downloading and executing five shell scripts that configure a pair of cron jobs for the current user and a pair for the root user using crontab, which it can also install if not available. Shikitega also uses cloud hosting solutions to store parts of its payload, which it further uses to obfuscate itself by contacting via IP address instead of domain name....> >
+
+ Bottom line: Shikitega is a nasty piece of code. AT&T recommends Linux endpoint and IoT device managers keep security patches installed, keep EDR software up to date and make regular backups of essential systems.
+
+ Ars Technica reports:
+ The ultimate objective of the malware isn't clear. It drops the XMRig software for mining the Monero cryptocurrency, so stealthy cryptojacking is one possibility. But Shikitega also downloads and executes a powerful Metasploit package known as Mettle, which bundles capabilities including webcam control, credential stealing, and multiple reverse shells into a package that runs on everything from "the smallest embedded Linux targets to big iron." Mettle's inclusion leaves open the potential that surreptitious Monero mining isn't the sole function....
+
+
+ Given the work the unknown threat actors responsible devoted to the malware's stealth, it wouldn't be surprising if the malware is lurking undetected on some systems.
+
+
+
+
+ China is claiming it discovered a new lunar mineral in moon samples it retrieved in 2020. From the South China Morning Post:
+
+ The mineral, called Changesite-(Y), was found in rock and dust samples retrieved from the moon by China's Chang'e-5 mission, the nation's first mission to return a lunar sample, which launched in 2020.
+
+ A research team from the Beijing Research Institute of Uranium Geology, a subsidiary of the China National Nuclear Corporation (CNNC), isolated a single crystalline particle of the material from more than 140,000 lunar particles using hi-tech processes, including X-ray diffraction, according to Wang Xuejun, a party official with the CNNC. The particle was about 10 microns in diameter, or about one-tenth of a human hair, Wang told a press conference on Friday....
+
+ Meanwhile, Wang added that the research team had for the first time measured the concentration of a future fusion energy source, in the lunar sample. "It provides fundamental scientific data for future assessment of helium-3 in lunar samples and their exploration," Wang said.
+
+ If confirmed, it would provide "more basic scientific data for the evaluation and development of lunar resources," according to an executive with the China Atomic Energy Authority, while also deepening mankind's knowledge of the solar system. (It would be the sixth new mineral discovered on the moon.)
+
+ Speaking at a press conference, he told the audience that China "has also become the third country to retrieve lunar samples and discover new lunar minerals after the U.S. and Russia." The article points out that China hopes to land another sample-collecting probe to the moon "around 2024," and that a senior lunar program designer said China "could" land astronauts on the moon by 2030.
+
+
+
+
+ Patreon has confirmed it laid off five of its security team employees, TechCrunch reports, "but declined to answer our questions, or say how many employees it had on the security team prior to the layoffs."
+ But while a former senior security engineer posted on LinkedIn that "I and the rest of the Patreon Security Team are no longer with the company," Patreon's U.S. policy head, Ellen Satterwhite told Gizmodo that "a majority of our engineers working on security and vendors remain in place."
+ "As part of a strategic shift of a portion of our security program, we have parted ways with five employees," said Patreon in an emailed statement attributed to the company's U.S. policy head, Ellen Satterwhite.... In response to further questions, Satterwhite also said "the entire internal Patreon security team was not laid off. As a matter of policy, we can't share the exact number of Patreon employees working on security, but can confirm a majority of Patreon's internal engineers working on security remain in place...."
+
+ Satterwhite noted that "we also partner with a number of external organizations to continuously develop our security capabilities and conduct regular security assessments." The reference to "external organizations" seemingly suggests that the company has outsourced much of its security operations.
+
+ "As a global platform, we will always prioritize the security of our creators' and customers' data," wrote Satterwhite. "The changes made this week will have no impact on our ability to continue providing a secure and safe platform for our creators and patrons."
+
+
+
+
+ China remains the world's largest lithium processor, reports Reuters. But Tesla "is considering setting up a lithium refinery on the gulf coast of Texas, as it looks to secure supply of the key component used in batteries amid surging demand for electric vehicles."
+
+ The potential battery-grade lithium hydroxide refining facility, which Tesla touted as the first of its kind in North America, will process "raw ore material into a usable state for battery production", the company said in an application filed with the Texas Comptroller's Office.
+
+ A decision to invest in Texas will also be based on the ability to obtain relief on local property taxes, Tesla said.
+
+ Chief Executive Officer Elon Musk has previously said that Tesla may have to enter the mining and refining industry directly at scale as lithium prices surge. Musk has also been vocal about the need for more players in the lithium refining industry.... Securing a steady supply of battery components is seen critical for Tesla as it faces fierce competition in the fast-growing market for electric cars. If approved, construction could begin in the fourth quarter of 2022 and would reach commercial production by the end of 2024, Tesla said in the application dated Aug. 22....
+
+ If Tesla's plan goes ahead, the carmaker could become the first in the sector to invest directly in lithium refining as automakers scramble to stitch up deals with miners and refiners.
+
+ In addition, the article points out, Tesla "also said it would use less hazardous reagents and create usable byproducts, compared with the conventional process."
+
+
+
+
+ "Europe's largest nuclear plant has been reconnected to Ukraine's electricity grid," the Associated Press just reported. But that only means that engineers can now "shut down its last operational reactor in an attempt to avoid a radiation disaster as fighting rages in the area."
+
+ The six-reactor Zaporizhzhia plant lost its outside source of power a week ago after all its power lines were disconnected as a result of shelling. It was operating in "island mode" for several days, generating electricity for crucial cooling systems from its only remaining operational reactor.
+
+ Nuclear operator Energoatom said one of those power lines was restored "to its operational capacity" late Saturday, making it possible to run the plant's safety and other systems on electricity from the power system of Ukraine. "Therefore, a decision was made to shut down power unit No. 6 and transfer it to the safest state — cold shutdown," the company said in a statement.
+
+ Energoatom said the risk remains high that outside power is cut again, in which case the plant would have to fire up emergency diesel generators to keep the reactors cool and prevent a nuclear meltdown. The company's chief told The Associated Press on Thursday that the plant only has diesel fuel for 10 days.
+
+
+ Today NPR reminded readers that nuclear reactors "are more like charcoal grills than gas stoves. Even after they're shut off, they remain hot for a long period of time. Water must still circulate in the cores to prevent a meltdown."
+
+ Here's a chart showing exactly how "released thermal power" drops quickly — but does not stop. And it also notes that "Cooling failures after an emergency shutdown of a reactor were the first cause of serious accidents... evidenced by the accidents at Three Mile Island in 1986 and at Fukushima in 2011."
+
+ "The first led to the loss of one reactor, the second to the loss of 3 reactors and releases of radioactivity into the environment."
+
+
+
+
+ "19-year-old chess grandmaster Hans Niemann was banned by massive online chess platform Chess.com," reports Motherboard, "just a few days after being accused of cheating in real life against five-time World Chess Champion Magnus Carlsen."
+
+ Chess.com said in a statement that "We have shared detailed evidence with him concerning our decision, including information that contradicts his statements regarding the amount and seriousness of his cheating on Chess.com."
+
+ Niemann admitted to cheating on Chess.com in the past, but claimed that the two times he did were involving trivial, non-over-the-board games, and that he was only a child as he was 12 and 16 when it happened. "I just wanted to get higher-rated so I could play stronger players, so I cheated in random games on Chess.com," he said [in an online interview with St. Louis Chess Club].... " I have never cheated in an over-the-board game" [meaning a game that takes place on a real-world chess board]. Chess.com released its own statement Thursday countering his claims, which said: "At this time, we have reached out to Hans Niemann to explain our decision to privately remove him from Chess.com and our events. We have shared detailed evidence with him concerning our decision, including information that contradicts his statements regarding the amount and seriousness of his cheating on Chess.com...."
+
+ So far, there has not been any concrete evidence that points to Niemann cheating.... There are still many people who have been publicly supporting Niemann as the underdog. Russian chess grandmaster, Garry Kasparov, told TASS, "Of course we can't say with certainty that Niemann didn't cheat, but Carlsen surprisingly played the opening so badly with white that he automatically got into a worse position."
+
+ Chess.com's statement says they've "invited Hans to provide an explanation and response with the hope of finding a resolution where Hans can again participate on Chess.com."
+
+ The Guardian points out that Niemann has now also been uninvited from Chess.com's Global Championship, a $1m event with online qualifiers and an eight-player final in Toronto. But they also explore whether Neimann was really cheating...
+
+ The Californian teenager, who does not have a coach but whose rating has jumped 250 points in three years, had already beaten the world champion a month earlier in an online tournament in Miami, when he made headlines for a one-sentence victory interview where he said: "Chess speaks for itself," before walking off.... [In his match this week against Carlsen] the position out of the opening was almost level, a minimal 0.3 plus for Black, but the world champion seemed to try too hard, with sub-optimal choices at moves 22, 40 and 42. Niemann also made inaccuracies, so the game lacked the tell-tale signs of computer aid....
+
+ It would appear that the central issue is whether Carlsen believes his pre-game analysis of his intended surprise 1 d4 Nf6 2 c4 e6 3 Nc3 Bb4 4 g3 was leaked, either by a mole within his camp or by a computer hack. An alternative explanation of the "leak" could be quite innocent. The relevant pawn structure, with plausible transpositions into Carlsen v Niemann, had already occurred in a previous well-known Carlsen game against England's Michael Adams in 2006. Niemann said he asked himself what ideas Carlsen might produce to divert him from his planned Catalan with ... Bb4+ and decided to check 5 Nc3, a rare transposition to the Nimzo-Indian. There was also Niemann's own very recent game against Le Quang Liem at Miami, where 5 g3 (instead of 5 e3 d5 as played) d5 6 a3 could easily transpose into Carlsen v Niemann....
+
+ [I]t is easy to understand why the world champion was so upset. Carlsen's tournament score will be cancelled, but his games will be rated and the defeat by Niemann will cost him seven rating points, a large setback in the context of trying to get from 2865 to 2900. His dream of a record rating has just become more distant.
+
+
+
+ And the studio presented a trailer for Tales of the Jedi, which offers six original shorts about Ahsoka and Dooku, and arrives October 26. Fans also got a glimpse, though not a trailer, showing Jude Law, who's starring in Star Wars: Skeleton Crew, a story about a group of younglings lost in space.
+
+ Also revealed was a "developer update" trailer for the upcoming mobile game Avatar: Reckoning, as part of the news about other franchises:
+
+ James Cameron called in to the event from New Zealand to discuss Avatar: The Way of Water, and the crowd was given 3D glasses to watch some breathtaking footage [from] Cameron's long-awaited sequel... ahead of its December 16 release.
+
+ An exclusive clip from The Ant-Man and the Wasp: Quantumania featured Kang holding Cassie Lang hostage and trying to force Scott to steal something for him. Also featured: Bill Murray!
+
+ Samuel L. Jackson returns as Nick Fury in a new Disney Plus show called Secret Invasion, where Fury and friends (Oscar-winner Olivia Colman among them!) takes on shape-changing Skrulls. The trailer looks intense."
+
+
+
+
+ Since January 1, 2009, Jonathan Mann has written an original song every day and shared it online. Starting as an unemployed 26-year-old, Mann remembers in an online video that "I made my living entering video contests — I'd submit to 12 of them in 12 days, win one or two, and that was my income for the month."
+
+ But Mann released that video after song #4,000, reflecting that "A bunch of videos went viral. I released eight albums. In 2016 I got the Guinness World Record for most consecutive days writing a song. And I've carved out this living delivering keynotes at conferences all over the world — as well as watching all the other talks then getting up at the end to sing a song that recaps everything."
+
+ And now 13 years, 8 months, and 9 days after he first began, "I have officially written 5000 songs in 5000 days," Mann announced Friday on Twitter — sharing a special 5,000th song including singing appearances from 112 of his listeners. Mann still shares his videos free online — but for four years, Mann has also been auctioning the songs as NFTs living on the Ethereum blockchain. (By Friday night someone had bid 5 ETH -- about $1,700 -- for song #5,000. And the NFTs also confer membership status for the decentralized autonomous organization, SongADAO).
+
+ Mann also writes songs on commission on a "pay-what-you-feel" basis, and has even written songs for companies like SquareSpace and OKCupid. ("Most businesses pay between $2000 and $5000 for a song and a video.") Once Steve Jobs even opened Apple's press conference about its iPhone antennas dropping phone calls by playing one of Mann's satirical songs.
+
+ "I saw that on YouTube this morning, and couldn't help but want to share it," Steve Jobs said, according to this 2017 summation of Mann's other wacky career highlights:
+
+ On day #202, he won a $500 American Express gift card in a jingle contest held by Microsoft for the launch of their Bing search engine. When TechCrunch quipped that Bing had succeeded "in finding the worst jingle ever," Mann responded with a second song — setting TechCrunch's article to music (along with a speculative interior monologue which Mann acknowledges is "completely made up.")
+
+ Mann later admitted that his jingle was the worst song he'd recorded that July. ("I wrote it in 10 minutes ...") And his worst song that October was a related song that he'd written when "I received an email from Microsoft of a video showing middle-school kids in Pennsylvania singing and dancing to my Bing song."
+
+ "I was horrified. Don't get me wrong, the kids were adorable, but Bing? What had I created!?"
+
+ But he was honored when the kids told him they'd enjoyed dancing to his song, and when they asked for one about their own school, Mann obliged.
+
+ When Steve Wozniak turned 60, Mann was ready with a musical tribute — Song #588, "That's Just Woz...."
+
+ And in January of 2011, as the world learned Jobs had taken an indefinite medical leave of absence, Mann released song #753: Get Better, Steve Jobs...
+
+
+
+ Mann's duet with Siri earned over 1,609,675 views....
+
+ On Day #810 Mann convinced his girlfriend Ivory to sing the other half of a duet called "Vegan Myths Debunked." They'd apparently been dating for a year before he started his song-a-day project. But after four more years, on Day #1,435, Mann and his girlfriend Ivory decided to break up — and released a music video about it....
+
+
+
+ And in 2014, on day 1,951, Mann's wife gave birth to his son Jupiter....
+
+ At a speaking engagement, he offered his own perspective on time: "100 days went by, a year went by, a thousand days went by. At a certain point, it just becomes a part of my life. And so that's how I stand before you now having written 2,082 songs in as many days."
+
+ As the audience applauds, he segues into his larger message, "I'm happiest when I'm making."
+
+ The article closes by quoting the song Mann wrote on Day #2001 — for a video which included part of every one of the 1,999 previous videos, in a spectacular montage called "2000 Songs in 2000 Days...."
+
+ "And I will sing until I'm all out of breath. And the color of the sun is a dark, dark red. And the governments will fall. And we'll sing until it hurts. And we'll ring forever through the universe."
+
+ The video ends with a personal message from Mann himself.
+
+ "Make something every day," it urges in big letters.
+
+ HPSC will utilize an 8-core, SiFive® Intelligenceâ X280 RISC-V vector core, as well as four additional SiFive RISC-V cores, to deliver 100x the computational capability of today's space computers. This massive increase in computing performance will help usher in new possibilities for a variety of mission elements such as autonomous rovers, vision processing, space flight, guidance systems, communications, and other applications....
+
+ The SiFive X280 is a multi-core capable RISC-V processor with vector extensions and SiFive Intelligence Extensions and is optimized for AI/ML compute at the edge. The X280 is ideal for applications requiring high-throughput, single-thread performance while under significant power constraints. The X280 has demonstrated a 100x increase in compute capabilities compared to today's space computers..
+
+ In scientific and space workloads, the X280 provides several orders of magnitude improvement compared to competitive CPU solutions.
+
+ A business development executive at SiFive says their X280 core "demonstrates orders of magnitude performance gains over competing processor technology," adding that the company's IP "allows NASA to take advantage of the support, flexibility, and long-term viability of the fast-growing global RISC-V ecosystem.
+
+ "We've always said that with SiFive the future has no limits, and we're excited to see the impact of our innovations extend well beyond our planet."
+ And their announcement stresses that open hardware is a win for everybody:
+
+ The open and collaborative nature of RISC-V will allow the broad academic and scientific software development community to contribute and develop scientific applications and algorithms, as well optimizing the many math functions, filters, transforms, neural net libraries, and other software libraries, as part of a robust and long-term software ecosystem.
+
+
+
+ The report, "Cyber Insecurity in Healthcare: The Cost and Impact on Patient Safety and Care," surveyed 641 healthcare IT and security practitioners and found that the most common consequences of cyberattacks are delayed procedures and tests, resulting in poor patient outcomes for 57% of the healthcare providers, followed by increased complications from medical procedures. The type of attack most likely to have a negative impact on patient care is ransomware, leading to procedure or test delays in 64% of the organizations and longer patient stays for 59% of them.
The Ponemon report depends on the accuracy of self-reporting and thus doesn't have the weight of, say, an epidemiological study that looks at hospital mortality baseline data before and after an attack, but the data is similar to what Ponemon has found in the past and there have been a number of reports of patient deaths and other complications from ransomware attacks.
+
+ The new report found that 89% of the surveyed organizations have experienced an average of 43 attacks in the past year. The most common types of attacks were cloud compromise, ransomware, supply chain, and business email compromise (BEC)/spoofing/phishing.
The Internet of Medical Things (IoMT) is a top concern for survey participants. Healthcare organizations have an average of more than 26,000 network-connected devices, yet only 51% of the surveyed organizations include them in their cybersecurity strategy.
Healthcare organizations are better at cloud security, with 63% taking steps to prepare for and respond to cloud compromise attacks, and 62% have taken steps to prevent and respond to ransomware — but that still leaves nearly 40% of healthcare organizations more vulnerable than they should be.
Preparedness is even worse for supply chain attacks and BEC, with only 44% and 48% having a documented response to those attacks, respectively.
The high costs of healthcare cyberattacks — an average of $4.4 million — mean that healthcare cybersecurity tools likely have a high ROI, even though roughly half of the survey respondents say they lack sufficient staffing and in-house expertise.
+
+
+
+
+
+ America's Department of Agriculture and NASA recently announced the Artemis Moon Trees Program. After the first launch of its SLS super-heavy-lift launch vehicle, "the seeds carried on Artemis I will be grown into seedlings by the Forest Service and distributed to locations across the U.S."
+
+ But it's just part of a larger initiative. The U.S. government announced Friday that it's working with "a new coalition of space companies that will focus on increasing the space industry's capacity to meet the rising demand for the skilled technical workforce" — partly by inspiring and educating the next generation. This coalition includes Lockheed Martin, Northrop Grumman, Boeing, Blue Origin, Jacobs, L3Harris, Planet Labs PBC, Rocket Lab, Sierra Space, Space X and Virgin Orbit.
+
+ Long-time Slashdot reader theodp writes:
+
+ Yesterday at the second convening of America's National Space Council, Vice President Kamala Harris announced "new commitments from the U.S. government, private sector companies, education and training providers, and philanthropic organizations to support space-related STEM initiatives to inspire, prepare, and employ the next generation of the space workforce..." according to a statement from the White House, "to address the challenges of today and prepare for the discoveries of tomorrow...."
+
+ Among those anchoring the Administration's efforts to increase the space industry's capacity to meet the rising demand for the skilled technical workforce is Amazon founder Jeff Bezos' space tourism company Blue Origin, which will be joined by industry partner Amazon to inspire youth to pursue space STEM careers. "Blue Origin's Club for the Future," the White House explains, "is launching Space Days to engage millions of students, teachers and school administrators in the excitement of space and space careers." Club for the Future, as reported earlier on Slashdot, is the Blue Origin founded-and-funded tax-exempt foundation that received the $28 million proceeds of a single auctioned ticket to accompany Bezos on Blue Origin's maiden 11-minute space tourism flight in June 2021. The nonprofit's mission is "to inspire future generations to pursue careers in STEM and to help invent the future of life in space."
The White House also announced that Amazon and Bezos-funded nonprofit Code.org "will highlight connections between computer science and space exploration in the 2022 Hour of Code. Students will have the opportunity to explore and develop coding skills through engaging, space-themed tutorials and create shareable projects. Through a collaboration with NASA, the U.S. Space Force, America's Department of Energy, and the U.S. Geological Survey, students will also learn about different careers and pathways for space careers in these agencies. Code.org reaches approximately 15 million students annually." Amazon reported in 2018 on its efforts to accelerate K-12 CS education in the U.S. with Code.org to "support the much-needed pipeline for workers who are well versed in computer science."
+
+ The coalition's other efforts include three pilot programs collaborating with community colleges, unions and others "to demonstrate a replicable and scalable approach to attracting, training and creating employment opportunities." Federal agencies and the Smithsonian Institute also launched a new web site with free space-related resources for K-12 educators which also promotes career awareness.
+
+
+ "A vital offsite electricity supply to the Zaporizhzhia nuclear plant has been destroyed by shelling," the Guardian reported Friday, "and there is little likelihood a reliable supply will be re-established, the United Nations' nuclear watchdog chief has said."
+ Rafael Grossi, the director general of the International Atomic Energy Agency (IAEA), said shelling had destroyed the switchyard of a nearby thermal power plant. The plant has supplied power to the nuclear facility each time its normal supply lines had been cut over the past three weeks.
+ The thermal plant was also supplying the surrounding area, which was plunged into darkness. Local Ukrainian officials said work was under way to restore the connection, which has been cut multiple times this week....
+
+
+ When the thermal supply has been cut the plant has relied on its only remaining operating reactor for the power needed for cooling and other safety functions. This method is designed to provide power only for a few hours at a time. Diesel generators are used as a last resort. The constant destruction of thermal power supply has led Ukraine to consider shutting down the remaining operating reactor, said Grossi. Ukraine "no longer [has] confidence in the restoration of offsite power", he said.
+
+ Grossi said that if Ukraine decided not to restore the offsite supply the entire power plant would be reliant on emergency diesel generators to ensure supplies for the nuclear safety and security functions.
+
+ "As a consequence, the operator would not be able to restart the reactors unless offsite power was reliably re-established," he said.
+
+
+ NPR provides some context:
+ Normally, the plant holds a 10-day reserve of diesel fuel, the agency says, and currently has approximately 2,250 tonnes of fuel available. If that fuel is depleted, or the generators are damaged in further fighting, it could trigger a meltdown.
+
+ But Steven Nesbit, a nuclear engineer and member of the American Nuclear Society's rapid response taskforce, which is tracking the current crisis, says that doesn't necessarily mean there would be a Chernobyl-like catastrophe. The meltdown at Chernobyl was due to a unique mix of design flaws and operator error that would be essentially impossible to replicate at Zaporizhzhia. And unlike the Fukushima nuclear disaster in 2011, some of the reactors at Zaporizhzhia have already been shut down for a while, allowing the nuclear fuel to cool somewhat, Nesbit says. Even in the worst case scenario, the reactors at Zaporizhzhia are a modern design surrounded by a heavy "containment" building, Nesbit says. "It's reinforced concrete, typically about three to four feet of that; it's designed to withstand very high internal pressures." That could allow it to hold in any radioactive material.
+
+ But the world's nuclear agency doesn't want to test any of this.
+
+ Meanwhile, the French international news agency AFP reports on what's been happening at the plant since it was captured by Russian troops in March:
+ Russian forces controlling Ukraine's Zaporizhzhia nuclear power plant have killed two staff at the facility and detained and abused dozens of others, the head of Ukraine's nuclear energy agency told AFP on Friday.
+ "We do not know where about ten people are now," Petro Kotin said. "They were taken (by the Russians) and after that we have no information about their whereabouts," Kotin said, adding about 200 people had been detained. He described the current situation at the plant as "very difficult," citing "torture" of staff and "beatings" of personnel. "The Russians look for pro-Ukrainian people and persecute them. People are psychologically broken," he said in an interview with AFP reporters in his office in Kyiv... "Two people on the territory of the plant were wounded during shelling — a woman and a man — on separate occasions," Kotin, clad in a military-style jacket, said.
+
+ "But people understand that the nuclear safety of the plant depends on them, so the employees return to Energodar and continue working at the facility," he added.
+
+