Help
RSS
API
Feed
Maltego
Contact
Domain > blog.twonegatives.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2013-12-28
66.6.40.35
(
ClassC
)
2014-01-28
66.6.40.49
(
ClassC
)
2014-03-25
66.6.40.76
(
ClassC
)
2014-03-29
66.6.40.81
(
ClassC
)
2014-04-03
66.6.40.75
(
ClassC
)
2014-04-16
66.6.40.74
(
ClassC
)
2024-10-01
74.114.154.22
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyServer: nginxDate: Tue, 01 Oct 2024 04:57:08 GMTContent-Type: text/htmlContent-Length: 162Connection: keep-aliveLocation: https://blog.twonegatives.com/ html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>nginx/center>/body>/html>
Port 443
HTTP/1.1 200 OKServer: nginxDate: Tue, 01 Oct 2024 04:57:08 GMTContent-Type: text/html; charsetUTF-8Content-Length: 63059Connection: keep-aliveVary: Accept-EncodingX-Rid: 42949cb421f0b1368a9bf0d744789895P3p: CPTumblrs privacy policy is available here: https://www.tumblr.com/policy/en/privacyX-Xss-Protection: 1; modeblockX-Content-Type-Options: nosniffStrict-Transport-Security: max-age15552001X-Tumblr-User: vishersX-Tumblr-Pixel-0: https://px.srvcs.tumblr.com/impixu?T1727758628&JeyJ0eXBlIjoidXJsIiwidXJsIjoiaHR0cDovL2Jsb2cudHdvbmVnYXRpdmVzLmNvbS8iLCJyZXF0eXBlIjowLCJyb3V0ZSI6Ii8ifQ&UIDKMMABLBJ&K056fbe35e092515d36816a7c43172da3ba56809cbc46ae0645441ea078e0e1b7--https://px.srvcs.tumblr.com/impixu?T1727758628&JeyJ0eXBlIjoicG9zdCIsInVybCI6Imh0dHA6Ly9ibG9nLnR3b25lZ2F0aXZlcy5jb20vIiwicmVxdHlwZSI6MCwicm91dGUiOiIvIiwicG9zdHMiOlt7InBvc3RpZCI6IjY0MjkyMjI1MTExMDUzMTA3MiIsImJsb2dpZCI6NDk2NjE2Mywic291cmNlIjozM30seyJwb3N0X-Tumblr-Pixel-1: aWQiOiI2NDE2NTM4ODY3NDMwODUwNTYiLCJibG9naWQiOjQ5NjYxNjMsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiNjQxMzgyMTMwMDQ5NTMxOTA0IiwiYmxvZ2lkIjo0OTY2MTYzLCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjY0MTExMDMzMDc2NDkxODc4NCIsImJsb2dpZCI6NDk2NjE2Mywic291cmNlIjozM30seyJwb3N0aWQiOiI2NDEwMzEwNDQ5MDAwNDQ4MDAiLCJibG9naWQiOjQ5NjYxNjMsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiNjQxMDE5NzcyMjQ5ODE3MDg4IiwiYmxvZ2lkIjo0OTY2MTYzLCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjY0MDU2NjcyNTUzODA4NjkxMiIsImJsb2dpZCI6NDk2NjE2Mywic291cmNlIjozM30seyJwb3N0aWX-Tumblr-Pixel-2: QiOiI2Mzk2NjA3NjI3MTE4NTEwMDgiLCJibG9naWQiOjQ5NjYxNjMsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiNjM5NTcwMTczODk4MjI3NzEzIiwiYmxvZ2lkIjo0OTY2MTYzLCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjYzOTQ5MDg4OTEzNzQzODcyMCIsImJsb2dpZCI6NDk2NjE2Mywic291cmNlIjozM31dfQ&UJFCLMCLLJI&K60db4fad823d92f4c9961d3d4239429559b2d68d408e63c1de990b88cd2a3c84X-Tumblr-Pixel: 3Link: https://64.media.tumblr.com/avatar_8115996a42fc_128.pnj>; reliconX-UA-Compatible: IEEdge,chrome1X-UA-Device: desktopVary: X-UA-Device, Accept, Accept-EncodingAccept-Ranges: bytesx-a8cblr: 1X-nc: MISS !DOCTYPE html>script>var __pbpa true;/script>script>var translated_warning_string Warning: Never enter your Tumblr password unless \u201chttps://www.tumblr.com/login\u201d\x0ais the address in your web browser.\x0a\x0aYou should also see a green \u201cTumblr, Inc.\u201d identification in the address bar.\x0a\x0aSpammers and other bad guys use fake forms to steal passwords.\x0a\x0aTumblr will never ask you to log in from a user\u2019s blog.\x0a\x0aAre you absolutely sure you want to continue?;/script>script typetext/javascript languagejavascript srchttps://assets.tumblr.com/assets/scripts/pre_tumblelog.js?_vb9f848c06fcba7eaf305d4a7cb7a1b98>/script>!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>html xmlnshttp://www.w3.org/1999/xhtml xml:langen langen>head prefixog: http://ogp.me/ns# fb: http://ogp.me/ns/fb# blog: http://ogp.me/ns/blog#>meta namegoogle-site-verification contentEjGdh3noJYAJavRCAtLi-lkNc8YHhWMZtzGpfZceIYg />meta http-equivContent-Type contenttext/html; charsetutf-8/>meta nameviewport contentwidth720, user-scalableyes/>meta namedescription contentI blog about faith in life and whatever else is currently making demands on my attention./>title>Two Negatives/title>!-- DEFAULT COLORS -->meta namecolor:Background content#ffffff/>meta namecolor:Text content#333333/>meta namecolor:Secondary Text content#777777/>meta namecolor:Tertiary Text content#cccccc/>meta namecolor:Links content#c00906/>meta namecolor:Header Background content#444444/>meta namecolor:Title content#ffffff/>meta namecolor:Description content#999999/>meta namecolor:Post Headers content#111111/>meta namecolor:Big Quote content#e0e0e0/>meta namecolor:Photo Border content#dddddd/>!-- Disqus Shortname -->meta nametext:Disqus Shortname content />meta nameimage:Background content>style>figure{margin:0}.tmblr-iframe{position:absolute}.tmblr-iframe.hide{display:none}.tmblr-iframe--amp-cta-button{visibility:hidden;position:fixed;bottom:10px;left:50%;transform:translateX(-50%);z-index:100}.tmblr-iframe--amp-cta-button.tmblr-iframe--loaded{visibility:visible;animation:iframe-app-cta-transition .2s ease-out}/style>link relstylesheet mediascreen hrefhttps://assets.tumblr.com/client/prod/standalone/blog-network-npf/index.build.css?_vf085dde138e244526309d4673db67b4c>link relshortcut icon hrefhttps://64.media.tumblr.com/avatar_8115996a42fc_128.pnj/>link relalternate typeapplication/rss+xml titleRSS hrefhttps://blog.twonegatives.com/rss/>link relapple-touch-icon hrefhttps://64.media.tumblr.com/avatar_8115996a42fc_128.pnj/>style typetext/css mediascreen> /*-- GLOBAL TAG STYLES ---------*/ html { font-size: 100.01%; } body { background: #ffffff url(https://assets.tumblr.com/images/x.gif?v1) top left repeat; color: #333333; font: normal 1em/1.5 Georgia, serif; margin: 0; } :focus { outline: none; } a:link, a:visited, a:active { color: #c00906; text-decoration: none; } a:hover, a:focus { color: #333333; } a img { border: 0; } h1, h2, h3, h4, h5, h6 { color: #111111; font-weight: normal; padding: 0; } p { margin: 0 0 1.5em; } ul, ol { margin: 0 0 1.5em; padding: 0; } blockquote { border-left: 2px solid #777777; color: #777777; margin: 0 1em 1.5em; padding: 0 1em; } blockquote ul, blockquote ol { margin-left: 2em; } /*-- HEADER --------------------*/ #header { background: #444444; padding: 1.5em 0; margin: 0 0 3em; position: relative; } #inner-header { margin: 0 auto; width: 32em; } #inner-header h1 { font-size: 3em; line-height: 1; } #inner-header h1 a { color: #ffffff; text-decoration: none; } #inner-header h1 a:hover { color: #999999; } #inner-header h2 { color: #999999; font-size: 1.1em; line-height: 1.363634; } #header-shadow { display: block; background: transparent url(https://static.tumblr.com/eth9fj1/SITklre6t/header-shadow.png) repeat-x top; height: 24px; position: absolute; bottom: -24px; width: 100%; } /*-- POSTS ---------------------*/ #posts { margin: 4.5em auto 0; width: 32em; } #posts .post { margin-bottom: 2.25em; padding-bottom: 2.25em; position: relative; } /* DAY PAGE BLURB, TAG PAGE BLURB, SEARCH RESULT BLURB */ #daypageblurb, #tagpageblurb, #searchresultblurb { color: #777777; font-size: 1.25em; font-style: italic; line-height: 1.2em; margin-bottom: 2.4em; } /* DATE */ .date { border-top: 2px solid #cccccc; position: absolute; left: -6em; text-align: center; width: 4em;} .date .permalink { font-size: 1.2em; font-variant: small-caps; line-height: 1.25; text-decoration: none; text-transform: lowercase; } .date .day, .date .month { display: block; } .date .month { font-size: 1.3em; line-height: 1.15384615385;} /* COMMON POST STYLES */ .post h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; } .post .caption, .post .source { margin-top: 1.5em; } .post code { font-size: 1.1em; background-color: lightgray; padding-right: .3em; padding-left: .3em; border-bottom: .1em solid gray; } /* AUDIO */ .audio .player .play-count { color: #777777; float: right; font-size: 0.83333em; } .audio .caption { clear: right; } /* CHATS */ .chat ul { list-style: none; margin: 0 0 1.5em; } .chat ul li.odd { color: #777777; } .chat ul li .who { background: #333333; color: #ffffff; padding: 0 0.25em; } .chat ul li.odd .who { background: #777777; } /* PHOTOS */ .photo .image { position: relative; } .photo .image img { border: 0.375em solid #dddddd; } .photo .image .hi-res { background: #333; color: #fff; display: none; font-size: 0.75em; opacity: 0.9; padding: 0 0.5em; position: absolute; bottom: 1.5em; right: 1em; border-radius: 3px; -webkit-border-radius: 3px; -moz-border-radius: 3px; } .photo .image:hover .hi-res { display: inline; } /* PHOTOSETS */ .photoset .set { border: 0.375em solid #dddddd; padding: 0; } .photoset .set object, .photoset .set embed { display: block; } /* QUOTES */ .quote big { color: #e0e0e0; font-size: 6em; font-weight: bold; line-height: 0.5em; position: absolute; left: -0.15em; z-index: 1; } .quote .quote-words { font-size: 1.3em; line-height: 1.15384615385; position: relative; z-index: 10; } .quote .source { color: #777777; } /* REBLOG NOTES */ .reblogged { color: #777777; display:block; font-size: 0.833333em; font-style: italic; margin: 1.5em 0; text-align: right; } /* POST FOOTER */ .post-footer { border-top: 1px solid #cccccc; color: #777777; font-size: 0.75em; margin: 1.5em 0 0; padding: 0.5em 0 1em; text-align: right; } .post-footer li { display: inline; margin-left: 1em; } /* NOTES */ #note-container h4 { font-size: 1.3em; line-height: 1.15384615385; margin-bottom: 1.15384615385em; } #note-container .notes .note { border-bottom: 1px solid #aaa; margin: 0 0 0.75em; padding: 0 0 0.75em} #note-container .notes .avatar { display: none; } /*-- PAGINATION ----------------*/ #pagination { margin: 3em auto 1.5em; width: 32em; } #pagination a { margin-right: 1.5em; } /*-- FOOTER --------------------*/ #footer { border-top: 1px solid #333333; margin: 3em auto 0; padding: 0.75em 0; width: 44em; } #footer #search { float: right; } #footer #search #keywords { border: 1px solid #777777; padding: 0.25em; } #footer #meta-info { margin: 0; } #footer #meta-info li { display: inline; font-size: 1.1em; margin-right: 1em; } #footer #theme-info { clear: left; margin: 0.75em 0; } #footer #theme-info li { color: #777777; display: inline; font-size: 0.75em; margin-right: 1em; } /*-- CUSTOM CSS ----------------*/ .gist .gist-file .gist-datapre { color: #000; font-size: .55em;}.post a code { color: #c00906;}.post pre code { overflow-x: auto; display: block; width: 75ch;}.post code { border-bottom: .1em solid #93a1a1; color: #657885; background-color: #fdf6f5 ;}.post .series-header blockquote p { font-style: normal;}.post .series-header p { font-style: italic;}h4 { font-weight: bold;}ul { margin-block-start: 1em; margin-block-end: 1em; padding-inline-start: 40px;}ul ul { margin-block-start: 0px; margin-block-end: 0px;}ol { margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0px; margin-inline-end: 0px; padding-inline-start: 40px;}table { margin: 0 0 1.5em;} /style>!--if lt IE 7>style typetext/css mediascreen> #header { background-image: none; margin-bottom: 3em; } #header-shadow { display: none; } /style>!endif-->script typetext/javascript> var _gaq _gaq || ; _gaq.push(_setAccount, UA-24885986-1); _gaq.push(_trackPageview); (function() { var ga document.createElement(script); ga.type text/javascript; ga.async true; ga.src (https: document.location.protocol ? https://ssl : http://www) + .google-analytics.com/ga.js; var s document.getElementsByTagName(script)0; s.parentNode.insertBefore(ga, s); })();/script>link relalternate hrefandroid-app://com.tumblr/tumblr/x-callback-url/blog?blogNamevishers />link relalternate hrefios-app://305343404/tumblr/x-callback-url/blog?blogNamevishers />script defer typeapplication/javascript idbilmur data-providertumblr.com data-serviceblognetwork data-customproperties{theme: } nonceuMOQr5uRTWxG7krOT8Sg8SKCIek srchttps://s0.wp.com/wp-content/js/bilmur.min.js?m202440 >/script>script srchttps://assets.tumblr.com/assets/scripts/tumblelog_post_message_queue.js?_va8fadfa499d8cb7c3f8eefdf0b1adfdd>/script>link relstylesheet typetext/css hrefhttps://assets.tumblr.com/fonts/gibson/stylesheet.css?v3>meta namekeywords contentscripting,applescript,emacs,google chrome,org-mode />!-- BEGIN TUMBLR FACEBOOK OPENGRAPH TAGS -->!-- If youd like to specify your own Open Graph tags, define the og:url and og:title tags in your themes HTML. -->!-- Read more: http://ogp.me/ -->meta propertyfb:app_id content48119224995 />meta propertyog:site_name contentTumblr />meta propertyog:title contentTwo Negatives />meta propertyog:url contenthttps://blog.twonegatives.com/?og1 />meta propertyog:description contentI blog about faith in life and whatever else is currently making demands on my attention. />meta propertyog:type contentprofile />meta propertyog:image contenthttps://64.media.tumblr.com/avatar_8115996a42fc_128.pnj />meta propertyal:ios:url contenttumblr://x-callback-url/blog?blogNamevishers />meta propertyal:ios:app_name contentTumblr />meta propertyal:ios:app_store_id content305343404 />meta propertyal:android:url contenttumblr://x-callback-url/blog?blogNamevishers />meta propertyal:android:app_name contentTumblr />meta propertyal:android:package contentcom.tumblr />!-- END TUMBLR FACEBOOK OPENGRAPH TAGS -->!-- TWITTER TAGS -->meta charsetutf-8>meta nametwitter:site contenttumblr />meta nametwitter:card contentsummary />meta nametwitter:description contentI blog about faith in life and whatever else is currently making demands on my attention. />meta nametwitter:title contentTwo Negatives />meta nametwitter:app:name:iphone contentTumblr />meta nametwitter:app:name:ipad contentTumblr />meta nametwitter:app:name:googleplay contentTumblr />meta nametwitter:app:id:iphone content305343404 />meta nametwitter:app:id:ipad content305343404 />meta nametwitter:app:id:googleplay contentcom.tumblr />meta nametwitter:app:url:iphone contenttumblr://x-callback-url/blog?blogNamevishers&referrertwitter-cards />meta nametwitter:app:url:ipad contenttumblr://x-callback-url/blog?blogNamevishers&referrertwitter-cards />meta nametwitter:app:url:googleplay contenttumblr://x-callback-url/blog?blogNamevishers&referrertwitter-cards />!-- GOOGLE CAROUSEL -->script typeapplication/ld+json> {@type:ItemList,url:https:\/\/blog.twonegatives.com,itemListElement:{@type:ListItem,position:1,url:https:\/\/blog.twonegatives.com\/post\/642922251110531072\/using-mkvtoolnix-and-gnu-parallel-to-whip-some},{@type:ListItem,position:2,url:https:\/\/blog.twonegatives.com\/post\/641653886743085056\/org-todo-current-tab-has-learned-direct-support},{@type:ListItem,position:3,url:https:\/\/blog.twonegatives.com\/post\/641382130049531904\/how-to-check-for-an-entry-in-the-knownhosts},{@type:ListItem,position:4,url:https:\/\/blog.twonegatives.com\/post\/641110330764918784\/org-todo-current-git-branch-makes-an-org-todo},{@type:ListItem,position:5,url:https:\/\/blog.twonegatives.com\/post\/641031044900044800\/emacs-lisp-a-small-wrapper-for-grubers},{@type:ListItem,position:6,url:https:\/\/blog.twonegatives.com\/post\/641019772249817088\/applescripts-for-creating-and-closing-zoom},{@type:ListItem,position:7,url:https:\/\/blog.twonegatives.com\/post\/640566725538086912\/effective-applescript-opening-a-google-chrome},{@type:ListItem,position:8,url:https:\/\/blog.twonegatives.com\/post\/639660762711851008\/applescript-to-jiggle-a-window},{@type:ListItem,position:9,url:https:\/\/blog.twonegatives.com\/post\/639570173898227713\/eternal-terminal-is-an-alternative-to-mosh-with},{@type:ListItem,position:10,url:https:\/\/blog.twonegatives.com\/post\/639490889137438720\/bite-size-bash-by-b0rk-is-awesome},@context:http:\/\/schema.org}/script>link relcanonical hrefhttps://blog.twonegatives.com />/head>body>div idheader>div idinner-header>h1>a href/>Two Negatives/a>/h1>h2>I blog about faith in life and whatever else is currently making demands on my attention.script typetext/javascript> var _gaq _gaq || ; _gaq.push(_setAccount, UA-24885986-1); _gaq.push(_trackPageview); (function() { var ga document.createElement(script); ga.type text/javascript; ga.async true; ga.src (https: document.location.protocol ? https://ssl : http://www) + .google-analytics.com/ga.js; var s document.getElementsByTagName(script)0; s.parentNode.insertBefore(ga, s); })();/script>link relstylesheet href//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/styles/solarized-light.min.css>script src//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/highlight.min.js>/script>script>hljs.initHighlightingOnLoad();/script>/h2>/div>div idheader-shadow>/div>/div> !-- end #header -->div idposts classautopagerize_page_element>div classpost>div classdate>a href/day/2021/02/12 classpermalink>span classmonth>Feb/span>span classday>12/span>/a>/div> !-- end .date -->div classtext> h3>Using `mkvtoolnix` and `GNU Parallel` to Whip Some .ASS/h3>div classtext-body>p>I recently needed to work some a hrefhttps://mkvtoolnix.download/>code>mkvmerge/mkvpropedit/code>/a> magic for someanime. It’s been a em>long/em> time since the days when I started watchinga hrefhttps://myanimelist.net/anime/269/Bleach>Bleach/a> with my friends by code>sshing/code> to one laptop from another andusing a hrefhttp://www.mplayerhq.hu/>code>mplayer/code>/a> in a terminal to play the show and the state of a hrefhttps://www.matroska.org/index.html>mkv/a>support has come a very long way since then./p>p>These days I prefer playing all my media through a hrefhttps://www.plex.tv/>Plex/a> which is justhard to describe in all its towering greatness. The show that I wantedto watch though had its a hrefhttps://en.wikipedia.org/wiki/SubStation_Alpha>ASS/a> subtitles and accompanying fonts brokenout from it’s MKV files for reasons unknown to me. Because of this andthe amazing malleability of MKV I decided to roll up my sleeves andfix the problem myself./p>pre>code>shopt -s extglobparallel -q --tagstring {/.} --line-buffer mkvmerge \ -o {.}_merged.mkv {} --language 0:eng {.}.en.ass \ --attachment-description \ --attachment-mime-type application/x-truetype-font \ --attach-file {//}/fonts/A-OTF-FutoMinA101Pro-Bold.otf \ … 147 similar lines … ::: Season*/!(*_merged).mkv/code>/pre>p>The main reasons I’m writing this up at all are several fold:/p>ol>li>Often times what I’m doing with a hrefhttps://www.gnu.org/software/parallel/>GNU Parallel/a> is complex enough thatit warrants an actual shell function or script em>or/em> it’s strong>so/strong>simple that it more or less amounts to slapping one of thearguments onto the end. Because of this I’ve rarely exploredcode>parallels/code> native expansion support which this task gave me anopportunity to do./li>li>The task was complex enough also that I learned about code>parallels/code>a hrefhttps://www.gnu.org/software/parallel/man.html#QUOTING>double expansion/a> which I’m sure has been the source of manyfrustrating missteps in the past now that I know it’s there.Essentially bash will process the arguments to parallel firstobeying all a hrefhttps://mywiki.wooledge.org/Quotes>the normal rules/a> and then pass them to the code>exec/code> ofcode>parallel/code>, then code>parallel/code> will pass them again to a subshellwhich will code>parse/code> them again through all the normal rules. Keepingthis all straight in your head is not easy but I think theessential rule is probably something like “If you actually noticethe double expansion you should write a function/script for thebehavior and otherwise you should probably be running with -q” orsomething similar but better worded than that./li>li>It’s fun to mess with mkv files. ¯\_(ツ)_/¯/li>/ol>p>To review the script:/p>ol>li>We’re setting a hrefhttps://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching>extglob/a> because we want to be able to process onlycode>mkv/code> files that haven’t been code>_merged/code> yet./li>li>We’re invoking code>parallel/code> with code>-q/code> because we don’t want thesubshell to word split our carefully constructed arguments again./li>li>p>We’re using code>--tagstring {/.} --line-buffer/code> because we want to seeour job output live so we know it’s working (it takes a bit to makethese changes to the matroska files). It’s not directly documentedAFAICT that code>--tagstring/code> supports GNU Parallel expansion but Itook a chance on it and was pleasantly surprised. This particularexpansion is the a hrefhttps://www.gnu.org/software/parallel/man.html#OPTIONS>code>basename-sans-extension/code>/a> version which seemedlike a sensical tag for the logged lines./p>p>This feature alone is worth using parallel for when you’re reallydoing complex parallel work. It’s a really efficient way to provideactive log lines that are still comprehensible later on.code>--line-buffer/code> just makes sure that you always get a full linefrom a job rather than the lines from the various jobs mixingmid-line./p>/li>li>code>-o {.}_merged.mkv/code> is a nice way to express the bash-ism ofcode>${x%.*}_merged.mkv/code>./li>li>code>--language 0:eng {.}.en.ass/code> is a bit speculative as it’s what Ithink I em>should/em> have run but I didn’t initially since I was workingoff an example that a hrefhttps://gist.github.com/Advan721/6804e86c6e33ea6a4cbf>didn’t include it/a>. Nevertheless I think I’minterpreting the docs correctly. Originally I just didn’t includethe code>--language 0:eng/code> bit so the subtitles were attached as anunknown language and I had to then go back through and correct thatwith an code>mkvpropedit/code> run./li>li>Then I used a bit of a hrefhttps://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html>Emacs Keyboard Macro/a> magic to transform thea hrefhttps://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html>Dired/a> fonts buffer into a series of attachment arguments so thatthe ASS subtitle track could be properly rendered. The code>parallel/code>expansion there of code>{//}/code> was also something I hadn’t seen beforeand is how I managed to get away with this from the root of theseasons directory rather than needing to process the seasons one ata time. That one specifically expands to the dirname of the inputline or as a bash-ism code>${d%/*}/code>./li>li>Finally we’re taking arguments from the code>extglob/code> that matches allthe code>Seasons/code> mkv files excluding the code>_merged/code> files which you cansee are what the code>parallel/code> tasks are actually producing./li>/ol>p>With all this I was able to completely saturate my wired connection tomy Synology and efficiently process the entire show. I love the smellof burning silicon in the morning./p>p>I hope this little foray into code>parallel/code>/code>mkvtoolnix/code> land teaches yousomething like it taught me./p>p>Happy scripting!/p>/div>/div> !-- end .text -->ul classpost-footer>li>a hrefhttps://blog.twonegatives.com/post/642922251110531072/using-mkvtoolnix-and-gnu-parallel-to-whip-some>Permalink/a>/li>li>a hrefhttps://blog.twonegatives.com/post/642922251110531072/using-mkvtoolnix-and-gnu-parallel-to-whip-some#disqus_thread>/a>/li>li>Posted at 9:00 AM/li>li>Tagged: a hrefhttps://blog.twonegatives.com/tagged/gnu%20parallel classtag>gnu parallel/a> a hrefhttps://blog.twonegatives.com/tagged/mkvtoolnix classtag>mkvtoolnix/a> a hrefhttps://blog.twonegatives.com/tagged/scripting classtag>scripting/a> a hrefhttps://blog.twonegatives.com/tagged/matroska classtag>matroska/a>/li>/ul> !-- end .post-footer -->/div> !-- end .post -->div classpost>div classdate>a href/day/2021/01/29 classpermalink>span classmonth>Jan/span>span classday>29/span>/a>/div> !-- end .date -->div classtext> h3>`org-todo-current-tab` Has Learned Direct Support for Reader View/h3>div classtext-body>p>I’ve come to em>really/em> enjoy using a hrefhttps://add0n.com/chrome-reader-view.html>Reader View/a>. It’s filled that a hrefhttps://web.archive.org/web/20160902035802/https://readability.com/>Arc90Readability/a> shaped hole in my heart./p>p>In fact, my em>only/em> problem with Reader View is that it broke mycode>org-todo-current-tab/code> Applescript which I use to extract todo itemsfrom Chrome./p>p>No more!/p>pre>code>tell application Finder to set current_tab_handlers to (load script file current_tab_handlers.scpt of folder Dropbox of home as alias)tell application Google Chrome set theTab to active tab of front window if theTabs URL contains chrome-extension:// then set readerHref to execute theTab javascript document.querySelector(iframe).contentDocument.getElementById(reader-domain).href set theUrl to readerHref set theTitle to execute theTab javascript document.querySelector(iframe).contentDocument.getElementById(reader-title).innerText.replaceAll(/\\/g, ) set theAuthor to execute theTab javascript document.querySelector(iframe).contentDocument.getElementById(reader-credits).innerText set theEstimatedTime to execute theTab javascript document.querySelector(iframe).contentDocument.getElementById(reader-estimated-time).innerText set theContent to execute theTab javascript document.querySelector(iframe).contentDocument.getElementById(readability-page-1).innerText.split(\\n).map( x > x.replace(/(.{70,}?)\\s/g, $1\\n).split(\\n).map( y > + y ).join(\\n)).join(\\n) set the clipboard to ** TODO & ¬ & theUrl & & theTitle & by & theAuthor & & theEstimatedTime & & ¬ (do shell script date +%F %a %H:%M) & #+begin_quote & ¬ theContent & ¬ #+end_quote else tell current_tab_handlers to set theLink to org_current_tab() set the clipboard to ** TODO & ¬ theLink & & ¬ (do shell script date +%F %a %H:%M) & end ifend tell/code>/pre>p>The best part about this is em>because/em> Reader View is taking care ofextracting the article for me it makes it dead simple to exract theactual text of the article and put it right in the todo. I don’tgenerally then read the article that way but at least I have theactual text stored for later if I want to search for it./p>p>This script makes heavy use of Applescript’s ability to run javascriptin the tab. In fact it’s arguable that the whole script should justmove directly into there since that’s a more capable programmingenvironment./p>/div>/div> !-- end .text -->ul classpost-footer>li>a hrefhttps://blog.twonegatives.com/post/641653886743085056/org-todo-current-tab-has-learned-direct-support>Permalink/a>/li>li>a hrefhttps://blog.twonegatives.com/post/641653886743085056/org-todo-current-tab-has-learned-direct-support#disqus_thread>/a>/li>li>Posted at 9:00 AM/li>li>Tagged: a hrefhttps://blog.twonegatives.com/tagged/applescript classtag>applescript/a> a hrefhttps://blog.twonegatives.com/tagged/google%20chrome classtag>google chrome/a> a hrefhttps://blog.twonegatives.com/tagged/scripting classtag>scripting/a> a hrefhttps://blog.twonegatives.com/tagged/org-mode classtag>org-mode/a> a hrefhttps://blog.twonegatives.com/tagged/emacs classtag>emacs/a>/li>/ul> !-- end .post-footer -->/div> !-- end .post -->div classpost>div classdate>a href/day/2021/01/26 classpermalink>span classmonth>Jan/span>span classday>26/span>/a>/div> !-- end .date -->div classtext> h3>How to Check for an Entry in the `known_hosts` File/h3>div classtext-body>p>As part of my work I write provisioning scripts for ephemeralcomputing environments (you don’t develop anything directly on yourlaptop, do you!?). While I was a happy Chef user for years theunfortunate rise of Dockerfiles and the extreme and inexplicableaversion of your average developer to Chef has lead me more and moredown the path of coding things in bash./p>p>The hardest thing about a provisioning script, of course, is writingidempotent behavior. If you’re not em>truly/em> in container territory ityields faster iteration time to make each step cheap in the face ofhaving already been done./p>p>I recently wanted to do just that for adding code>github.com/code> to mycode>~/.ssh/known_hosts/code> file. Initially I reached for grep only toremember two things:/p>ol>li>code>~/.ssh/known_hosts/code> doesn’t necessarily list the host in plaintextso grepping is strictly a non-starter/li>li>code>openssh/code> is one of the most featureful CLI projects around/li>/ol>p>It was this second realization that sent me off to the man page todiscover the a hrefhttps://man.openbsd.org/ssh-keygen#F>code>-F/code> option/a>. Specifically, if you want to know whether acode>known_hosts/code> entry exists for a host, you run code>ssh-keygen -F <host>:port/code> which exits with the expected exit statuses./p>p>So in the end I threw together this little snippet:/p>pre>code>if ! ssh-keygen -F github.comthen ssh-keyscan github.com | tee -a ~/.ssh/known_hosts && ssh-keygen -F github.com || { echo Failed to add github.com to known_hosts >&2 exit 1 }fi/code>/pre>p>Cheers!/p>/div>/div> !-- end .text -->ul classpost-footer>li>a hrefhttps://blog.twonegatives.com/post/641382130049531904/how-to-check-for-an-entry-in-the-knownhosts>Permalink/a>/li>li>a hrefhttps://blog.twonegatives.com/post/641382130049531904/how-to-check-for-an-entry-in-the-knownhosts#disqus_thread>/a>/li>li>Posted at 9:01 AM/li>li>Tagged: a hrefhttps://blog.twonegatives.com/tagged/openssh classtag>openssh/a> a hrefhttps://blog.twonegatives.com/tagged/bash classtag>bash/a> a hrefhttps://blog.twonegatives.com/tagged/scripting classtag>scripting/a>/li>/ul> !-- end .post-footer -->/div> !-- end .post -->div classpost>div classdate>a href/day/2021/01/23 classpermalink>span classmonth>Jan/span>span classday>23/span>/a>/div> !-- end .date -->div classtext> h3>`org-todo-current-git-branch` Makes an Org todo Heading Out of the Current Git Branch/h3>div classtext-body>p>I manage all my todos through a hrefhttps://orgmode.org/>org-mode/a>. It’s fantastic. I find myselfwanting to capture todo items quickly from various contexts usingspecialized logic for each one. I maintain some of these asapplescripts so that I can run them outside of the context of emacsand then paste them in but sometimes the context is in fact emacsitself./p>p>That’s the case for capturing the current git branch as an org todo./p>pre>code>(defun timvisher-org-todo-current-git-branch () (interactive) (let ((todo-item (format ** TODO %s%s %s (file-relative-name (magit-toplevel) ~) (magit-get-current-branch) (format-time-string %F %a %H:%M)))) (kill-new todo-item) (message Saved ‘%s’ to the kill ring todo-item)))/code>/pre>p>The primary things this is getting me are:/p>ol>li>p>A nested code>** TODO …/code> entry. All my todos start out under atop-level code>* Inbox/code> heading. That’s actually one of the reasons Iwanted this function at all. Despite how great whacking code>C-u C-c C-x M/code> is it keeps the contextual heading level which meant that Ihad to then whack code>M-→/code> to get it properly indented. With this itstarts that way./p>/li>li>p>It wouldn’t be hard to actually link to the branch but since I doall of my work in dedicated tmux sessions this doesn’t really makesense. strong>Oooo/strong> now that I think about it wouldn’t it be nice to havesupport for linking to a tmux session…/p>p>em>/me makes a note./em>/p>/li>li>p>I capture the time that the todo was created accurately./p>/li>/ol>p>Cheers!/p>/div>/div> !-- end .text -->ul classpost-footer>li>a hrefhttps://blog.twonegatives.com/post/641110330764918784/org-todo-current-git-branch-makes-an-org-todo>Permalink/a>/li>li>a hrefhttps://blog.twonegatives.com/post/641110330764918784/org-todo-current-git-branch-makes-an-org-todo#disqus_thread>/a>/li>li>Posted at 9:00 AM/li>li>Tagged: a hrefhttps://blog.twonegatives.com/tagged/elisp classtag>elisp/a> a hrefhttps://blog.twonegatives.com/tagged/emacs%20lisp classtag>emacs lisp/a> a hrefhttps://blog.twonegatives.com/tagged/emacs classtag>emacs/a> a hrefhttps://blog.twonegatives.com/tagged/org-mode classtag>org-mode/a> a hrefhttps://blog.twonegatives.com/tagged/todo classtag>todo/a>/li>/ul> !-- end .post-footer -->/div> !-- end .post -->div classpost>div classdate>a href/day/2021/01/22 classpermalink>span classmonth>Jan/span>span classday>22/span>/a>/div> !-- end .date -->div classtext> h3>Emacs Lisp: A Small Wrapper for Gruber’s `titlecase`/h3>div classtext-body>p>I write pretty much everything I write that’s more than a hrefhttps://blog.twitter.com/en_us/topics/product/2017/Giving-you-more-characters-to-express-yourself.html>280/a> charactersin a hrefhttps://www.gnu.org/software/emacs/>Emacs/a>. A lot of that has a title associated with it and ever sincediscovering it my preferred way to a hrefhttps://en.wikipedia.org/wiki/Title_case>title case/a> text is to run itthrough Gruber’s a hrefhttps://daringfireball.net/2008/08/title_case_update>code>titlecase/code> script/a>./p>p>Emacs already has em>fantastic/em> facilities for a hrefhttps://www.gnu.org/software/emacs/manual/html_node/emacs/Shell.html>running shell commands/a>,one of which is code>C-u M-| …/code> which will run a command on the region(apparently even if it’s non-contiguous) and replace it with theoutput. This is how I’ve been doing it for em>years/em> but there’s justone problem: code>titlecase/code> adds a trailing newline to the text which Ithen need to clean up./p>p>I ran across a hrefhttps://www.emacswiki.org/emacs/titlecase.el>code>titlecase.el/code>/a> around the same time I found code>titlecase/code>itself but for whatever reason I decided it wasn’t worth my time toinstall. I finally pilfered the parts of it I wanted recently and it’sbeen the dream I always though it would be./p>pre>code>(defun timvisher-titlecase (begin end) (interactive *r) (unless (region-active-p) (error Must be called with an active region)) (let* ((pt (point)) (source-text (delete-and-extract-region begin end)) (titlecased-text (with-temp-buffer (insert source-text) (call-process-region (point-min) (point-max) titlecase t t nil) ;; skip trailing newline (buffer-substring-no-properties (point-min) (1- (point-max)))))) (insert titlecased-text) (goto-char pt)))/code>/pre>/div>/div> !-- end .text -->ul classpost-footer>li>a hrefhttps://blog.twonegatives.com/post/641031044900044800/emacs-lisp-a-small-wrapper-for-grubers>Permalink/a>/li>li>a hrefhttps://blog.twonegatives.com/post/641031044900044800/emacs-lisp-a-small-wrapper-for-grubers#disqus_thread>/a>/li>li>Posted at 12:00 PM/li>li>Tagged: a hrefhttps://blog.twonegatives.com/tagged/emacs classtag>emacs/a> a hrefhttps://blog.twonegatives.com/tagged/elisp classtag>elisp/a> a hrefhttps://blog.twonegatives.com/tagged/titlecase classtag>titlecase/a> a hrefhttps://blog.twonegatives.com/tagged/john%20gruber classtag>john gruber/a>/li>/ul> !-- end .post-footer -->/div> !-- end .post -->div classpost>div classtext> h3>Applescripts for Creating and Closing Zoom Meetings/h3>div classtext-body>p>I think it’s widely understood that we’re all using Zoom a lot moresince March of 2020. I was inspired by something I didn’t write downto write up an Applescript for creating a New Zoom Meeting so I canget more ‘Fastest Gun’ awards from my co-workers. While I was at it Ialso wrote a Close Zoom Meeting script that automates getting me backto blissful private office work mode./p>p>Here they are:/p>p>code>New Zoom Meeting.applescript/code>:/p>pre>code>tell application zoom.us to activatetell application System Events tell process zoom.us repeat until window Zoom Meeting exists keystroke v using {command down, control down} delay 1 end repeat end tell if (name of application processes whose background only is false) contains VLC then tell application VLC set audio volume to 64 end tell end ifend tell/code>/pre>p>code>Close Zoom Meeting.applescript/code>/p>pre>code>-- Set my media player and system volumes back to my typical listening levelset volume output volume 69tell application System Events if (name of application processes whose background only is false) contains VLC then tell application VLC set audio volume to 160 end tell end ifend tell-- Tell zoom to quit but this will likely fail because theres an active meeting and it will dialog with me about whether to really leave the meeting.try tell application zoom.us to quitend try-- So long as zoom.us is still active just whack enter until it goes away.tell application System Events repeat while name of processes contains zoom.us -- The double check here is necessary because otherwise you occasionally send an enter to the next active application if name of processes contains zoom.us then tell process zoom.us key code 36 end tell end if delay 1 end repeatend tell-- Close all the zoom.us tabs in my browsertell application Google Chrome repeat with tabList in (tabs of windows whose URL contains zoom.us) close tabList end repeatend tell/code>/pre>p>Obviously you may not use VLC or Chrome but these script should bepretty easy to adapt to whatever you’re workflow actually is./p>p>Isn’t Applescript fun?/p>/div>/div> !-- end .text -->ul classpost-footer>li>a hrefhttps://blog.twonegatives.com/post/641019772249817088/applescripts-for-creating-and-closing-zoom#note-container>1 note/a>/li>li>a hrefhttps://blog.twonegatives.com/post/641019772249817088/applescripts-for-creating-and-closing-zoom>Permalink/a>/li>li>a hrefhttps://blog.twonegatives.com/post/641019772249817088/applescripts-for-creating-and-closing-zoom#disqus_thread>/a>/li>li>Posted at 9:01 AM/li>li>Tagged: a hrefhttps://blog.twonegatives.com/tagged/applescript classtag>applescript/a> a hrefhttps://blog.twonegatives.com/tagged/zoom classtag>zoom/a> a hrefhttps://blog.twonegatives.com/tagged/remote%20work classtag>remote work/a> a hrefhttps://blog.twonegatives.com/tagged/scripting classtag>scripting/a>/li>/ul> !-- end .post-footer -->/div> !-- end .post -->div classpost>div classdate>a href/day/2021/01/17 classpermalink>span classmonth>Jan/span>span classday>17/span>/a>/div> !-- end .date -->div classtext> h3>Effective Applescript: Opening a Google Chrome Bookmark Folder/h3>div classtext-body>p>I’ve been attempting to live my life a hrefhttps://francescocirillo.com/pages/pomodoro-technique>30 minutes at a time/a> recently andpart of that is ensuring that I’m not constantly distracted by myinbox. Unfettered access to attention is the devil’s own work and aslittle as possible should be allowed./p>p>As such I’ve been trying to make it a practice recently of shuttingdown every app and site that acts as an inbox for me unless I’mem>actively/em> engaged with it. My practice then is to essentially check myinbox every 30 minutes or so in case something truly urgent has comein and practice a hrefhttp://www.43folders.com/43-folders-series-inbox-zero>Inbox Zero/a> each time, moving anything that takes morethan 2 minutes but is not truly urgent into my todo list./p>p>Doing this every 30 minutes was starting to become annoying despitehow effortless it is to open apps and sites using a hrefhttps://qsapp.com/>Quicksilver/a> so Idecide to take it a step further and automate it with Applescript so Ican simply whack code>⌘-space inbox RET/code> and get to down to business./p>pre>code>tell application Google Chrome repeat with b in (get URL of bookmark items of bookmark folder Inbox of bookmark folder Bookmarks Bar) open location b end repeatend telltell application Mail to activatetell application Slack to activate/code>/pre>p>The primary reason I’m posting about this generally uninterestingscript is because at first I actually had all the bookmarks in my“Inbox” folder explicitly listed out in separate code>open location …/code>statements. This was obviously less than ideal because I decided toadd a hrefhttps://twitter.com>Twitter/a> to my Inbox and would’ve then had to go and add it to thescript by hand./p>p>I did a little bit of digging and found out that the a hrefhttps://www.google.com/chrome/>Chrome/a> dictionarydoes, in fact, support accessing bookmarks by folder. Then a quicktrip to a hrefhttps://stackoverflow.com/questions/24864868/applescripts-to-open-all-sites-in-bookmark-folder-in-chrome>Stack Overflow/a> got me over the hump./p>p>As an aside I originally had the statement code>repeat with b in (URL of bookmark items…/code> rather than code>repeat with b in (get URL of bookmark items…/code> but was erroring out with an error code that didn’t yieldanything obvious (but what Applescript error codes ever do?). It’sunclear to me why the code>get/code> is necessary here. code>get/code> is one of thosethings that I still sometimes just start sprinkling over myApplescripts until they seem to work which is never a good place tobe./p>p>Happy scripting!/p>/div>/div> !-- end .text -->ul classpost-footer>li>a hrefhttps://blog.twonegatives.com/post/640566725538086912/effective-applescript-opening-a-google-chrome>Permalink/a>/li>li>a hrefhttps://blog.twonegatives.com/post/640566725538086912/effective-applescript-opening-a-google-chrome#disqus_thread>/a>/li>li>Posted at 9:00 AM/li>li>Tagged: a hrefhttps://blog.twonegatives.com/tagged/effective%20applescript classtag>effective applescript/a> a hrefhttps://blog.twonegatives.com/tagged/google%20chrome classtag>google chrome/a> a hrefhttps://blog.twonegatives.com/tagged/bookmarks classtag>bookmarks/a> a hrefhttps://blog.twonegatives.com/tagged/automation classtag>automation/a>/li>/ul> !-- end .post-footer -->/div> !-- end .post -->div classpost>div classdate>a href/day/2021/01/07 classpermalink>span classmonth>Jan/span>span classday>07/span>/a>/div> !-- end .date -->div classtext> h3>Applescript to Jiggle a Window/h3>div classtext-body>p>I have this ridiculous problem (a hrefhttps://twitter.com/timvisher/status/988109731574308865>because I am a strong>em>developer/em>/strong> in theyear of our Lord strong>2021/strong>/a>) where occasionally as I disconnect andreconnect my monitors on my laptop, a hrefhttps://iterm2.com/>iTerm/a> windows will be resized bythe window manager but the code>$COLUMNS/code> and code>$LINES/code> variables won’t getupdated. I have no idea what actually causes this but it really playshavoc with my prompts/emacs/tmux setup./p>p>After some experimentation I realized that I could force them to beupdated by jiggling the size of the window just a small amountmanually. But, as I said, em>I am a strong>developer/strong> in the year of our Lordstrong>2021/strong>/em>; reaching for the mouse and aiming at the edge of the windowwas just too hard./p>p>Enter my beloved Applescript:/p>pre>code>tell application iTerm set currentBounds to bounds of front window set width to item 3 of currentBounds copy currentBounds to tempBounds set item 3 of tempBounds to (width - (width * 0.1)) set bounds of front window to tempBounds delay 0.25 set bounds of front window to currentBoundsend tell/code>/pre>p>Now instead of reaching for my mouse I can whack code>⌘-space jiggle window RET/code> and we’re back in business./p>p>a hrefhttps://xkcd.com/1205/>Now strong>em>this/em>/strong> is productivity!/a>/p>p>/ht a hrefhttps://alvinalexander.com/source-code/mac-os-x/how-size-or-resize-application-windows-applescript/>alvinalexander.com/a> and a hrefhttp://downloads.techbarrack.com/books/programming/AppleScript/website/records/copy_command.html>techbarrack.com/a>/p>/div>/div> !-- end .text -->ul classpost-footer>li>a hrefhttps://blog.twonegatives.com/post/639660762711851008/applescript-to-jiggle-a-window>Permalink/a>/li>li>a hrefhttps://blog.twonegatives.com/post/639660762711851008/applescript-to-jiggle-a-window#disqus_thread>/a>/li>li>Posted at 9:00 AM/li>li>Tagged: a hrefhttps://blog.twonegatives.com/tagged/applescript classtag>applescript/a> a hrefhttps://blog.twonegatives.com/tagged/iterm2 classtag>iterm2/a>/li>/ul> !-- end .post-footer -->/div> !-- end .post -->div classpost>div classdate>a href/day/2021/01/06 classpermalink>span classmonth>Jan/span>span classday>06/span>/a>/div> !-- end .date -->div classtext> h3>Eternal Terminal Is an Alternative to Mosh With Support for Tmux -CC and Native Scrolling Over TCP/h3>div classtext-body>p>a hrefhttps://eternalterminal.dev/>Eternal Terminal/a> just rolled through my Inbox. While it doesn’t soundlike it has anything that I’m particularly interested in over code>mosh/code> acouple things caught my eye:/p>ol>li>It uses TCP rather than UDP which could be attractive for somefirewall scenarios. Specifically it almost seems like a proof ofconcept em>for/em> the underlying ‘resumable TCP’ implementation thatapparently any application can use./li>li>It supports a hrefhttps://github.com/tmux/tmux/wiki/Control-Mode>code>tmux -CC/code>/a>. For people who make heavy use of tmuxfeatures that want a native’ experience in iTerm2 this soundspretty great./li>li>It doesn’t have scrolling problems like code>mosh/code> does since, IIUC, itactually does attach your terminal directly to the remote session.You get native scroll bars, native search, etc. because of that./li>/ol>p>Maybe this’ll scratch an itch for you that I don’t have?/p>/div>/div> !-- end .text -->ul classpost-footer>li>a hrefhttps://blog.twonegatives.com/post/639570173898227713/eternal-terminal-is-an-alternative-to-mosh-with>Permalink/a>/li>li>a hrefhttps://blog.twonegatives.com/post/639570173898227713/eternal-terminal-is-an-alternative-to-mosh-with#disqus_thread>/a>/li>li>Posted at 9:00 AM/li>li>Tagged: a hrefhttps://blog.twonegatives.com/tagged/mosh classtag>mosh/a> a hrefhttps://blog.twonegatives.com/tagged/eternal%20terminal classtag>eternal terminal/a>/li>/ul> !-- end .post-footer -->/div> !-- end .post -->div classpost>div classdate>a href/day/2021/01/05 classpermalink>span classmonth>Jan/span>span classday>05/span>/a>/div> !-- end .date -->div classtext> h3>Bite Size Bash by b0rk is awesome!/h3>div classtext-body>p>a hrefhttps://twitter.com/b0rk>@b0rk/a> is at it again with another a hrefhttps://wizardzines.com/zines/bite-size-bash/>fanastic zine/a>. This one’s about atopic that’s a hrefhttps://blog.twonegatives.com/tagged/effective-bash>unusually near and dear to me/a> so I absolutely couldn’tresist snapping it up./p>p>Bite Size Bash is everything you should expect from a Julia Evanszine: comprehensive, insightful, and fun. While I have a few quibbleswith the content (I’m sorry but code>set -e/code> is the a hrefhttps://mywiki.wooledge.org/BashFAQ/105>devil’s own work/a>, andplease don’t read a file or anything else line by line a hrefhttps://mywiki.wooledge.org/DontReadLinesWithFor>with a forloop/a>) but these little quibbles are far outweighed by the mountain ofother good and cogent content in the zine./p>p>I especially love her descriptions of what bash is particularly goodat: Gluing processes together, concurrency management, and executiontracing, for a small sample./p>p>If you’ve been ignoring my advice about diving into a hrefhttps://mywiki.wooledge.org/BashGuide>Greg’s BashGuide/a> (or even if you haven’t been) I would whole-heartedly recommendgrabbing yourself a copy of a hrefhttps://wizardzines.com/zines/bite-size-bash/>Bite Size Bash/a> and getting familiar withone of the most pragmatic tools available to anyone developingsoftware (or operating in any other way) a *nix system./p>/div>/div> !-- end .text -->ul classpost-footer>li>a hrefhttps://blog.twonegatives.com/post/639490889137438720/bite-size-bash-by-b0rk-is-awesome>Permalink/a>/li>li>a hrefhttps://blog.twonegatives.com/post/639490889137438720/bite-size-bash-by-b0rk-is-awesome#disqus_thread>/a>/li>li>Posted at 12:00 PM/li>li>Tagged: a hrefhttps://blog.twonegatives.com/tagged/bash classtag>bash/a> a hrefhttps://blog.twonegatives.com/tagged/b0rk classtag>b0rk/a> a hrefhttps://blog.twonegatives.com/tagged/book%20review classtag>book review/a>/li>/ul> !-- end .post-footer -->/div> !-- end .post -->/div> !-- end #posts -->div idpagination classautopagerize_insert_before>a href/page/2 relnext>← Older entries/a>/div>div idfooter>div idsearch>form idsearchbox form action/search methodget>input typetext idkeywords nameq value/>input typesubmit idsubmit valueSearch/>/form>/div> !-- end #search -->ul idmeta-info>li>a href/archive>Archive/a>/li>li>a href/random>Random/a>/li>li>a href/mobile>Mobile/a>/li>li>a hrefhttps://blog.twonegatives.com/rss>RSS/a>/li>li>a href/ask>Ask me anything/a>/li>/ul>ul idtheme-info>li>Powered by a hrefhttps://www.tumblr.com/>Tumblr/a>/li>li>ER2 theme by a hrefhttp://cubicle17.com/>Bill Israel/a>/li>/div>/div> !-- end #footer -->!-- Disqus -->script typetext/javascript> //!CDATA (function() { var links document.getElementsByTagName(a); var query ?; for(var i 0; i links.length; i++) { if(linksi.href.indexOf(#disqus_thread) > 0) { query + url + i + + encodeURIComponent(linksi.href) + &; } } document.write(script charsetutf-8 typetext/javascript srchttp://disqus.com/forums/twonegativesblog/get_num_replies.js + query + >/ + script>); })(); //>/script>iframe scrollingno width1 height1 frameborder0 stylebackground-color:transparent; overflow:hidden; position:absolute; top:0; left:0; z-index:9999; idga_target>/iframe>script typetext/javascript> (function(){ var analytics_frame document.getElementById(ga_target); var analytics_iframe_loaded; var user_logged_in; var blog_is_nsfw No; var eventMethod window.addEventListener ? addEventListener : attachEvent; var eventer windoweventMethod; var messageEvent eventMethod attachEvent ? onmessage : message; eventer(messageEvent,function(e) { var message (e.data && e.data.split) ? e.data.split(;) : ; switch (message0) { case analytics_iframe_loaded: analytics_iframe_loaded true; postCSMessage(); postGAMessage(); break; case user_logged_in: user_logged_in message1; postGAMessage(); break; } }, false); analytics_frame.src https://assets.tumblr.com/analytics.html?_v9f5febfd57a8a649c598d888f2d9e062# + https://blog.twonegatives.com; function postGAMessage() { if (analytics_iframe_loaded && user_logged_in) { var is_ajax false; analytics_frame.contentWindow.postMessage(tick_google_analytics, is_ajax, user_logged_in, blog_is_nsfw, /?route%2F.join(;), analytics_frame.src.split(/analytics.html)0); } } function postCSMessage() { COMSCORE true; analytics_frame.contentWindow.postMessage(enable_comscore; + window.location, analytics_frame.src.split(/analytics.html)0); } })();/script>script typetext/javascript nonceuMOQr5uRTWxG7krOT8Sg8SKCIek>!function(s){s.srchttps://px.srvcs.tumblr.com/impixu?T1727758628&JeyJ0eXBlIjoidXJsIiwidXJsIjoiaHR0cDovL2Jsb2cudHdvbmVnYXRpdmVzLmNvbS8iLCJyZXF0eXBlIjowLCJyb3V0ZSI6Ii8ifQ&UKPGIJLMHPG&K6bc8db07614d26e799e763c6db773efa0a158b4291539a7b67ac91fe25f4ca2a&R.replace(/&R^&$*/,).concat(&R+escape(document.referrer)).slice(0,2000).replace(/%.?.?$/,);}(new Image());/script>noscript>img styleposition:absolute;z-index:-3334;top:0px;left:0px;visibility:hidden; srchttps://px.srvcs.tumblr.com/impixu?T1727758628&JeyJ0eXBlIjoidXJsIiwidXJsIjoiaHR0cDovL2Jsb2cudHdvbmVnYXRpdmVzLmNvbS8iLCJyZXF0eXBlIjowLCJyb3V0ZSI6Ii8iLCJub3NjcmlwdCI6MX0&UKPGIJLMHPG&K3033d58dfc62e915a4135da74dc0005f8fd2a6cd58c6f410bdf4696b6caa7806&R>/noscript>script typetext/javascript nonceuMOQr5uRTWxG7krOT8Sg8SKCIek>!function(s){s.srchttps://px.srvcs.tumblr.com/impixu?T1727758628&JeyJ0eXBlIjoicG9zdCIsInVybCI6Imh0dHA6Ly9ibG9nLnR3b25lZ2F0aXZlcy5jb20vIiwicmVxdHlwZSI6MCwicm91dGUiOiIvIiwicG9zdHMiOlt7InBvc3RpZCI6IjY0MjkyMjI1MTExMDUzMTA3MiIsImJsb2dpZCI6NDk2NjE2Mywic291cmNlIjozM30seyJwb3N0aWQiOiI2NDE2NTM4ODY3NDMwODUwNTYiLCJibG9naWQiOjQ5NjYxNjMsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiNjQxMzgyMTMwMDQ5NTMxOTA0IiwiYmxvZ2lkIjo0OTY2MTYzLCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjY0MTExMDMzMDc2NDkxODc4NCIsImJsb2dpZCI6NDk2NjE2Mywic291cmNlIjozM30seyJwb3N0aWQiOiI2NDEwMzEwNDQ5MDAwNDQ4MDAiLCJibG9naWQiOjQ5NjYxNjMsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiNjQxMDE5NzcyMjQ5ODE3MDg4IiwiYmxvZ2lkIjo0OTY2MTYzLCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjY0MDU2NjcyNTUzODA4NjkxMiIsImJsb2dpZCI6NDk2NjE2Mywic291cmNlIjozM30seyJwb3N0aWQiOiI2Mzk2NjA3NjI3MTE4NTEwMDgiLCJibG9naWQiOjQ5NjYxNjMsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiNjM5NTcwMTczODk4MjI3NzEzIiwiYmxvZ2lkIjo0OTY2MTYzLCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjYzOTQ5MDg4OTEzNzQzODcyMCIsImJsb2dpZCI6NDk2NjE2Mywic291cmNlIjozM31dfQ&UFCHNOFCOLK&K5e3f57a2c7e35a2b6a396cfc7639b59054d0160e89a5b3c39ec0ad456268f4c5&R.replace(/&R^&$*/,).concat(&R+escape(document.referrer)).slice(0,2000).replace(/%.?.?$/,);}(new Image());/script>noscript>img styleposition:absolute;z-index:-3334;top:0px;left:0px;visibility:hidden; srchttps://px.srvcs.tumblr.com/impixu?T1727758628&JeyJ0eXBlIjoicG9zdCIsInVybCI6Imh0dHA6Ly9ibG9nLnR3b25lZ2F0aXZlcy5jb20vIiwicmVxdHlwZSI6MCwicm91dGUiOiIvIiwicG9zdHMiOlt7InBvc3RpZCI6IjY0MjkyMjI1MTExMDUzMTA3MiIsImJsb2dpZCI6NDk2NjE2Mywic291cmNlIjozM30seyJwb3N0aWQiOiI2NDE2NTM4ODY3NDMwODUwNTYiLCJibG9naWQiOjQ5NjYxNjMsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiNjQxMzgyMTMwMDQ5NTMxOTA0IiwiYmxvZ2lkIjo0OTY2MTYzLCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjY0MTExMDMzMDc2NDkxODc4NCIsImJsb2dpZCI6NDk2NjE2Mywic291cmNlIjozM30seyJwb3N0aWQiOiI2NDEwMzEwNDQ5MDAwNDQ4MDAiLCJibG9naWQiOjQ5NjYxNjMsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiNjQxMDE5NzcyMjQ5ODE3MDg4IiwiYmxvZ2lkIjo0OTY2MTYzLCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjY0MDU2NjcyNTUzODA4NjkxMiIsImJsb2dpZCI6NDk2NjE2Mywic291cmNlIjozM30seyJwb3N0aWQiOiI2Mzk2NjA3NjI3MTE4NTEwMDgiLCJibG9naWQiOjQ5NjYxNjMsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiNjM5NTcwMTczODk4MjI3NzEzIiwiYmxvZ2lkIjo0OTY2MTYzLCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjYzOTQ5MDg4OTEzNzQzODcyMCIsImJsb2dpZCI6NDk2NjE2Mywic291cmNlIjozM31dLCJub3NjcmlwdCI6MX0&UFCHNOFCOLK&K7bc13cf44736ce0e8abf99aa4fcbf5af007a4eef4423494f7dd99ac5262d0df6&R>/noscript>noscript idbootloader data-bootstrap{"Components":{"PostActivity":,"NotificationPoller":{"messaging_keys":,"token":"","inbox_unread":0},"DesktopDashboardLogo":{"animations":"https:\/\/assets.tumblr.com\/images\/logo\/hover-animations\/1.png?_v161861acded461bb6e995593a3bae835","https:\/\/assets.tumblr.com\/images\/logo\/hover-animations\/1@2x.png?_v496a774637302a598c851381d00009b0"},"TumblelogIframe":{"unified":true,"variant":null,"isCompact":true,"tumblelogBundleSrc":"https:\/\/assets.tumblr.com\/client\/prod\/standalone\/tumblelog\/index.build.js?_v03e800b27eff76cee863b8346f5e3e52","tumblelogName":"vishers","isLoggedIn":false,"isFriend":false,"formKey":"","canSubscribe":false,"isSubscribed":false,"tumblelogTitle":"Two Negatives","tumblelogAvatar":"https:\/\/64.media.tumblr.com\/avatar_8115996a42fc_64.pnj","tumblelogAvatar128":"https:\/\/64.media.tumblr.com\/avatar_8115996a42fc_128.pnj","tumblelogHost":"https:\/\/blog.twonegatives.com","hasCustomDomain":true,"isOptica":false,"isCustomTheme":true,"themeHeaderImage":"https:\/\/64.media.tumblr.com\/9791e3ac6b55616ef7caa5d5fffa1886\/4f4da46ff536cdc6-1d\/s2048x3072\/3193fe9f828213aa5511cb5a28b01aa5e49c208c.png","themeBackgroundColor":"#FAFAFA","themeTitleColor":"#444444","themeAccentColor":"#529ECC","brag":true,"canShowAd":false,"isPremium":false,"showLrecAds":false,"showStickyLrecBackfill":false,"showGeminiAds":false,"geminiSectionCodeDesktop":"a10bca9c-0c5d-4a02-ab13-14ab8513d81d","geminiSectionCodeMobile":"ced63809-b609-4aca-96a0-abc099acba6b","currentPageType":"blog","currentPage":1,"searchQuery":"","tag":"","query":"","chrono":false,"postId":"","src":"https:\/\/blog.twonegatives.com\/","postUrl":"","openInPeeprUrl":"https:\/\/www.tumblr.com\/vishers","isBlocked":null,"isAdmin":false,"lookupButtonUrl":"","showSpamButton":false,"showRootPostButton":false,"rootPostUrl":"","showRadarPostButton":false,"radarKeys":"","isUniblocked":false,"isNsfw":false,"isAdult":false,"isSpam":false,"isPrimaryBlog":false,"canEdit":false,"canReblogSelf":false,"showLikeButton":false,"showReblogButton":false,"reblogUrl":"","showMessagingButton":false,"loginCheckIframeSrc":"https:\/\/assets.tumblr.com\/assets\/html\/iframe\/login_check.html?_v3de94a184d600617102ddd5b48fb36e9","appInstallUrls":{"android":"https:\/\/play.google.com\/store\/apps\/details?idcom.tumblr\u0026referrerutm_source%3Dtumblr%26utm_medium%3Diframe%26utm_campaign%3Dbn_continue_or_install_cta","ios":"https:\/\/apps.apple.com\/app\/apple-store\/id305343404?pt212308\u0026ctbn_continue_or_install_cta\u0026mt8"},"appOpenReferrer":"bn_header_open_btn","isShowSearch":true,"supplyLogging":,"secondsSinceLastActivity":-1,"installUrlOpenFailed":{"android":"https:\/\/play.google.com\/store\/apps\/details?idcom.tumblr\u0026referrerutm_source%3Dtumblr%26utm_medium%3Diframe%26utm_campaign%3Dbn_header_app_open_failed","ios":"https:\/\/apps.apple.com\/app\/apple-store\/id305343404?pt212308\u0026ctbn_header_app_open_failed\u0026mt8"},"loginWallVariant":"small_center"},"CommunityLabels":{"has_community_label":false,"is_single":false,"redirect_target":null}},"Flags":{"features":"eyJmaWx0ZXJfbnNmdyI6dHJ1ZSwibW9iaWxlX3dlYl9nYXRlIjp0cnVlLCJzYWZlX21vZGUiOnRydWUsInNhZmVfbW9kZV9lbmFibGVkIjp0cnVlLCJrZXljb21tYW5kX2F1dG9fcGFnaW5hdGUiOnRydWUsImxvZ2dlZF9vdXRfc2VhcmNoIjp0cnVlLCJrcmFrZW5fd2ViX2xvZ2dpbmdfbGlicmFyeSI6dHJ1ZSwibGl2ZXBob3Rvc193ZWIiOnRydWUsInVzZXJfdGFnX2ZpbHRlcmluZyI6dHJ1ZSwic2FmZV9tb2RlX293bl9wb3N0Ijp0cnVlLCJwcm9qZWN0X3hfYXBwZWFsIjp0cnVlLCJtb2JpbGVfd2ViX3Bob3Rvc2V0cyI6dHJ1ZSwiaGlkZV9kZWZhdWx0X2hlYWRlcnNfYmxvZ19jYXJkcyI6dHJ1ZSwibm90aWZpY2F0aW9uX3JlcGx5X2xpbmtfdG9fbm90ZXMiOnRydWUsInR5cGluZ19pbmRpY2F0b3Jfd3JpdGUiOnRydWUsInR1bWJscl92aWRlb19zcG9uc29yZWRfZGF5Ijp0cnVlLCJjYXB0Y2hhOnVzZV9yZWNhcHRjaGEyIjp0cnVlLCJsaXR0bGVfc2lzdGVyIjp0cnVlLCJsb2dfbGFkeSI6dHJ1ZSwicmVkcG9wX3Bvc3RfZm9ybV9tb2JpbGVfY3JlYXRlIjp0cnVlLCJsZWdhY3lfcG9zdF9mb3JtX2J1dHRvbnNfbGlua190b19yZWRwb3AiOnRydWUsInNob3dfdHNwX2NsaWNrX3Rocm91Z2hfdG9nZ2xlIjp0cnVlLCJkYXJsYV9hZF9mZWVkYmFjayI6dHJ1ZSwic3RhdHVzX2luZGljYXRvciI6dHJ1ZSwiY29udmVyc2F0aW9uYWxfbm90aWZpY2F0aW9ucyI6dHJ1ZSwiZGlzYWJsZV95YWhvb19iX2Nvb2tpZSI6dHJ1ZSwibGl2ZXBob3RvcyI6dHJ1ZSwiY29tbXVuaXR5X2xhYmVscyI6dHJ1ZX0"},"Context":{"name":"default","time":1727758628000,"userinfo":{"primary":"","name":"","channels":},"hosts":{"assets_host":"https:\/\/assets.tumblr.com","secure_assets_host":"https:\/\/assets.tumblr.com","www_host":"https:\/\/www.tumblr.com","secure_www_host":"https:\/\/www.tumblr.com","embed_host":"https:\/\/embed.tumblr.com","safe_host":"https:\/\/safe.txmblr.com","platform_host":"https:\/\/platform.tumblr.com"},"language":"en_US","language_simple":"en","assets":"https:\/\/assets.tumblr.com\/client\/prod\/"},"Translations":{"%1$sReport %2$s's post?%3$sIf it violates our user guidelines, we'll remove it.%4$s":"%1$sReport %2$s's reblog?%3$sIf it violates our user guidelines, we'll remove it.%4$s","%1$sReport %2$s's reply?%3$sIf it violates our user guidelines, we'll remove it.%4$s":"%1$sReport %2$s's reblog?%3$sIf it violates our user guidelines, we'll remove it.%4$s","%1$sDelete your tip??%2$s":"%1$sDelete your tip?%2$s","Deleting your tip":"Deleting your tip will only remove it from the replies tab and notes. %1$sYou won't receive a refund of your tip.%2$s For further help contact %3$sTumblr Support%4$s."}}>/noscript>script srchttps://assets.tumblr.com/client/prod/standalone/tumblelog/index.build.js?_v03e800b27eff76cee863b8346f5e3e52>/script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]