<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-21773982</id><updated>2026-10-14T11:42:42.975-07:00</updated><category term="Fortran"/><category term="Android"/><category term="Microsoft"/><category term="antivirus"/><category term="malware"/><category term="VPN"/><category term="visual studio .net"/><category term="DNS"/><category term="WiFi"/><category term="c#"/><category term="firewall"/><category term="google"/><category term="linux"/><category term="security"/><category term="windows"/><category term="Windows 10"/><category term="bug"/><category term="java"/><category term="protection"/><category term="smartphone"/><category term="uninstall"/><category term="Apache"/><category term="Bitcoin"/><category term="Control Panel"/><category term="GPU"/><category term="Roaming profile"/><category term="VirtualDub"/><category term="asp.net"/><category term="change registry setting"/><category term="database"/><category term="errors"/><category term="failure"/><category term="ide"/><category term="insert"/><category term="linkedin"/><category term="matlab"/><category term="merge"/><category term="online scan"/><category term="pda"/><category term="spyware"/><category term="sql server 2008"/><category term="update"/><category term="virus"/><category term=".Net"/><category term="32bit"/><category term="64bit"/><category term="ADO.Net"/><category term="Audio"/><category term="Azure"/><category term="BSOD"/><category term="C++"/><category term="CNAME"/><category term="CRAN"/><category term="Cloud"/><category term="DLL"/><category term="DMZ"/><category term="DVD"/><category term="DataSet"/><category term="DivX"/><category term="GSL"/><category term="IMSL"/><category term="IP camera"/><category term="Intel Fortran"/><category term="Litecoin"/><category term="MAC address"/><category term="MKL"/><category term="Machine Learning"/><category term="MapReduce"/><category term="NAT"/><category term="Notes"/><category term="Port Forwarding"/><category term="R software"/><category term="RAM"/><category term="RSA"/><category term="SEO"/><category term="SQL"/><category term="SSID"/><category term="SVM"/><category term="SVN"/><category term="Sharpen"/><category term="Subversion"/><category term="TFS"/><category term="Team Foundation Server"/><category term="Utilities"/><category term="Windows Key"/><category term="Windows Registry"/><category term="Wndows XP tips"/><category term="Xiaomi"/><category term="antispyware"/><category term="blogger"/><category term="botnet"/><category term="browser"/><category term="callback"/><category term="cloud computing"/><category term="commands"/><category term="compile"/><category term="compress"/><category term="cpu"/><category term="csharp"/><category term="dumpbin"/><category term="editbin"/><category term="encryption"/><category term="environment path"/><category term="exception"/><category term="fatal error"/><category term="firewall hardening"/><category term="hadoop"/><category term="install"/><category term="joomla"/><category term="kaspersky"/><category term="network"/><category term="pcflank"/><category term="phablet"/><category term="plugin"/><category term="privacy"/><category term="replace text"/><category term="router"/><category term="select"/><category term="shell script windows powershell certificate"/><category term="smartphones"/><category term="software firewall"/><category term="stack"/><category term="tablet"/><category term="tablets"/><category term="tips"/><category term="unmanaged code"/><category term="video"/><category term="visual studio"/><category term="web hosting"/><category term="windows 8"/><category term="wordpress"/><category term=".Net Remoting"/><category term="2FA"/><category term="3D modelling"/><category term="3D printer"/><category term="A Records"/><category term="A8-6600K"/><category term="AAC"/><category term="ADSL"/><category term="ADSL filters"/><category term="AI video"/><category term="ALU"/><category term="AMD"/><category term="AMD FM2"/><category term="AMD stream Computing"/><category term="ANN"/><category term="APPEND Path"/><category term="APU"/><category term="AR7routers"/><category term="ASIC"/><category term="ASP Postback"/><category term="ATI"/><category term="AUC"/><category term="AVG ThreatLab"/><category term="AWS"/><category term="AWS Amazon Developer Associate"/><category term="Add or Remove programs"/><category term="Add user"/><category term="Administrator"/><category term="Alert"/><category term="Alibabacloud"/><category term="Alt"/><category term="Amazon EC2"/><category term="Android 11"/><category term="Android mobile phones"/><category term="AnkhSVN"/><category term="Antec C40 CPU Cooler"/><category term="Apple"/><category term="Athlon XP"/><category term="BCDedit"/><category term="BLAS"/><category term="BTC"/><category term="Babel fish"/><category term="Backup and Sync"/><category term="Bada"/><category term="Barton"/><category term="Bash"/><category term="Bias"/><category term="BigData"/><category term="Blue Screen of Death"/><category term="Bone Conduction Earphones"/><category term="Boot Manager"/><category term="BootLoader"/><category term="Branching"/><category term="Brook"/><category term="Browser Spy"/><category term="Browser security"/><category term="BrowserCheck"/><category term="Browserscope"/><category term="Bulk Insert"/><category term="C compiler"/><category term="CCleaner"/><category term="CDEx"/><category term="CEO"/><category term="CMD prompt"/><category term="CMS Security Discussion - Drupal"/><category term="CUDA"/><category term="CVEs reported"/><category term="Caffe2"/><category term="Celeron"/><category term="Cheat sheets"/><category term="Check in"/><category term="Chess"/><category term="Chinese"/><category term="Chroma Noise Reduction"/><category term="CleanBrowsing"/><category term="Clickjacking Protection"/><category term="Client ID"/><category term="Client Secret"/><category term="Cloud Foundry"/><category term="Cloudflare"/><category term="Clustering"/><category term="CollabnetSubversion"/><category term="Composite cable"/><category term="Contract Address"/><category term="Control Hub"/><category term="CrazyDomains"/><category term="Credentials"/><category term="Cryptocurrencies"/><category term="Ctrl"/><category term="Custom Control"/><category term="DHCP"/><category term="DNS services"/><category term="DUMP files"/><category term="DVB-T + DAB +FM - Software survey"/><category term="DVD Decrypter"/><category term="DVD writer"/><category term="DVDshrink"/><category term="Danii"/><category term="Data Binding"/><category term="Data Science - Evaluating ML Models using Cumulative Gain Lift"/><category term="Data.frame"/><category term="DataGrid"/><category term="DataRelation"/><category term="DataTable"/><category term="DataView"/><category term="Decision Trees"/><category term="Device"/><category term="Discounts"/><category term="Do Not Call"/><category term="Domain Name"/><category term="Door Sensor"/><category term="Driver Kit"/><category term="Dual Boot"/><category term="Dual booting"/><category term="Dynamic Noise Reduction"/><category term="Elastic Cloud"/><category term="English"/><category term="Environment Variable"/><category term="Ether"/><category term="Ethereum"/><category term="Exploratory Data Analysis"/><category term="FDTD"/><category term="FLOPS"/><category term="FPU"/><category term="Fake phone numbers"/><category term="Farbar Recovery Scan Tool"/><category term="Feature Selection"/><category term="File Headers"/><category term="File Manager"/><category term="Flash"/><category term="Folder"/><category term="Forgot Password"/><category term="Fortran90"/><category term="Fortran95"/><category term="Free-tier"/><category term="Froyo"/><category term="Full join"/><category term="Function Keys"/><category term="Fuse"/><category term="GCP"/><category term="GIMP"/><category term="GNU Scientific Library"/><category term="GSL for windows"/><category term="GUI"/><category term="Game"/><category term="Geek"/><category term="Gingerbread"/><category term="Gini Index"/><category term="GlobalEnv"/><category term="Gmail"/><category term="Google API"/><category term="Google Authorization"/><category term="Google Cloud"/><category term="Google Drive Desktop"/><category term="Google Sites"/><category term="Google technologies"/><category term="Grand Mafia"/><category term="GridView"/><category term="HBase"/><category term="HKEY"/><category term="HPC"/><category term="Hard Drive"/><category term="Hidden Folders"/><category term="Hidden Network"/><category term="Hidden SSID"/><category term="Hide my ass"/><category term="Huawei"/><category term="Huawei IDEOS U8150"/><category term="Hue"/><category term="HyperX"/><category term="IBC-R6"/><category term="IDEOs 8160"/><category term="IIS configuration"/><category term="IIS hardening"/><category term="IPS"/><category term="ISO Buster"/><category term="ISP"/><category term="IaaS"/><category term="ImgBurn"/><category term="Immunizers"/><category term="Inner join"/><category term="Installer"/><category term="Intel C / C++"/><category term="Internet Security"/><category term="Investment trading"/><category term="Join"/><category term="JoinView"/><category term="K-S Statistic"/><category term="KDB"/><category term="KIES"/><category term="KNN"/><category term="Kafka viewer"/><category term="Kaggle"/><category term="Kingston"/><category term="KitKat"/><category term="Knuth"/><category term="Kx"/><category term="Kx Systems"/><category term="LAN"/><category term="LCD"/><category term="LED"/><category term="LTC"/><category term="Lambda Expressions"/><category term="Landscape"/><category term="Language translator"/><category term="Lilo"/><category term="Lingyi Mechanical Keyboard"/><category term="Link Scanner"/><category term="Linq"/><category term="Loading Profiles"/><category term="MIDP"/><category term="MIUI"/><category term="ML"/><category term="MP3"/><category term="MPEG2"/><category term="MSBUILD"/><category term="MSI Installer"/><category term="MSVC"/><category term="MTU"/><category term="MVA"/><category term="MX Records"/><category term="Mac filtering"/><category term="Macros"/><category term="Magic Squares"/><category term="MagicDisc"/><category term="MagicISO"/><category term="Managed Code"/><category term="Management studio"/><category term="Manual - Bone Conduction Headphones  Open. Hear"/><category term="McAfee scanner"/><category term="Merging"/><category term="Messages"/><category term="MetaMask"/><category term="Metaverse"/><category term="MiJia"/><category term="Microsoft Account"/><category term="Missing Back button"/><category term="Mobile"/><category term="Mobile Antispyware"/><category term="Mobile Antivirus"/><category term="Mobile Protection"/><category term="Mobile Security"/><category term="Motherboard"/><category term="MySQL"/><category term="NFT"/><category term="NTSC"/><category term="Naive Bayes"/><category term="Network Traffic monitoring"/><category term="Neural Networks"/><category term="Nexus 7"/><category term="Nexus 7 Repair"/><category term="Niagara Falls"/><category term="Nikola Tesla"/><category term="Node.js"/><category term="Nokia 8.3"/><category term="Novel Coronavirus Covid-19 Data Analytics links"/><category term="OAuth 2.0"/><category term="ODBC"/><category term="Occupancy Sensor"/><category term="Open Data"/><category term="OpenDNS"/><category term="OpenMP"/><category term="OpenSEA"/><category term="OracleCloud"/><category term="Outlook"/><category term="Outlook Gmail IMAP stuck in syncing endlessly"/><category term="Own Domain"/><category term="PAL"/><category term="PC"/><category term="PC Authority"/><category term="PC building"/><category term="PCI Slots"/><category term="PHP"/><category term="PaaS"/><category term="PageLoad"/><category term="Paint.Net"/><category term="Palamino"/><category term="Pending Changes"/><category term="Phishtank"/><category term="Photo"/><category term="Picasa web album"/><category term="Playlist"/><category term="Pokemon Trading Card Game"/><category term="Portrait"/><category term="Post"/><category term="Printing"/><category term="Profile Guided OptimizaionBuild Macros"/><category term="Psytel encoder"/><category term="Puppy Linux"/><category term="Python"/><category term="Quad9"/><category term="R"/><category term="R Interoperability"/><category term="R Time Series Functions"/><category term="R calling Fortran"/><category term="RCA"/><category term="RDMS"/><category term="ROC"/><category term="RPMs"/><category term="RTX 2060"/><category term="Radeon"/><category term="RaspberryPi"/><category term="Recovery Console"/><category term="Recovery mode"/><category term="Regedit"/><category term="Registry keys"/><category term="Regression"/><category term="Reverse Proxy"/><category term="Revo Uninstaller"/><category term="Rstudio Server"/><category term="Ruby"/><category term="Ryzen Kaby Lake"/><category term="S8500"/><category term="SDK"/><category term="SELinux configuration"/><category term="SFC"/><category term="SIMD"/><category term="SOHO"/><category term="SQL Connection Dialog"/><category term="SQL Indexes"/><category term="SSD lifespan P/E"/><category term="SSH Tunnelling"/><category term="SSIS"/><category term="STL format"/><category term="Samsung Wave"/><category term="Saturation"/><category term="Save As PDF"/><category term="Scale"/><category term="Scanit"/><category term="Scanners"/><category term="Screenshot button missing"/><category term="Security - USB Antivirus"/><category term="Security Advisory"/><category term="Security News"/><category term="Security Software Review"/><category term="Server 2008 R2"/><category term="Service Account Keys"/><category term="Shift key"/><category term="Sleep is Death"/><category term="Social Engineering"/><category term="Solution Explorer"/><category term="Source Control Explorer"/><category term="South Korea"/><category term="Special Deals"/><category term="Sqoop"/><category term="Stack Checking"/><category term="Start Key"/><category term="Stored Procedure"/><category term="Subeclipse plugin"/><category term="Super Amoled"/><category term="Surface"/><category term="Symbian"/><category term="TDSSKiller"/><category term="TN"/><category term="Tab"/><category term="Telstra Remote Working Solution"/><category term="Test Project"/><category term="Thoroughbred"/><category term="Thread Checker"/><category term="Thread Profiler"/><category term="Threading"/><category term="Transact SQL"/><category term="Trigger"/><category term="TxHash"/><category term="USB Mounting"/><category term="Uninstall - Trend Micro Titanium Antivirus Security Suite"/><category term="VB"/><category term="VMware"/><category term="VOB"/><category term="VOIP"/><category term="VPN client"/><category term="Variance"/><category term="Verify domain"/><category term="Vi editor"/><category term="Virtual Address"/><category term="VirtualBox"/><category term="Visual Studio 2010"/><category term="Visual Studio Setup"/><category term="WEP"/><category term="WPA"/><category term="WPA2"/><category term="Wav"/><category term="Web Intelligence"/><category term="Web3 Wallet"/><category term="WebService"/><category term="Western Digital"/><category term="Whaling"/><category term="Wifi Config"/><category term="WinDBG"/><category term="WinPatrol"/><category term="Windows 7"/><category term="Windows 8 Metro"/><category term="Windows CMD"/><category term="Windows Diagnostics"/><category term="Windows Enterprise Defender"/><category term="Windows Server"/><category term="Windows mobile"/><category term="Winklevoss"/><category term="X11 Port Forwarding"/><category term="XP"/><category term="Xgody JS01 Active Noise Cancellation (ANC) Bluetooth Wireless Earphone device."/><category term="XiaoFang"/><category term="XiaoFang camera"/><category term="Xiaomi Mi Max2"/><category term="YUV"/><category term="Zenithink"/><category term="active sync"/><category term="add and remove programs"/><category term="agile worst methodology"/><category term="algorithms"/><category term="allocatable pointers"/><category term="amazon cloud drive"/><category term="annoying"/><category term="anonymity"/><category term="append"/><category term="apps"/><category term="array of pointers"/><category term="aspect ratio"/><category term="aspx"/><category term="avi"/><category term="avira"/><category term="binary"/><category term="bitdefender"/><category term="black and white background"/><category term="blockchain"/><category term="blog"/><category term="blogspot"/><category term="bog"/><category term="bothunter"/><category term="bottleneck"/><category term="box"/><category term="bridged"/><category term="budget PC"/><category term="cache miss"/><category term="capture"/><category term="catroot"/><category term="cd"/><category term="change name"/><category term="change profile"/><category term="charms"/><category term="check infection"/><category term="chess database"/><category term="cinepak"/><category term="cityVille"/><category term="classification"/><category term="clean windows"/><category term="clock blocks"/><category term="cloud storage"/><category term="code snippet"/><category term="codec"/><category term="coggle"/><category term="colour foreground"/><category term="colour subject"/><category term="columns"/><category term="command center"/><category term="command prompt"/><category term="comodo"/><category term="compiler directives"/><category term="compressing"/><category term="connection string"/><category term="content management"/><category term="conv2"/><category term="convert"/><category term="convolution in 2D"/><category term="cookies"/><category term="cooking ROMs"/><category term="copper pipes"/><category term="copy"/><category term="counter"/><category term="create documents"/><category term="createdb"/><category term="creative commons"/><category term="crypto"/><category term="cryptocurrency"/><category term="cs"/><category term="css cascading stylesheet selector background html external attribute div"/><category term="cuDNN"/><category term="cursor"/><category term="custom action class"/><category term="custom button"/><category term="customize"/><category term="cyber currency"/><category term="darknet"/><category term="date"/><category term="day of the week"/><category term="debug"/><category term="debugger"/><category term="debugging"/><category term="decimal"/><category term="deinterlace"/><category term="delegate"/><category term="delegates"/><category term="delete"/><category term="deletion"/><category term="diagonal"/><category term="digital tv"/><category term="directory"/><category term="dllimport"/><category term="dmp"/><category term="docker"/><category term="dos window"/><category term="downgrade"/><category term="droid"/><category term="dropbox"/><category term="duplicate layer."/><category term="dvd recorder"/><category term="dynamic memory allocation"/><category term="dynamic sql"/><category term="ePad"/><category term="ebook"/><category term="eclipse"/><category term="edit"/><category term="editor"/><category term="eigen"/><category term="email address"/><category term="enable OpenMP"/><category term="enable vectorisation"/><category term="encrypt"/><category term="encrypted search"/><category term="entrypoint"/><category term="error on page"/><category term="event handler"/><category term="explorer.exe"/><category term="export"/><category term="exposed"/><category term="f-secure"/><category term="fake profile"/><category term="fantastico"/><category term="figma"/><category term="file compression"/><category term="file lock"/><category term="file storage"/><category term="filter"/><category term="firmware"/><category term="flaw"/><category term="folder options"/><category term="folder structure"/><category term="format"/><category term="fps"/><category term="framesize"/><category term="free images"/><category term="free software"/><category term="freehostia InfinityFree"/><category term="frozen PC"/><category term="fstab"/><category term="function"/><category term="function pointer"/><category term="gateway"/><category term="gmake"/><category term="google drive"/><category term="google privacy"/><category term="google wave"/><category term="grc"/><category term="group feature selection"/><category term="handwriting"/><category term="head-hunter"/><category term="hearbleed"/><category term="heat pipe"/><category term="heat sinks"/><category term="hidden devices"/><category term="hiding ip"/><category term="histogram"/><category term="hive"/><category term="hot shield"/><category term="hotel"/><category term="iPads"/><category term="iRiver"/><category term="ideaone"/><category term="ieee-utils"/><category term="import"/><category term="inbound"/><category term="indeo"/><category term="inetd"/><category term="infected"/><category term="insertion"/><category term="install Ubuntu Linux"/><category term="install windows server"/><category term="installation"/><category term="installed"/><category term="instructions."/><category term="interference"/><category term="interleaving"/><category term="internet by electric network"/><category term="intptr"/><category term="inverse"/><category term="ip web camera"/><category term="iptables"/><category term="iso"/><category term="job-hunting"/><category term="jokes"/><category term="junkware"/><category term="keras"/><category term="kernel"/><category term="keyboard"/><category term="keyword"/><category term="keywords"/><category term="language"/><category term="leaktest"/><category term="licences"/><category term="list of cloud sites"/><category term="litecoins"/><category term="little schemer"/><category term="localhost"/><category term="logistic regression"/><category term="low battery warning"/><category term="magic"/><category term="magnetic lasso"/><category term="makerbot"/><category term="malwarebytes"/><category term="marketing phone"/><category term="math"/><category term="matlab function in fortran"/><category term="memory"/><category term="meshlab"/><category term="meta tags"/><category term="metered connection"/><category term="mex"/><category term="migration"/><category term="mindmap"/><category term="mining"/><category term="missing icons"/><category term="mobile phones"/><category term="months"/><category term="motion dection"/><category term="msconfig"/><category term="msi"/><category term="multicore"/><category term="multiroots"/><category term="music"/><category term="navigation"/><category term="news feeds"/><category term="ninja saga"/><category term="ntop"/><category term="nvarchar"/><category term="object oriented"/><category term="onboot"/><category term="onecare"/><category term="online development tools"/><category term="online scans"/><category term="online shopping"/><category term="online storage"/><category term="online tools"/><category term="online tv"/><category term="oozie"/><category term="open office"/><category term="open source"/><category term="openCL"/><category term="openSSL"/><category term="operators"/><category term="optimazation"/><category term="orbot"/><category term="outbound"/><category term="outpost"/><category term="panel technologies"/><category term="parallel programming"/><category term="password"/><category term="payload"/><category term="pdf"/><category term="pdfzilla"/><category term="perfmon"/><category term="performance monitor"/><category term="perms"/><category term="permutation"/><category term="pet society"/><category term="phablets"/><category term="phishing"/><category term="phone"/><category term="phone numbers"/><category term="phone spam"/><category term="photo editing"/><category term="photoshop elements"/><category term="php Regedit"/><category term="pig latin"/><category term="pinyin"/><category term="pixabay"/><category term="pocket RAR"/><category term="pointers"/><category term="porgramming"/><category term="postgresQL"/><category term="powerline over ethernet adapters"/><category term="powershell"/><category term="process explorer"/><category term="processor"/><category term="productivity"/><category term="program and features"/><category term="programming tips"/><category term="projects"/><category term="prototyping"/><category term="proxy"/><category term="psql"/><category term="publishing"/><category term="q"/><category term="random selection"/><category term="real-time database"/><category term="recovery DVDs"/><category term="redirect_uri"/><category term="register domain"/><category term="registers"/><category term="registration"/><category term="replace matched"/><category term="repositories"/><category term="reshape"/><category term="reverse lookup"/><category term="rip cd"/><category term="rogueware"/><category term="rotate"/><category term="rows"/><category term="rtf"/><category term="rtsp"/><category term="rucoins"/><category term="runleves"/><category term="scam"/><category term="scandoo"/><category term="scannow"/><category term="scene modes"/><category term="schema"/><category term="scid format"/><category term="scientific library"/><category term="search toolbar"/><category term="secure ports"/><category term="security holes"/><category term="security updates"/><category term="select statement"/><category term="setup guide"/><category term="sharpening"/><category term="shortcut"/><category term="shortcuts"/><category term="shrink"/><category term="shutting down"/><category term="signal strength"/><category term="siteadvisor"/><category term="skydrive"/><category term="socket"/><category term="software"/><category term="software distribution"/><category term="solutions"/><category term="spam"/><category term="special function"/><category term="sqldbm"/><category term="sricam"/><category term="start daemon"/><category term="start server"/><category term="static"/><category term="static routing"/><category term="statistical functions"/><category term="statistical library"/><category term="stealth mode"/><category term="strokes"/><category term="subnet mask"/><category term="subroutine"/><category term="sugarsync"/><category term="svnserve"/><category term="sweave"/><category term="syknet"/><category term="syncplicity"/><category term="sysinternals"/><category term="systray"/><category term="systray.exe"/><category term="tables"/><category term="taskbar"/><category term="tasks"/><category term="tensorflow"/><category term="terracoins"/><category term="themes"/><category term="thingiverse"/><category term="time-series"/><category term="tinkercad"/><category term="toggle"/><category term="toggle button"/><category term="token"/><category term="tor"/><category term="traffic"/><category term="transaction"/><category term="translation"/><category term="trojan"/><category term="tunnel"/><category term="tv"/><category term="twitter"/><category term="txt"/><category term="uninstaller"/><category term="unix"/><category term="unsharp mask"/><category term="unstructured"/><category term="updates"/><category term="usb"/><category term="user accounts"/><category term="user guide"/><category term="username"/><category term="utility function"/><category term="version control"/><category term="vhs"/><category term="video cutting"/><category term="video editing"/><category term="video filters"/><category term="video recording"/><category term="video splitting"/><category term="virtual memory"/><category term="vista"/><category term="vulnerability"/><category term="web"/><category term="web fonts"/><category term="web games"/><category term="web proxy"/><category term="web server"/><category term="web user control"/><category term="web-hosting"/><category term="website check"/><category term="website links"/><category term="website optimization"/><category term="website scan"/><category term="white balance"/><category term="white list"/><category term="widgets"/><category term="wifiinfoview"/><category term="wildcard"/><category term="win10"/><category term="win7"/><category term="windirstat"/><category term="windows explorer"/><category term="windows service"/><category term="windows update"/><category term="windows utility"/><category term="wireless"/><category term="wireless adaptor"/><category term="wireshark"/><category term="word"/><category term="wordpress importer"/><category term="wuauserv"/><category term="yahoo"/><category term="yank"/><category term="year lookup"/><category term="zip"/><category term="zombie"/><category term="zombie computers"/><title type='text'>xTechNotes - Technical Computing Programming Notes</title><subtitle type='html'>Collection of notes on technical / computing related stuff.&#xa;Enable users to search keywords for programming help.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>219</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-21773982.post-2519705111783945907</id><published>2026-09-26T08:04:49.635-07:00</published><updated>2026-09-26T08:04:49.635-07:00</updated><title type='text'>Prompt Gatekeeper and Model Recommender - For Switching Models in ClaudeCode</title><content type='html'>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**Location:** `&amp;lt;USER&amp;gt;\.claude\prompt_gatekeeper_model_switcher.md`&lt;/p&gt;&lt;p&gt;**Created:** 2026-09-26&lt;/p&gt;&lt;p&gt;**Revised:** 2026-09-26 (v2 -- integrity review and rebuild; v3 -- state moved to Stop hook, Option D; v4 -- [check] soft-check mode; v5 -- second integrity review, hooks aligned, doc swept)&lt;/p&gt;&lt;p&gt;**Status:** Implemented and ENABLED (both hooks)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Note: Section 5 examples show the v2 layout in which the state block was printed on&lt;/p&gt;&lt;p&gt;prompt submit. Section 13 supersedes that: state is now shown at end of turn by&lt;/p&gt;&lt;p&gt;`state_monitor.py`, and the submit-time block carries only the model recommendation.&lt;/p&gt;&lt;p&gt;Sections 0 to 4 and 6 to 10 were brought up to date in v5 (Section 15).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;## Table of Contents&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;0. [PRIME DIRECTIVE](#s0)&lt;/p&gt;&lt;p&gt;1. [Intent](#s1)&lt;/p&gt;&lt;p&gt;2. [Design](#s2)&lt;/p&gt;&lt;p&gt;3. [Files and Components](#s3)&lt;/p&gt;&lt;p&gt;4. [Implementation](#s4)&lt;/p&gt;&lt;p&gt;5. [Usage and Examples](#s5)&lt;/p&gt;&lt;p&gt;6. [Enable / Disable](#s6)&lt;/p&gt;&lt;p&gt;7. [Extending the Rules](#s7)&lt;/p&gt;&lt;p&gt;8. [Limitations](#s8)&lt;/p&gt;&lt;p&gt;9. [Convention Scope -- Global](#s9)&lt;/p&gt;&lt;p&gt;10. [Verification -- the state-file design](#s10)&lt;/p&gt;&lt;p&gt;11. [Revision history -- v1 integrity review](#s11)&lt;/p&gt;&lt;p&gt;12. [Future direction -- LLM-based assessment (planning)](#s12)&lt;/p&gt;&lt;p&gt;13. [v3 -- State split to end of turn, Option D implemented](#s13)&lt;/p&gt;&lt;p&gt;14. [v4 -- [check] soft-check mode](#s14)&lt;/p&gt;&lt;p&gt;15. [v5 -- second integrity review](#s15)&lt;/p&gt;&lt;p&gt;A. [Appendix A -- Full source of the live files](#appA)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s0&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 0. PRIME DIRECTIVE&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**The gatekeeper hooks (`gatekeeper.py` and `state_monitor.py`) NEVER run git -- not&lt;/p&gt;&lt;p&gt;directly, not indirectly.**&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Concretely:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- They spawn no processes of any kind. No `subprocess`, no `os.system`, no `os.popen`,&lt;/p&gt;&lt;p&gt;&amp;nbsp; no `pty`, no `multiprocessing`, no shelling out.&lt;/p&gt;&lt;p&gt;- Their only inputs are the JSON that Claude Code pipes to stdin and one file,&lt;/p&gt;&lt;p&gt;&amp;nbsp; `task_state.json`.&lt;/p&gt;&lt;p&gt;- Their only output is one JSON object on stdout.&lt;/p&gt;&lt;p&gt;- A runtime self-check (`check_prime_directive()`) confirms that no process-spawning&lt;/p&gt;&lt;p&gt;&amp;nbsp; module has been loaded. If one ever is, the violation is printed in the user-visible&lt;/p&gt;&lt;p&gt;&amp;nbsp; message and in Claude&#39;s context so it cannot go unnoticed.&lt;/p&gt;&lt;p&gt;- Any future extension (including the LLM-based assessment in Section 12) must honour&lt;/p&gt;&lt;p&gt;&amp;nbsp; this. An HTTP call to a model API is permitted; spawning a CLI is not.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Rationale: a hook fires on every prompt in every project. Running git from it means an&lt;/p&gt;&lt;p&gt;uncontrolled process touching every repository the user opens, with no audit trail and no&lt;/p&gt;&lt;p&gt;way for the user to see it happen. Clean-state assessment is a semantic judgement and is&lt;/p&gt;&lt;p&gt;made from the state file alone (see Section 10).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Scope: the directive binds the two hooks built here. The Siemens-mandated code-scan&lt;/p&gt;&lt;p&gt;`PreToolUse` hook in the same `settings.json` fetches its tool with `uvx --from git+https`;&lt;/p&gt;&lt;p&gt;that is outside this design and is not governed by it.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s1&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 1. Intent&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;When working in Claude Code Terminal across long sessions, two decisions recur constantly:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. **Is it safe to switch model or effort level?** Switching mid-task risks losing context&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;coherence or leaving work in an inconsistent state. The user needs to know whether the&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;current task is genuinely complete before changing model or effort.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. **Which model should I use for this prompt?** Claude Code supports four models with&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;very different cost and capability profiles. Choosing the wrong one either wastes money&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;(using Fable for a simple edit) or produces poor results (using Haiku for complex&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;ontology work). The user should not have to remember the tradeoffs for every prompt.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The Prompt Gatekeeper is a lightweight hook that fires on every prompt submission and&lt;/p&gt;&lt;p&gt;answers both questions automatically:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- It reports whether the session is in a clean state (task complete) or mid-task.&lt;/p&gt;&lt;p&gt;- It analyses the prompt text and recommends the most appropriate model.&lt;/p&gt;&lt;p&gt;- It optionally suggests an effort level.&lt;/p&gt;&lt;p&gt;- It warns explicitly if it is NOT safe to switch, or if the recommended model is&lt;/p&gt;&lt;p&gt;&amp;nbsp; expensive (Fable).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The gatekeeper is ADVISORY only. It never switches the model or effort automatically.&lt;/p&gt;&lt;p&gt;The user reads the recommendation and acts on it (or ignores it).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Note on timing: the hook fires after the prompt is submitted, so the current prompt is&lt;/p&gt;&lt;p&gt;already being handled by the current model. Every recommendation therefore applies to the&lt;/p&gt;&lt;p&gt;NEXT prompt, not this one.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s2&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 2. Design&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### 2.1 Hook mechanism&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Claude Code supports a `UserPromptSubmit` hook: a shell command that fires every time&lt;/p&gt;&lt;p&gt;the user submits a prompt, before Claude processes it. The hook receives a JSON object on&lt;/p&gt;&lt;p&gt;stdin (fields include `user_prompt`, `cwd`, `session_id`, `transcript_path`) and returns&lt;/p&gt;&lt;p&gt;a JSON object on stdout with two channels:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| JSON field | Who sees it |&lt;/p&gt;&lt;p&gt;|------------|-------------|&lt;/p&gt;&lt;p&gt;| `systemMessage` | The USER, in the terminal |&lt;/p&gt;&lt;p&gt;| `hookSpecificOutput.additionalContext` | CLAUDE, injected into its context |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Stderr from a hook that exits 0 goes to the debug log only. It is never shown to the&lt;/p&gt;&lt;p&gt;user, so the gatekeeper does not write to stderr at all.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The hook cannot automatically switch the model or effort. It could block the prompt&lt;/p&gt;&lt;p&gt;(exit code 2) but the gatekeeper never does.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### 2.2 Clean state assessment -- single signal, state file only&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The sole clean-state signal is `task_state.json` at `&amp;lt;USER&amp;gt;\.claude\hooks\`. Claude&lt;/p&gt;&lt;p&gt;writes this file at the start and end of every substantial task, per the global&lt;/p&gt;&lt;p&gt;CLAUDE.md convention. Fields:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| Field | Purpose |&lt;/p&gt;&lt;p&gt;|-------|---------|&lt;/p&gt;&lt;p&gt;| `status` | `&quot;in_progress&quot;` or `&quot;clean&quot;` |&lt;/p&gt;&lt;p&gt;| `task` | Short name of the current task |&lt;/p&gt;&lt;p&gt;| `detail` | Optional extra description |&lt;/p&gt;&lt;p&gt;| `project` | Short project label (e.g. &quot;BFSI&quot;) -- disambiguates across projects |&lt;/p&gt;&lt;p&gt;| `cwd` | Working directory at time of writing -- for context |&lt;/p&gt;&lt;p&gt;| `updated` | ISO timestamp in LOCAL time -- informational; age is taken from file mtime (Section 13) |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If `status` is `&quot;in_progress&quot;` and the file was last written more than 24 hours ago,&lt;/p&gt;&lt;p&gt;both hooks raise a stale warning: the file may have been left dirty and forgotten. The&lt;/p&gt;&lt;p&gt;threshold is `STALE_HOURS` in each script. Age is measured from the file&#39;s modification&lt;/p&gt;&lt;p&gt;time, so it works even when `updated` is empty; the `updated` field is a fallback only.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If the file is missing or unreadable, the state is reported as clean with an explicit&lt;/p&gt;&lt;p&gt;note saying so. If `status` holds any value other than `clean` or `in_progress` (a typo&lt;/p&gt;&lt;p&gt;such as `in-progress`), both hooks report the value and assume clean. There is no&lt;/p&gt;&lt;p&gt;fallback signal (see PRIME DIRECTIVE).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&quot;Task complete&quot; is a semantic judgement. Uncommitted files in a repository are the&lt;/p&gt;&lt;p&gt;normal resting state of a working directory and say nothing about whether a task is&lt;/p&gt;&lt;p&gt;finished, which is why v1&#39;s git corroboration was removed (Section 11).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### 2.3 Model recommendation -- word-boundary keyword matching&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The gatekeeper scans the lowercased prompt for keywords associated with each model.&lt;/p&gt;&lt;p&gt;Rules are evaluated top-to-bottom; the first match wins. If nothing matches, Sonnet is&lt;/p&gt;&lt;p&gt;the default.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Keywords match on word boundaries only: `ttl` matches &quot;ttl&quot; and &quot;ttl-file&quot; but not&lt;/p&gt;&lt;p&gt;&quot;settle&quot;; `no` does not match &quot;know&quot;; `ok` does not match &quot;look&quot;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The Haiku rule additionally applies only to prompts of eight words or fewer. A long&lt;/p&gt;&lt;p&gt;prompt that happens to contain &quot;ok&quot; or &quot;yes&quot; is not a confirmation.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| Model | Trigger keywords (examples) | Use when |&lt;/p&gt;&lt;p&gt;|-------|-----------------------------|----------|&lt;/p&gt;&lt;p&gt;| Opus 5.5 | ttl, sparql, ontology, implement, review all, graphmart | Complex reasoning, code generation, deep review |&lt;/p&gt;&lt;p&gt;| Sonnet 5 | explain, update, edit, what is, clarify | Edits, explanations, medium tasks (default) |&lt;/p&gt;&lt;p&gt;| Haiku 4.5 | yes, ok, go ahead, proceed, thanks (short prompts only) | Confirmations, trivial follow-ups |&lt;/p&gt;&lt;p&gt;| Fable 5.1 | full build, end to end, autonomous, run everything | Long-horizon multi-step autonomous tasks ONLY |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Fable is placed last and carries an explicit cost warning. Anthropic&#39;s guidance: use&lt;/p&gt;&lt;p&gt;Fable for demanding reasoning and long-horizon agentic work, or when Opus at higher&lt;/p&gt;&lt;p&gt;effort still falls short. Price figures in the script header are as recorded in Sep 2026&lt;/p&gt;&lt;p&gt;and unverified; check the current price list before relying on them.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### 2.4 Effort recommendation&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Separately from the model, the gatekeeper scans for effort-signal keywords (also on&lt;/p&gt;&lt;p&gt;word boundaries):&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- High effort: &quot;review all&quot;, &quot;self-review&quot;, &quot;full review&quot;, &quot;check everything&quot;, &quot;audit&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;validate all&quot;, &quot;integrity check&quot;, &quot;deep review&quot;&lt;/p&gt;&lt;p&gt;- Low effort: &quot;quick&quot;, &quot;briefly&quot;, &quot;one line&quot;, &quot;just check&quot;, &quot;in short&quot;&lt;/p&gt;&lt;p&gt;- Otherwise: no effort recommendation (leave current setting)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The lists above are the live `EFFORT_HIGH_KEYWORDS` and `EFFORT_LOW_KEYWORDS` as of v5.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### 2.5 Output&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;On every prompt the gatekeeper returns one JSON object containing a plain-ASCII summary&lt;/p&gt;&lt;p&gt;block for the user (`systemMessage`) and a one-line note for Claude&lt;/p&gt;&lt;p&gt;(`additionalContext`). No colour codes are used because `systemMessage` is rendered by&lt;/p&gt;&lt;p&gt;Claude Code, not by a raw terminal.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s3&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 3. Files and Components&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;`&amp;lt;USER&amp;gt;` = `C:\Users\&amp;lt;username&amp;gt;` on this machine. Substitute your own Windows user path&lt;/p&gt;&lt;p&gt;when replicating on another machine.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Files created (full paths)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| Full path | Purpose |&lt;/p&gt;&lt;p&gt;|-----------|---------|&lt;/p&gt;&lt;p&gt;| `&amp;lt;USER&amp;gt;\.claude\hooks\gatekeeper.py` | UserPromptSubmit hook -- model recommendation, Option D instruction, `[check]` mode (Section 14) |&lt;/p&gt;&lt;p&gt;| `&amp;lt;USER&amp;gt;\.claude\hooks\state_monitor.py` | Stop hook -- shows state at end of each turn (Section 13) |&lt;/p&gt;&lt;p&gt;| `&amp;lt;USER&amp;gt;\.claude\hooks\task_state.json` | Live clean-state signal (read by hook, written by Claude) |&lt;/p&gt;&lt;p&gt;| `&amp;lt;USER&amp;gt;\.claude\prompt_gatekeeper_model_switcher.md` | This document |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Files modified (full paths)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| Full path | Change |&lt;/p&gt;&lt;p&gt;|-----------|--------|&lt;/p&gt;&lt;p&gt;| `&amp;lt;USER&amp;gt;\.claude\settings.json` | Added `UserPromptSubmit` hook block (gatekeeper.py) and `Stop` hook block (state_monitor.py) |&lt;/p&gt;&lt;p&gt;| `&amp;lt;USER&amp;gt;\.claude\CLAUDE.md` | Added &quot;Task State Convention&quot; section -- the global instruction mechanism, including the `[check]` rule |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Note on global vs. project-local instructions&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| Mechanism | Scope | Used for |&lt;/p&gt;&lt;p&gt;|-----------|-------|----------|&lt;/p&gt;&lt;p&gt;| `&amp;lt;USER&amp;gt;\.claude\CLAUDE.md` | Global (all projects) | Standing behavioural rules, conventions |&lt;/p&gt;&lt;p&gt;| `&amp;lt;USER&amp;gt;\.claude\settings.json` | Global (all projects) | Hook registration, model defaults, env vars |&lt;/p&gt;&lt;p&gt;| `&amp;lt;project&amp;gt;\memory\*.md` | Project-local | Project-specific context and decisions |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The task state convention and the PRIME DIRECTIVE both live in the global `CLAUDE.md`&lt;/p&gt;&lt;p&gt;because the hooks are global. No project memory notes are used: auto-memory is keyed to&lt;/p&gt;&lt;p&gt;the directory a session starts from, so anything stored there would be invisible from&lt;/p&gt;&lt;p&gt;other projects. Two BFSI-scoped notes that existed briefly on 2026-09-26 were removed for&lt;/p&gt;&lt;p&gt;that reason; their content is in `CLAUDE.md` and Sections 12 to 15 here.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s4&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 4. Implementation&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The scripts are not reproduced in this section. v1 embedded a copy here and the copy&lt;/p&gt;&lt;p&gt;drifted from the live file within a day (Section 11). The live files are the source of&lt;/p&gt;&lt;p&gt;truth:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&amp;lt;USER&amp;gt;\.claude\hooks\gatekeeper.py&lt;/p&gt;&lt;p&gt;&amp;lt;USER&amp;gt;\.claude\hooks\state_monitor.py&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Since v5, Appendix A holds a full copy of both scripts, `task_state.json` and the two&lt;/p&gt;&lt;p&gt;`settings.json` hook blocks for copy-and-paste. Rule: whenever either script is edited,&lt;/p&gt;&lt;p&gt;re-paste it into Appendix A in the same session, then `py_compile` the live file.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To replicate on another machine:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Step 1 -- Create the hooks directory&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;mkdir &amp;lt;USER&amp;gt;\.claude\hooks&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Step 2 -- Create `task_state.json`&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```json&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;status&quot;: &quot;clean&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;task&quot;: &quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;detail&quot;: &quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;project&quot;: &quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;cwd&quot;: &quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;updated&quot;: &quot;2026-09-26T00:00:00&quot;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Step 3 -- Copy `gatekeeper.py` and `state_monitor.py`&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Copy both live files to `&amp;lt;USER&amp;gt;\.claude\hooks\`. Then confirm they compile and honour&lt;/p&gt;&lt;p&gt;the PRIME DIRECTIVE:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;C:\miniforge3\python -m py_compile gatekeeper.py state_monitor.py&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;and confirm that a source search for `subprocess`, `os.system`, `os.popen` or `git`&lt;/p&gt;&lt;p&gt;finds only the docstrings and the `FORBIDDEN_MODULES` tuples.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Step 4 -- Register both hooks in `settings.json`&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Add the `UserPromptSubmit` and `Stop` blocks inside the existing `&quot;hooks&quot;` object:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```json&lt;/p&gt;&lt;p&gt;&quot;UserPromptSubmit&quot;: [&lt;/p&gt;&lt;p&gt;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;hooks&quot;: [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;type&quot;: &quot;command&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;command&quot;: &quot;/c/miniforge3/python /c/Users/&amp;lt;username&amp;gt;/.claude/hooks/gatekeeper.py&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;statusMessage&quot;: &quot;Gatekeeper assessing prompt...&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ]&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;],&lt;/p&gt;&lt;p&gt;&quot;Stop&quot;: [&lt;/p&gt;&lt;p&gt;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;hooks&quot;: [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;type&quot;: &quot;command&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;command&quot;: &quot;/c/miniforge3/python /c/Users/&amp;lt;username&amp;gt;/.claude/hooks/state_monitor.py&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;timeout&quot;: 5&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ]&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;],&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The Python path uses POSIX style (`/c/miniforge3/python`) because Claude Code runs hook&lt;/p&gt;&lt;p&gt;commands through bash on Windows.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Step 5 -- Add the Task State Convention to the global `CLAUDE.md`&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Paste the &quot;Task State Convention (Gatekeeper Hooks)&quot; section, reproduced in full in&lt;/p&gt;&lt;p&gt;Appendix A.5, into the target machine&#39;s `&amp;lt;USER&amp;gt;\.claude\CLAUDE.md`. Without it, Claude&lt;/p&gt;&lt;p&gt;will not maintain `task_state.json` and the state signal is dead.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Step 6 -- Smoke test&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;printf &#39;{&quot;user_prompt&quot;:&quot;review all the ttl files&quot;}&#39; | /c/miniforge3/python /c/Users/&amp;lt;username&amp;gt;/.claude/hooks/gatekeeper.py&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Expected: one JSON line with `systemMessage` and `hookSpecificOutput`, recommending&lt;/p&gt;&lt;p&gt;Opus 5.5 with effort high, exit code 0.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;printf &#39;{}&#39; | /c/miniforge3/python /c/Users/&amp;lt;username&amp;gt;/.claude/hooks/state_monitor.py&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Expected: one JSON line with a `systemMessage` starting `STATE&amp;nbsp; [CLEAN]`, exit code 0.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s5&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 5. Usage and Examples&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### What you see on every prompt&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Claude Code renders the `systemMessage` block in the terminal. Glance at it and act or&lt;/p&gt;&lt;p&gt;ignore it.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**Example 1 -- Clean state, Opus recommended:**&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;GATEKEEPER&lt;/p&gt;&lt;p&gt;&amp;nbsp; State&amp;nbsp; : [CLEAN]&amp;nbsp; task_state.json: clean&lt;/p&gt;&lt;p&gt;&amp;nbsp; Model&amp;nbsp; : /model Opus 5.5&amp;nbsp; (trigger: &#39;sparql&#39;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; Use for: complex reasoning, TTL/SPARQL authoring, ontology work, deep reviews&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Your prompt was: *&quot;Write a SPARQL query to find all AML alerts above risk 0.7&quot;*&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Action: type `/model Opus 5.5` before your next prompt if you are not already on Opus.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**Example 2 -- Mid-task, Sonnet recommended:**&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;GATEKEEPER&lt;/p&gt;&lt;p&gt;&amp;nbsp; State&amp;nbsp; : [DIRTY]&amp;nbsp; task in progress: &#39;Writing bfsi-case.ttl&#39; [BFSI] -- Phase P1&lt;/p&gt;&lt;p&gt;&amp;nbsp; Model&amp;nbsp; : /model Sonnet 5&amp;nbsp; (trigger: &#39;explain&#39;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; Use for: edits, explanations, updates, medium-complexity tasks&lt;/p&gt;&lt;p&gt;&amp;nbsp; ! [DIRTY] task in progress -- hold off switching model/effort&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Action: do NOT switch until the TTL task is complete.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**Example 3 -- Clean state, effort recommended:**&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;GATEKEEPER&lt;/p&gt;&lt;p&gt;&amp;nbsp; State&amp;nbsp; : [CLEAN]&amp;nbsp; task_state.json: clean&lt;/p&gt;&lt;p&gt;&amp;nbsp; Model&amp;nbsp; : /model Opus 5.5&amp;nbsp; (trigger: &#39;ttl&#39;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; Use for: complex reasoning, TTL/SPARQL authoring, ontology work, deep reviews&lt;/p&gt;&lt;p&gt;&amp;nbsp; Effort : consider /effort high&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**Example 4 -- Fable recommended (with cost warning):**&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;GATEKEEPER&lt;/p&gt;&lt;p&gt;&amp;nbsp; State&amp;nbsp; : [CLEAN]&amp;nbsp; task_state.json: clean&lt;/p&gt;&lt;p&gt;&amp;nbsp; Model&amp;nbsp; : /model Fable 5.1&amp;nbsp; (trigger: &#39;end to end&#39;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; Use for: long-horizon multi-step autonomous tasks only -- most expensive tier&lt;/p&gt;&lt;p&gt;&amp;nbsp; ! NOTE: Fable 5.1 is the most expensive tier. Only use it if this is&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; truly a long-horizon autonomous task that Opus at high effort cannot handle.&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**Example 5 -- Stale state:**&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;GATEKEEPER&lt;/p&gt;&lt;p&gt;&amp;nbsp; State&amp;nbsp; : [DIRTY]&amp;nbsp; task in progress: &#39;Writing bfsi-case.ttl&#39; [BFSI]&lt;/p&gt;&lt;p&gt;&amp;nbsp; Model&amp;nbsp; : /model Sonnet 5&amp;nbsp; (trigger: &#39;default&#39;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; Use for: edits, explanations, updates, medium-complexity tasks&lt;/p&gt;&lt;p&gt;&amp;nbsp; ! Hold off switching model/effort -- finish current task first&lt;/p&gt;&lt;p&gt;&amp;nbsp; ! State flagged in_progress 31h ago in [BFSI] -- may be stale. Clear task_state.json if task is done.&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Action: if the task really is done, ask Claude to reset `task_state.json` to clean.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Since v3 the `State` and stale lines above are printed by the Stop hook as a `STATE`&lt;/p&gt;&lt;p&gt;block at the end of the previous turn (Section 13), and the submit-time block shows&lt;/p&gt;&lt;p&gt;only a one-line `! [DIRTY] ... hold off switching` reminder when the state is dirty.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### How Claude uses the injected context&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Claude receives a short note such as:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;[Gatekeeper] State: DIRTY (task in progress: &#39;Writing bfsi-case.ttl&#39; [BFSI]) --&lt;/p&gt;&lt;p&gt;hold off switching model or effort until current task is complete.&lt;/p&gt;&lt;p&gt;Suggested model: Sonnet 5 (matched keyword &#39;explain&#39;; edits, explanations,&lt;/p&gt;&lt;p&gt;updates, medium-complexity tasks).&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Claude can therefore remind you if you try to switch mid-task. Since v3 the note also&lt;/p&gt;&lt;p&gt;carries the Option D state-maintenance instruction, and in `[check]` mode the CHECK MODE&lt;/p&gt;&lt;p&gt;instruction (Sections 13 and 14).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### How to update task_state.json&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Claude writes this file using the Write tool at task start and end. You can also write&lt;/p&gt;&lt;p&gt;it manually.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**Task starting:**&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```json&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;status&quot;: &quot;in_progress&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;task&quot;: &quot;Writing bfsi-case.ttl&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;detail&quot;: &quot;Phase P1 -- new shared case module&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;project&quot;: &quot;BFSI&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;cwd&quot;: &quot;C:\\d_drive\\workKW\\WorkClaude\\BFSI&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;updated&quot;: &quot;2026-09-26T14:32:00&quot;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**Task complete:**&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```json&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;status&quot;: &quot;clean&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;task&quot;: &quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;detail&quot;: &quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;project&quot;: &quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;cwd&quot;: &quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;updated&quot;: &quot;2026-09-26T15:10:00&quot;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s6&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 6. Enable / Disable&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Each hook is controlled by a single line near the top of its script, independently:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```python&lt;/p&gt;&lt;p&gt;ENABLED = True&amp;nbsp; &amp;nbsp; # change to False to deactivate&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- `gatekeeper.py` -- turns off the model recommendation, the Option D instruction and&lt;/p&gt;&lt;p&gt;&amp;nbsp; `[check]` mode.&lt;/p&gt;&lt;p&gt;- `state_monitor.py` -- turns off the end-of-turn STATE line.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;When `ENABLED = False` the script calls `sys.exit(0)` immediately after the switch is&lt;/p&gt;&lt;p&gt;evaluated. There is no output and no context injection. The hook is still registered in&lt;/p&gt;&lt;p&gt;`settings.json` and Python is still launched on every event, so the cost is one&lt;/p&gt;&lt;p&gt;interpreter start-up (tens of milliseconds), not zero.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Important: a syntax error anywhere in the file defeats the switch, because Python&lt;/p&gt;&lt;p&gt;compiles the whole file before executing the first line. v1 was disabled and still&lt;/p&gt;&lt;p&gt;failed on every prompt for exactly this reason. After ANY edit, run:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;C:\miniforge3\python -m py_compile C:\Users\&amp;lt;username&amp;gt;\.claude\hooks\gatekeeper.py C:\Users\&amp;lt;username&amp;gt;\.claude\hooks\state_monitor.py&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;You do NOT need to touch `settings.json` to toggle either hook on or off.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s7&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 7. Extending the Rules&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Adding keywords to an existing model&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Find the model&#39;s tuple in `MODEL_RULES` and append to its keyword list. Multi-word&lt;/p&gt;&lt;p&gt;phrases are fine; matching is on word boundaries at both ends of the phrase.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Adding a new model&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Add a new tuple to `MODEL_RULES` at the appropriate priority position:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```python&lt;/p&gt;&lt;p&gt;(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;Label&quot;, &quot;model-id&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;description of when to use it&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; [&quot;keyword1&quot;, &quot;keyword2&quot;],&lt;/p&gt;&lt;p&gt;),&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Changing the default model&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Edit `DEFAULT_MODEL_LABEL`, `DEFAULT_MODEL_ID` and `DEFAULT_MODEL_PURPOSE`.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Changing effort keywords&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Edit `EFFORT_HIGH_KEYWORDS` and `EFFORT_LOW_KEYWORDS`.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Changing the Haiku short-prompt limit&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Edit `HAIKU_MAX_WORDS`.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;After any change: `py_compile`, then the smoke test in Section 4 Step 6.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s8&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 8. Limitations&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| Limitation | Detail |&lt;/p&gt;&lt;p&gt;|------------|--------|&lt;/p&gt;&lt;p&gt;| Advisory only | Cannot auto-switch model or effort. User must act on the recommendation. |&lt;/p&gt;&lt;p&gt;| Recommendation is one prompt late | The hook fires after submission. The advice applies to the next prompt. Mitigated by `[check]` mode (Section 14), which assesses without executing. |&lt;/p&gt;&lt;p&gt;| Sonnet label vs. settings alias | `settings.json` maps the `sonnet` alias (`ANTHROPIC_DEFAULT_SONNET_MODEL`) to `claude-sonnet-4-6@default`, while the hook recommends `/model Sonnet 5`. Untested whether `/model Sonnet 5` resolves through the Siemens proxy. If it does not, align the env var or the rule label. |&lt;/p&gt;&lt;p&gt;| Unexpected status is fail-open | A `status` value that is neither `clean` nor `in_progress` is reported and treated as clean by both hooks. A typo therefore unlocks switching, but visibly. |&lt;/p&gt;&lt;p&gt;| Keyword matching is blunt | Word boundaries remove the worst false positives, but &quot;what does TTL stand for?&quot; still recommends Opus. See Section 12. |&lt;/p&gt;&lt;p&gt;| task_state.json requires discipline | If Claude forgets to update the file, the signal is wrong. There is deliberately no fallback (PRIME DIRECTIVE). The 24h stale warning is the only safety net. |&lt;/p&gt;&lt;p&gt;| One global state file | Two concurrent sessions in different projects overwrite each other&#39;s state. The `project` field makes this visible but does not prevent it. |&lt;/p&gt;&lt;p&gt;| No task list integration | The Claude Code in-memory task list is not accessible to an external hook process. |&lt;/p&gt;&lt;p&gt;| Model IDs and prices may drift | Update `MODEL_RULES` and the header manually when models change. |&lt;/p&gt;&lt;p&gt;| POSIX path dependency | The hook command uses `/c/miniforge3/python`. If Python moves, update `settings.json`. |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s9&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 9. Convention Scope -- Global&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Both gatekeeper hooks are GLOBAL -- they fire in every Claude Code session regardless&lt;/p&gt;&lt;p&gt;of project. The task_state.json convention is also implemented globally to match.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The instruction for Claude to update `task_state.json` is in the **global CLAUDE.md**:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&amp;lt;USER&amp;gt;\.claude\CLAUDE.md&amp;nbsp; (section: &quot;Task State Convention (Gatekeeper Hooks)&quot;)&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This file is loaded at the start of every Claude Code session in every project.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| Component | Scope | Location |&lt;/p&gt;&lt;p&gt;|-----------|-------|----------|&lt;/p&gt;&lt;p&gt;| `gatekeeper.py` hook (UserPromptSubmit) | Global (all projects) | `&amp;lt;USER&amp;gt;\.claude\hooks\gatekeeper.py` |&lt;/p&gt;&lt;p&gt;| `state_monitor.py` hook (Stop) | Global (all projects) | `&amp;lt;USER&amp;gt;\.claude\hooks\state_monitor.py` |&lt;/p&gt;&lt;p&gt;| `task_state.json` | Global (shared across all projects) | `&amp;lt;USER&amp;gt;\.claude\hooks\task_state.json` |&lt;/p&gt;&lt;p&gt;| Hook registration | Global (all projects) | `&amp;lt;USER&amp;gt;\.claude\settings.json` |&lt;/p&gt;&lt;p&gt;| Task state convention instruction | Global (all projects) | `&amp;lt;USER&amp;gt;\.claude\CLAUDE.md` |&lt;/p&gt;&lt;p&gt;| This documentation | Global | `&amp;lt;USER&amp;gt;\.claude\prompt_gatekeeper_model_switcher.md` |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s10&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 10. Verification -- the state-file design&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Question asked at the v2 review: is the design genuinely based on looking at a recorded&lt;/p&gt;&lt;p&gt;state in a JSON file that keeps getting updated, rather than on inspecting the workspace?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Answer: yes, and after v2 it is exclusively so.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**How the state is produced.** The global CLAUDE.md instructs Claude to write&lt;/p&gt;&lt;p&gt;`task_state.json` with `status: in_progress` at the start of any substantial task and&lt;/p&gt;&lt;p&gt;`status: clean` at the end. The hook only ever reads this file. It never inspects the&lt;/p&gt;&lt;p&gt;working directory, the repository, or the transcript.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**Evidence the convention is honoured in practice.** A search of the BFSI session&lt;/p&gt;&lt;p&gt;transcripts on 2026-09-26 found 32 writes of an `in_progress` state across three separate&lt;/p&gt;&lt;p&gt;sessions, so Claude has been maintaining the file, not merely being told to.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**What the hook does with it.**&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| task_state.json says | Hooks report |&lt;/p&gt;&lt;p&gt;|----------------------|--------------|&lt;/p&gt;&lt;p&gt;| `status: in_progress`, file written &amp;lt; 24h ago | DIRTY, with task name, project and detail |&lt;/p&gt;&lt;p&gt;| `status: in_progress`, file written &amp;gt; 24h ago | DIRTY plus a stale warning |&lt;/p&gt;&lt;p&gt;| `status: clean` | CLEAN |&lt;/p&gt;&lt;p&gt;| file missing or malformed | CLEAN (gatekeeper) / UNKNOWN (Stop hook), both with an explicit &quot;missing or unreadable, assuming clean&quot; note |&lt;/p&gt;&lt;p&gt;| file parses but has no `status` field | CLEAN (gatekeeper) / UNKNOWN (Stop hook), both saying &quot;no status field, assuming clean&quot; |&lt;/p&gt;&lt;p&gt;| any other `status` value | CLEAN (gatekeeper) / UNKNOWN (Stop hook), both naming the value and saying &quot;assuming clean&quot; |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Age in the first two rows is the file&#39;s modification time (Section 13).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**Known weaknesses of a single state file.** It depends on Claude&#39;s discipline; a&lt;/p&gt;&lt;p&gt;forgotten reset leaves a false DIRTY until the stale warning fires. It is one file&lt;/p&gt;&lt;p&gt;shared by all sessions, so concurrent sessions in different projects clobber each other.&lt;/p&gt;&lt;p&gt;A future refinement is to key the state by `session_id` (which the hook already&lt;/p&gt;&lt;p&gt;receives on stdin) so each session has its own record and the hook reports the state for&lt;/p&gt;&lt;p&gt;the session that asked.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s11&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 11. Revision history -- v1 integrity review&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;An integrity review on 2026-09-26 compared the v1 document against the live files and&lt;/p&gt;&lt;p&gt;tested the hook. Findings and the v2 response:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| # | v1 finding | v2 response |&lt;/p&gt;&lt;p&gt;|---|------------|-------------|&lt;/p&gt;&lt;p&gt;| 1 | `gatekeeper.py` did not compile (nested f-string with backslash escapes, line 276). Because compilation precedes the `ENABLED` check, the hook exited 1 on every prompt even while &quot;disabled&quot;. | Stale message built in plain variables before formatting. Compile check added to Sections 4 and 6. |&lt;/p&gt;&lt;p&gt;| 2 | Design assumed the coloured stderr block was shown to the user. Per the hook docs, stderr on exit 0 goes to the debug log only. | User-facing summary moved to the `systemMessage` JSON field. Stderr and ANSI colours removed. |&lt;/p&gt;&lt;p&gt;| 3 | Git corroboration overrode the state file: any modified tracked file produced DIRTY, which was the resting state of the BFSI repo. | Git removed entirely and made a PRIME DIRECTIVE (Section 0). |&lt;/p&gt;&lt;p&gt;| 4 | Substring keyword matching: &quot;settle&quot; triggered Opus via &quot;ttl&quot;; &quot;know&quot; triggered Haiku via &quot;no&quot;. | Word-boundary regex matching. Haiku restricted to prompts of 8 words or fewer. |&lt;/p&gt;&lt;p&gt;| 5 | Naive timestamps were treated as UTC, under-counting age by the local UTC offset. | Naive timestamps treated as local time. |&lt;/p&gt;&lt;p&gt;| 6 | `cwd` in `task_state.json` read but unused. | Still informational only; documented as such. |&lt;/p&gt;&lt;p&gt;| 7 | Section 4 embedded an older copy of the script that lacked project, cwd and stale detection. | Embedded copy removed; the live file is the single source of truth. |&lt;/p&gt;&lt;p&gt;| 8 | Section 9 referenced a BFSI memory note that does not exist. | Reference removed. |&lt;/p&gt;&lt;p&gt;| 9 | Sonnet 4.6 hard-coded as default while Sonnet 5 is current. | Default is now Sonnet 5. Price figures marked unverified. |&lt;/p&gt;&lt;p&gt;| 10 | CLAUDE.md demanded state-file bookkeeping while the hook was disabled and broken. | Hook enabled. |&lt;/p&gt;&lt;p&gt;| 11 | Hook read the `prompt` stdin field; current docs name it `user_prompt`. | Reads `user_prompt`, falls back to `prompt`. |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Verification after the rebuild: `py_compile` passes; the source contains no process&lt;/p&gt;&lt;p&gt;spawning; eight sample prompts produce the expected recommendations; the four&lt;/p&gt;&lt;p&gt;false-positive cases from v1 no longer misfire; a 2-day-old naive timestamp reports&lt;/p&gt;&lt;p&gt;roughly 53 hours of age.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s12&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 12. Future direction -- LLM-based assessment (planning)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Status: the options below were the planning record. Outcome, per the decisions at the&lt;/p&gt;&lt;p&gt;end of this section: D&#39;s state half is implemented (Section 13), `[check]` mode is&lt;/p&gt;&lt;p&gt;implemented (Section 14), A and C are closed, B is parked, D&#39;s continuation hint is&lt;/p&gt;&lt;p&gt;deferred.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### The problem with keywords&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Keyword matching cannot tell &quot;what does TTL stand for?&quot; (a Haiku question) from&lt;/p&gt;&lt;p&gt;&quot;rewrite the TTL&quot; (an Opus task). It cannot see that a short prompt like &quot;continue&quot;&lt;/p&gt;&lt;p&gt;is continuing a long-horizon build. And it cannot judge the state at all; it can only&lt;/p&gt;&lt;p&gt;read what Claude last wrote. The proposal is to let a model read the prompt (and&lt;/p&gt;&lt;p&gt;optionally the recent transcript), summarise what is being asked, and base both the&lt;/p&gt;&lt;p&gt;model recommendation and the state judgement on that understanding.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Constraints any design must meet&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. PRIME DIRECTIVE holds. An HTTPS call to a model API is acceptable. Spawning the&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;`claude` CLI or any other process is not.&lt;/p&gt;&lt;p&gt;2. Latency is paid on every prompt. Anything above roughly two seconds will be felt.&lt;/p&gt;&lt;p&gt;3. Cost is paid on every prompt. Only a fast, cheap model is defensible.&lt;/p&gt;&lt;p&gt;4. It must fail soft. If the network, proxy or Zscaler state breaks the call, the hook&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;must fall back to the keyword path and say so, never error.&lt;/p&gt;&lt;p&gt;5. No credentials in code. API key from an environment variable only.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Options&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**A. Claude Code native `type: &quot;prompt&quot;` hook.** Claude Code can run a hook as a&lt;/p&gt;&lt;p&gt;single-turn model evaluation instead of a command. The prompt text is supplied via&lt;/p&gt;&lt;p&gt;`$ARGUMENTS` and the model returns a JSON decision. This is the least code and needs no&lt;/p&gt;&lt;p&gt;API key handling because it rides the session&#39;s own authentication. Open questions to&lt;/p&gt;&lt;p&gt;settle with a live test: whether `UserPromptSubmit` supports prompt hooks (the docs do&lt;/p&gt;&lt;p&gt;not list supported events explicitly), and whether the returned decision schema can&lt;/p&gt;&lt;p&gt;carry a free-form recommendation or is limited to allow/block plus reason. There is also&lt;/p&gt;&lt;p&gt;an experimental `type: &quot;agent&quot;` hook that can read files with tools, which could read the&lt;/p&gt;&lt;p&gt;transcript tail to judge task completion, but it is marked experimental and may change.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**B. Direct API call from `gatekeeper.py`.** The Python hook posts the prompt to&lt;/p&gt;&lt;p&gt;Haiku 4.5 through the Siemens proxy with a structured instruction and receives JSON:&lt;/p&gt;&lt;p&gt;`{summary, task_type, horizon, recommended_model, recommended_effort, confidence}`.&lt;/p&gt;&lt;p&gt;Full control over the schema and the fallback. Costs one network round trip per prompt&lt;/p&gt;&lt;p&gt;and depends on the proxy and Zscaler being reachable.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**C. Hybrid (recommended starting point).** Keep the keyword path as the fast lane for&lt;/p&gt;&lt;p&gt;unambiguous cases: very short confirmations, and prompts that contain an explicit Fable&lt;/p&gt;&lt;p&gt;trigger. Call the model (via A or B) only for prompts above a word threshold or with no&lt;/p&gt;&lt;p&gt;keyword hit. Most prompts then cost nothing extra, and the model is consulted exactly&lt;/p&gt;&lt;p&gt;where keywords are weakest.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**D. Ask the main model itself.** Inject an instruction via `additionalContext` telling&lt;/p&gt;&lt;p&gt;Claude to end each reply with a one-line recommendation for the next prompt and to keep&lt;/p&gt;&lt;p&gt;`task_state.json` updated with a short summary. Zero latency and zero extra cost, but it&lt;/p&gt;&lt;p&gt;is self-assessment by the model already chosen, and it only informs the next prompt.&lt;/p&gt;&lt;p&gt;Worth doing regardless, as a complement.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### The bigger prize: LLM-assessed state&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The more valuable use of a model is not picking between Sonnet and Opus. It is judging&lt;/p&gt;&lt;p&gt;whether the previous task actually finished. The hook receives `transcript_path` on&lt;/p&gt;&lt;p&gt;stdin. A fast model given the last few turns of the transcript can answer &quot;was the last&lt;/p&gt;&lt;p&gt;piece of work completed, handed off, or left mid-flight?&quot; far more reliably than a file&lt;/p&gt;&lt;p&gt;Claude has to remember to reset. That judgement can then be written into&lt;/p&gt;&lt;p&gt;`task_state.json` (or a per-session sibling) so the state file becomes model-maintained&lt;/p&gt;&lt;p&gt;rather than discipline-maintained.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Decisions taken&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 2026-09-26: **Option D is approved as an ADDITION to whichever of A/B/C is chosen,&lt;/p&gt;&lt;p&gt;&amp;nbsp; not a replacement.** D cannot see the next prompt, so it cannot judge that prompt&#39;s&lt;/p&gt;&lt;p&gt;&amp;nbsp; depth; its job is to keep `task_state.json` honest and to offer a continuation hint&lt;/p&gt;&lt;p&gt;&amp;nbsp; from work already in flight. Where D and the prompt-based recommendation disagree on&lt;/p&gt;&lt;p&gt;&amp;nbsp; the model, the prompt-based one wins. Nothing in D (or any option) switches the model;&lt;/p&gt;&lt;p&gt;&amp;nbsp; only the user typing `/model` does.&lt;/p&gt;&lt;p&gt;- 2026-09-26 (later): **D&#39;s state-maintenance half is IMPLEMENTED** (Section 13).&lt;/p&gt;&lt;p&gt;&amp;nbsp; D&#39;s continuation-hint half and all of A/B/C remain planning only.&lt;/p&gt;&lt;p&gt;- 2026-09-26: **Option A cannot be gated by keywords.** A prompt hook is a separate&lt;/p&gt;&lt;p&gt;&amp;nbsp; settings entry that Claude Code runs on every prompt; the Python hook cannot switch it&lt;/p&gt;&lt;p&gt;&amp;nbsp; on per prompt and the two cannot communicate. A real keyword-first hybrid (Option C)&lt;/p&gt;&lt;p&gt;&amp;nbsp; therefore requires B, where the model call sits inside `gatekeeper.py`.&lt;/p&gt;&lt;p&gt;- 2026-09-26: **B runs in a separate context.** It is a standalone API call that sees&lt;/p&gt;&lt;p&gt;&amp;nbsp; only what the hook sends it, by default the prompt text. To judge bare prompts like&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;continue&quot; it would need `task_state.json` contents or a transcript tail passed in.&lt;/p&gt;&lt;p&gt;- 2026-09-26 (later): **[check] soft-check mode implemented (Section 14). A and C are&lt;/p&gt;&lt;p&gt;&amp;nbsp; CLOSED. B is PARKED**, to be revived only if the user finds they are routinely&lt;/p&gt;&lt;p&gt;&amp;nbsp; skipping `[check]` on heavy prompts. The soft check gives LLM understanding using the&lt;/p&gt;&lt;p&gt;&amp;nbsp; model already in the session, with full conversation context, no second hook, no API&lt;/p&gt;&lt;p&gt;&amp;nbsp; key and no separate context, which removes the reason A, B and C existed.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Suggested next step&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;(Superseded by the decisions above.) The earlier plan was to prototype C with B as the&lt;/p&gt;&lt;p&gt;model path behind an `LLM_MODE` switch. That is no longer planned. The only open item&lt;/p&gt;&lt;p&gt;is D&#39;s continuation hint, and B stays parked unless `[check]` proves to be skipped on&lt;/p&gt;&lt;p&gt;heavy prompts in practice.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s13&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 13. v3 -- State split to end of turn, Option D implemented&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Implemented 2026-09-26, after the discussion recorded in Section 12.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### The problem with showing state on prompt submit&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;`UserPromptSubmit` fires after the user has typed. Showing the state there tells the&lt;/p&gt;&lt;p&gt;user whether the deck was clear for the prompt they have already sent. The user needs&lt;/p&gt;&lt;p&gt;that information BEFORE typing, at the moment Claude hands control back.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### The split&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| Concern | Hook event | Script | Shown when |&lt;/p&gt;&lt;p&gt;|---------|-----------|--------|------------|&lt;/p&gt;&lt;p&gt;| State (CLEAN / DIRTY, task, age, stale) | `Stop` | `state_monitor.py` | Right after Claude finishes a turn, before the user types |&lt;/p&gt;&lt;p&gt;| Model and effort recommendation | `UserPromptSubmit` | `gatekeeper.py` | After the prompt is sent (applies to the next prompt) |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;`gatekeeper.py` still reads the state, because Claude needs it in `additionalContext`&lt;/p&gt;&lt;p&gt;and because the user-visible block keeps a one-line &quot;task in progress -- hold off&lt;/p&gt;&lt;p&gt;switching&quot; warning at the moment they might reach for `/model`. It no longer prints the&lt;/p&gt;&lt;p&gt;full state block.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### state_monitor.py (Stop hook)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- Same PRIME DIRECTIVE as the gatekeeper: reads `task_state.json` and nothing else,&lt;/p&gt;&lt;p&gt;&amp;nbsp; spawns nothing, never blocks, always exits 0.&lt;/p&gt;&lt;p&gt;- Output is one `systemMessage`, for example:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;STATE&amp;nbsp; [DIRTY]&amp;nbsp; task in progress: &#39;Writing bfsi-case.ttl&#39; [BFSI]&amp;nbsp; (updated 12m ago)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Phase P1 -- new shared case module&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;! Hold off switching model/effort until this task is complete&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;STATE&amp;nbsp; [CLEAN]&amp;nbsp; safe to switch model or effort&amp;nbsp; (updated 3m ago)&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- Stale warning when in_progress for more than `STALE_HOURS` (24).&lt;/p&gt;&lt;p&gt;- Missing or malformed file is reported as `[UNKNOWN] ... assuming clean`.&lt;/p&gt;&lt;p&gt;- Registered in `settings.json` under `&quot;Stop&quot;` with a 5-second timeout.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Age is measured from file mtime, not the `updated` field&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Claude does not know the wall clock. The `updated` timestamps it writes are estimates&lt;/p&gt;&lt;p&gt;and were observed to be hours off. Both scripts therefore take the age from the file&#39;s&lt;/p&gt;&lt;p&gt;modification time, which is the true moment of the last write, and use the `updated`&lt;/p&gt;&lt;p&gt;field only as a fallback if the file cannot be stat&#39;ed.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Option D, state-maintenance half&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;`gatekeeper.py` now appends an instruction to `additionalContext` on every prompt:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- If state is clean: before ending the turn, write `task_state.json` as `in_progress`&lt;/p&gt;&lt;p&gt;&amp;nbsp; if substantial work is being started; do not write it for trivial Q&amp;amp;A.&lt;/p&gt;&lt;p&gt;- If state is in_progress: before ending the turn, write it `clean` if the task is now&lt;/p&gt;&lt;p&gt;&amp;nbsp; complete or handed off; leave it if still mid-flight; overwrite it if a different&lt;/p&gt;&lt;p&gt;&amp;nbsp; substantial task has begun.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Because Claude&#39;s Write happens during the turn and the Stop hook fires after it, the&lt;/p&gt;&lt;p&gt;state the user sees is never more than one turn behind reality.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Not yet implemented&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- D&#39;s continuation hint (&quot;the next turn probably wants Opus&quot;) -- deliberately deferred&lt;/p&gt;&lt;p&gt;&amp;nbsp; with the rest of the model-recommendation work.&lt;/p&gt;&lt;p&gt;- A watchdog that flags &quot;state not updated this turn&quot; -- the Stop hook has no reliable&lt;/p&gt;&lt;p&gt;&amp;nbsp; turn-start time to compare against. mtime-based age is the interim answer.&lt;/p&gt;&lt;p&gt;- Options A, B, C -- since v4: A and C closed, B parked (Section 12, decisions).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Verification&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Confirmed live on 2026-09-26: the `Stop` hook&#39;s `systemMessage` renders in the terminal&lt;/p&gt;&lt;p&gt;and the user sees the STATE line after each turn. No `statusLine` fallback needed.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s14&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 14. v4 -- [check] soft-check mode&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Implemented 2026-09-26.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Why&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;`UserPromptSubmit` fires after the prompt is sent, so the model recommendation always&lt;/p&gt;&lt;p&gt;arrives one turn late: the prompt has already executed on the current model. The user&lt;/p&gt;&lt;p&gt;wanted a way to have a prompt assessed WITHOUT executing it, decide on the model, and&lt;/p&gt;&lt;p&gt;then run it.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### How it works&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Prefix the prompt with `[check]` (case-insensitive, spaces inside the brackets allowed,&lt;/p&gt;&lt;p&gt;must be at the very start):&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;[check] read and summarise the site www.wiki.com&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Sequence:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. `gatekeeper.py` detects the prefix, strips it, and runs the keyword heuristic on the&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;rest as usual.&lt;/p&gt;&lt;p&gt;2. The user-visible block is headed `GATEKEEPER -- CHECK MODE: assessment only, nothing&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;will be executed`.&lt;/p&gt;&lt;p&gt;3. Into Claude&#39;s context it injects a CHECK MODE instruction: do not execute, do not call&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;tools, do not start the task, do not write `task_state.json`. Reply in under 120 words&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;with (1) what the request would involve, (2) size and depth, (3) recommended model and&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;effort with a one-sentence reason, (4) whether the current task state allows&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;switching. End with exactly: &quot;Switch with /model if needed, then type go.&quot; The keyword&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;guess is passed in so the model can override it.&lt;/p&gt;&lt;p&gt;4. The Option D state instruction is suppressed in check mode, since nothing starts or&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;finishes.&lt;/p&gt;&lt;p&gt;5. The current model answers with the assessment and stops.&lt;/p&gt;&lt;p&gt;6. The user optionally types `/model &amp;lt;name&amp;gt;`, then `go`. The original prompt is still&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;in the conversation, so the chosen model executes it from context. No retyping.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Why this beats a hard block&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A hook can block a prompt with exit code 2, but Claude Code erases the prompt, forcing&lt;/p&gt;&lt;p&gt;a retype. The soft check keeps the prompt, costs one short reply, and the assessment&lt;/p&gt;&lt;p&gt;comes from a model that actually understood the request and can see `task_state.json`&lt;/p&gt;&lt;p&gt;and the conversation.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Caveat&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The soft check relies on the model obeying &quot;do not execute&quot;. Sonnet and above do.&lt;/p&gt;&lt;p&gt;Haiku may occasionally charge ahead; if that is observed, a hard block (exit 2) for&lt;/p&gt;&lt;p&gt;check mode on Haiku is the safeguard.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Tests at implementation&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| Prompt | Check mode | Keyword guess | Option D injected |&lt;/p&gt;&lt;p&gt;|--------|-----------|---------------|-------------------|&lt;/p&gt;&lt;p&gt;| `[check] read and summarise the site ...` | yes | Sonnet 5 | no |&lt;/p&gt;&lt;p&gt;| `[CHECK]&amp;nbsp; implement the ontology` | yes | Opus 5.5 | no |&lt;/p&gt;&lt;p&gt;| `&amp;nbsp; [ check ] ok` | yes | Haiku 4.5 | no |&lt;/p&gt;&lt;p&gt;| `please check the ttl` | no | Opus 5.5 | yes |&lt;/p&gt;&lt;p&gt;| `the [check] tag in the middle` | no | Sonnet 5 (default) | yes |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;s15&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## 15. v5 -- second integrity review&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A second review on 2026-09-26 compared both live scripts, `settings.json` and this&lt;/p&gt;&lt;p&gt;document after v3 and v4 had landed.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Code findings and fixes&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| # | Finding | Fix |&lt;/p&gt;&lt;p&gt;|---|---------|-----|&lt;/p&gt;&lt;p&gt;| 1 | `gatekeeper.py` treated any `status` other than `in_progress` or `unknown` as CLEAN with the reason &quot;task_state.json: clean&quot;, while `state_monitor.py` showed UNKNOWN. A typo such as `in-progress` silently unlocked switching. | Both hooks now name the unexpected value and say &quot;assuming clean&quot;. Gatekeeper&#39;s injected context shows the reason. |&lt;/p&gt;&lt;p&gt;| 2 | Both hooks skipped age calculation entirely when the `updated` field was empty, even though mtime was available. Contradicted Section 13. | Age is always computed; `updated` is only the fallback inside the age function. |&lt;/p&gt;&lt;p&gt;| 3 | `settings.json` maps the `sonnet` alias to `claude-sonnet-4-6@default` while the hook recommends `/model Sonnet 5`. | Not changed (proxy setting). Recorded in Section 8 and the script header; to be checked live with `/model`. |&lt;/p&gt;&lt;p&gt;| 4 | PRIME DIRECTIVE scope was ambiguous: the Siemens code-scan hook in the same file fetches via `git+https`. | Section 0 now states the directive binds the two gatekeeper hooks only. |&lt;/p&gt;&lt;p&gt;| 5 | `state_age_hours` docstring described the pre-mtime behaviour; `project` and `cwd` unpacked in `main()` and unused. | Docstring corrected; unused values named `_project`, `_task_cwd` with a comment. |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Verification: both scripts compile; a harness with temporary state files confirmed&lt;/p&gt;&lt;p&gt;identical CLEAN / DIRTY / UNKNOWN verdicts from both hooks for: clean, fresh&lt;/p&gt;&lt;p&gt;in_progress, in_progress with no `updated` field and a 30h-old mtime (stale warning&lt;/p&gt;&lt;p&gt;fires in both), `status: paused`, `status: in-progress`, and file missing.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Document findings and fixes&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;| Section | Was | Now |&lt;/p&gt;&lt;p&gt;|---------|-----|-----|&lt;/p&gt;&lt;p&gt;| Header | Revised line stopped at v3. | Lists v4 and v5. |&lt;/p&gt;&lt;p&gt;| 0 | Named only the gatekeeper hook. | Names both hooks; scope note for the code-scan hook. |&lt;/p&gt;&lt;p&gt;| 2.2 | Stale detection from `updated`. | From file mtime; unexpected status documented. |&lt;/p&gt;&lt;p&gt;| 3 | settings.json change listed only UserPromptSubmit; claimed no memory notes existed. | Stop block listed; two memory pointers acknowledged. |&lt;/p&gt;&lt;p&gt;| 4 | Replication copied and registered one script. | Both scripts copied, compiled, registered and smoke-tested. |&lt;/p&gt;&lt;p&gt;| 5 | Examples showed v2 state lines with no pointer. | Notes added pointing to the STATE block and the Option D / check-mode context. |&lt;/p&gt;&lt;p&gt;| 6 | One switch documented. | Both `ENABLED` flags documented. |&lt;/p&gt;&lt;p&gt;| 8 | No mention of `[check]`, Sonnet alias, or fail-open status. | Three rows added. |&lt;/p&gt;&lt;p&gt;| 9 | Scope table omitted `state_monitor.py`. | Added. |&lt;/p&gt;&lt;p&gt;| 10 | Behaviour table had no unexpected-status row. | Added; mtime stated. |&lt;/p&gt;&lt;p&gt;| 12 | &quot;PLANNING ONLY. Nothing implemented&quot; and a next step recommending C via B. | Status reflects decisions; next step marked superseded. |&lt;/p&gt;&lt;p&gt;| 13 | &quot;Not yet implemented: A, B, C&quot;. | Cross-referenced to the A/C closed, B parked decision. |&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Second pass (same day)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A re-read of the patched files found one remaining seam: a file that parsed but had no&lt;/p&gt;&lt;p&gt;`status` field was described as &quot;missing or unreadable&quot; by the gatekeeper and as&lt;/p&gt;&lt;p&gt;`status=&#39;unknown&#39;` by the Stop hook. Both now say &quot;has no status field -- assuming&lt;/p&gt;&lt;p&gt;clean&quot;. Doc touch-ups: Section 3 names `[check]` in the gatekeeper row, Section 2.4&lt;/p&gt;&lt;p&gt;lists the full live effort keyword sets, Section 5 Example 2 shows the actual DIRTY&lt;/p&gt;&lt;p&gt;reminder line, Section 10 has the no-status row. Re-verified: both scripts compile;&lt;/p&gt;&lt;p&gt;six state-file scenarios (clean, fresh in_progress, 30h in_progress without `updated`,&lt;/p&gt;&lt;p&gt;no status field, `paused`, malformed JSON) give matching verdicts from both hooks; both&lt;/p&gt;&lt;p&gt;Section 4 smoke tests produce the documented output; `[check]` on a dirty state injects&lt;/p&gt;&lt;p&gt;the CHECK MODE instruction and suppresses Option D.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### Appendix added (same day)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;At the user&#39;s request the full source of both hooks, `task_state.json` and the two&lt;/p&gt;&lt;p&gt;`settings.json` hook blocks are reproduced in Appendix A for copy-and-paste. Neither&lt;/p&gt;&lt;p&gt;script contains a user path or credential; the hook commands use `&amp;lt;username&amp;gt;`. The&lt;/p&gt;&lt;p&gt;`settings.json` `env` block (proxy credentials, telemetry identity) is deliberately&lt;/p&gt;&lt;p&gt;excluded. The appendix is a plain copy, so it must be re-pasted after every script edit&lt;/p&gt;&lt;p&gt;(rule stated in Section 4). A.5 adds the full Task State Convention section of the global&lt;/p&gt;&lt;p&gt;`CLAUDE.md`, previously only referenced by name, with its two user paths as `&amp;lt;USER&amp;gt;`.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### CLAUDE.md section trimmed (same day)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The section had grown to 65 lines, over half of the global `CLAUDE.md`. Long instruction&lt;/p&gt;&lt;p&gt;files dilute compliance with every rule in them, so it was cut to about 22 lines keeping&lt;/p&gt;&lt;p&gt;only what changes Claude&#39;s behaviour: when to write the state file and its six fields,&lt;/p&gt;&lt;p&gt;the `[check]` rule, the PRIME DIRECTIVE in two sentences, and the pointer here. The&lt;/p&gt;&lt;p&gt;PRIME DIRECTIVE rationale and scope note stay in Section 0. A.5 shows the trimmed form.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&quot;appA&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;## Appendix A -- Full source of the live files&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[Back to TOC](#toc)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Copied verbatim from the live files on 2026-09-26 (v5, second pass). `&amp;lt;USER&amp;gt;` stands for&lt;/p&gt;&lt;p&gt;`C:\Users\&amp;lt;username&amp;gt;`; in hook commands the POSIX form `/c/Users/&amp;lt;username&amp;gt;` is used.&lt;/p&gt;&lt;p&gt;Neither script contains a user path or credential. `settings.json` is shown as the two&lt;/p&gt;&lt;p&gt;hook blocks only: its `env` block holds proxy credentials and telemetry identity and must&lt;/p&gt;&lt;p&gt;never be copied into documentation or between machines.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**Maintenance rule:** whenever `gatekeeper.py`, `state_monitor.py` or the Task State&lt;/p&gt;&lt;p&gt;Convention section of `CLAUDE.md` is edited, re-paste the whole file or section here in&lt;/p&gt;&lt;p&gt;the same session, then run `py_compile` on any edited script.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### A.1 `&amp;lt;USER&amp;gt;\.claude\hooks\gatekeeper.py`&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```python&lt;/p&gt;&lt;p&gt;&quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;Gatekeeper -- UserPromptSubmit hook for Claude Code.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;=====================================================================&lt;/p&gt;&lt;p&gt;PRIME DIRECTIVE&lt;/p&gt;&lt;p&gt;&amp;nbsp; This hook NEVER runs git -- not directly, not indirectly.&lt;/p&gt;&lt;p&gt;&amp;nbsp; It spawns no processes of any kind: no subprocess, no os.system,&lt;/p&gt;&lt;p&gt;&amp;nbsp; no os.popen, no shelling out. Its only inputs are the JSON on stdin&lt;/p&gt;&lt;p&gt;&amp;nbsp; and one file, task_state.json. Its only output is JSON on stdout.&lt;/p&gt;&lt;p&gt;&amp;nbsp; A runtime self-check (check_prime_directive) confirms that no&lt;/p&gt;&lt;p&gt;&amp;nbsp; process-spawning module has been imported, and reports a violation&lt;/p&gt;&lt;p&gt;&amp;nbsp; in the user-visible message if it ever finds one.&lt;/p&gt;&lt;p&gt;=====================================================================&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Fires on every prompt submission. Assesses clean state from&lt;/p&gt;&lt;p&gt;task_state.json and recommends a model and effort level based on the&lt;/p&gt;&lt;p&gt;prompt text.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To ENABLE&amp;nbsp; : set ENABLED = True below.&lt;/p&gt;&lt;p&gt;To DISABLE : set ENABLED = False below.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;When disabled the script exits silently as soon as it is imported past&lt;/p&gt;&lt;p&gt;the switch -- no output, no context injection.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Output channels (per Claude Code hook docs):&lt;/p&gt;&lt;p&gt;&amp;nbsp; - systemMessage&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; shown to the USER in the terminal&lt;/p&gt;&lt;p&gt;&amp;nbsp; - additionalContext&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; injected into CLAUDE&#39;s context&lt;/p&gt;&lt;p&gt;&amp;nbsp; stderr is NOT shown to the user on exit 0, so it is not used here.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Model cost reference (as recorded Sep 2026, unverified -- check the&lt;/p&gt;&lt;p&gt;current price list before relying on the figures):&lt;/p&gt;&lt;p&gt;&amp;nbsp; Fable 5.1&amp;nbsp; : most expensive tier&amp;nbsp; -- long-horizon agentic tasks only&lt;/p&gt;&lt;p&gt;&amp;nbsp; Opus 5.5&amp;nbsp; &amp;nbsp;: $4&amp;nbsp; / $20 per MTok&amp;nbsp; &amp;nbsp;-- complex reasoning, coding, TTL work&lt;/p&gt;&lt;p&gt;&amp;nbsp; Sonnet 5&amp;nbsp; &amp;nbsp;: $2&amp;nbsp; / $10 per MTok&amp;nbsp; &amp;nbsp;-- edits, explanations, medium tasks&lt;/p&gt;&lt;p&gt;&amp;nbsp; Haiku 4.5&amp;nbsp; : $1&amp;nbsp; / $5&amp;nbsp; per MTok&amp;nbsp; &amp;nbsp;-- quick confirmations, one-liners&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Note on the Sonnet label: settings.json maps the &quot;sonnet&quot; alias&lt;/p&gt;&lt;p&gt;(ANTHROPIC_DEFAULT_SONNET_MODEL) to claude-sonnet-4-6@default. The&lt;/p&gt;&lt;p&gt;recommendation below says &quot;Sonnet 5&quot;. If /model Sonnet 5 does not&lt;/p&gt;&lt;p&gt;resolve through the proxy, either update that env var or change&lt;/p&gt;&lt;p&gt;DEFAULT_MODEL_LABEL / the Sonnet rule label here.&lt;/p&gt;&lt;p&gt;&quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;import sys&lt;/p&gt;&lt;p&gt;import json&lt;/p&gt;&lt;p&gt;import os&lt;/p&gt;&lt;p&gt;import re&lt;/p&gt;&lt;p&gt;from datetime import datetime&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;TASK_STATE_FILE = os.path.join(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; os.path.expanduser(&quot;~&quot;), &quot;.claude&quot;, &quot;hooks&quot;, &quot;task_state.json&quot;&lt;/p&gt;&lt;p&gt;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# -------------------------------------------------------&lt;/p&gt;&lt;p&gt;# MASTER SWITCH -- flip to False to deactivate&lt;/p&gt;&lt;p&gt;# -------------------------------------------------------&lt;/p&gt;&lt;p&gt;ENABLED = True&lt;/p&gt;&lt;p&gt;# -------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;if not ENABLED:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; sys.exit(0)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# -------------------------------------------------------&lt;/p&gt;&lt;p&gt;# MODEL SELECTION RULES&lt;/p&gt;&lt;p&gt;# Evaluated top-to-bottom; first match wins.&lt;/p&gt;&lt;p&gt;# Keywords match on WORD BOUNDARIES: &quot;ttl&quot; matches &quot;ttl&quot; and&lt;/p&gt;&lt;p&gt;# &quot;ttl-file&quot; but not &quot;settle&quot;; &quot;no&quot; does not match &quot;know&quot;.&lt;/p&gt;&lt;p&gt;# Fable is intentionally last and has a very high bar --&lt;/p&gt;&lt;p&gt;# it is the most expensive tier and is only justified for&lt;/p&gt;&lt;p&gt;# truly long-horizon, multi-step autonomous tasks.&lt;/p&gt;&lt;p&gt;# -------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;MODEL_RULES = [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Opus 5.5&quot;, &quot;claude-opus-5-5&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;complex reasoning, TTL/SPARQL authoring, ontology work, deep reviews&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;ttl&quot;, &quot;turtle&quot;, &quot;sparql&quot;, &quot;owl&quot;, &quot;ontology&quot;, &quot;rdf&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;implement&quot;, &quot;build the&quot;, &quot;write the&quot;, &quot;generate&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;create a script&quot;, &quot;review all&quot;, &quot;self-review&quot;, &quot;full review&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;architecture&quot;, &quot;master plan&quot;, &quot;masterplan&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;phase p1&quot;, &quot;phase p2&quot;, &quot;phase p3&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;validate&quot;, &quot;anzo&quot;, &quot;graphmart&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Sonnet 5&quot;, &quot;claude-sonnet-5&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;edits, explanations, updates, medium-complexity tasks&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;explain&quot;, &quot;summarise&quot;, &quot;summarize&quot;, &quot;update&quot;, &quot;edit&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;add a line&quot;, &quot;what is&quot;, &quot;how does&quot;, &quot;can you check&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;what does&quot;, &quot;describe&quot;, &quot;clarify&quot;, &quot;in short&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;quick&quot;, &quot;brief&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Haiku 4.5&quot;, &quot;claude-haiku-4-5-20251001&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;one-liners, confirmations, trivial follow-ups&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;yes&quot;, &quot;no&quot;, &quot;ok&quot;, &quot;okay&quot;, &quot;thanks&quot;, &quot;great&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;go ahead&quot;, &quot;proceed&quot;, &quot;continue&quot;, &quot;sounds good&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;make it so&quot;, &quot;done&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Fable 5.1&quot;, &quot;claude-fable-5-1&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;long-horizon multi-step autonomous tasks only -- most expensive tier&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;full build&quot;, &quot;end to end&quot;, &quot;end-to-end&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;all phases&quot;, &quot;entire p1&quot;, &quot;entire build&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;autonomous&quot;, &quot;multi-step workflow&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;run the whole&quot;, &quot;build and validate and upload&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;run everything&quot;, &quot;do the whole&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ),&lt;/p&gt;&lt;p&gt;]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;DEFAULT_MODEL_LABEL = &quot;Sonnet 5&quot;&lt;/p&gt;&lt;p&gt;DEFAULT_MODEL_ID&amp;nbsp; &amp;nbsp; = &quot;claude-sonnet-5&quot;&lt;/p&gt;&lt;p&gt;DEFAULT_MODEL_PURPOSE = &quot;edits, explanations, updates, medium-complexity tasks&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# Haiku is only recommended for genuinely short prompts. A long prompt&lt;/p&gt;&lt;p&gt;# that happens to contain &quot;ok&quot; or &quot;yes&quot; is not a confirmation.&lt;/p&gt;&lt;p&gt;HAIKU_MAX_WORDS = 8&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;EFFORT_HIGH_KEYWORDS = [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;review all&quot;, &quot;self-review&quot;, &quot;full review&quot;, &quot;check everything&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;audit&quot;, &quot;validate all&quot;, &quot;integrity check&quot;, &quot;deep review&quot;,&lt;/p&gt;&lt;p&gt;]&lt;/p&gt;&lt;p&gt;EFFORT_LOW_KEYWORDS = [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;quick&quot;, &quot;briefly&quot;, &quot;one line&quot;, &quot;just check&quot;, &quot;in short&quot;,&lt;/p&gt;&lt;p&gt;]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;FABLE_WARNING = (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;NOTE: Fable 5.1 is the most expensive tier. &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;Only use it if this is truly a long-horizon autonomous task &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;that Opus at high effort cannot handle.&quot;&lt;/p&gt;&lt;p&gt;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;STALE_HOURS = 24&amp;nbsp; # warn if in_progress for longer than this&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# -------------------------------------------------------&lt;/p&gt;&lt;p&gt;# CHECK MODE&lt;/p&gt;&lt;p&gt;# If the prompt begins with [check], Claude is instructed to ASSESS the&lt;/p&gt;&lt;p&gt;# request and stop, without executing it or calling tools. The current&lt;/p&gt;&lt;p&gt;# model does the assessing, so it uses real understanding and the full&lt;/p&gt;&lt;p&gt;# conversation context, not keywords. The prompt stays in the&lt;/p&gt;&lt;p&gt;# conversation, so after an optional /model switch the user types &quot;go&quot;.&lt;/p&gt;&lt;p&gt;# -------------------------------------------------------&lt;/p&gt;&lt;p&gt;CHECK_PREFIX_RE = re.compile(r&quot;^\s*\[\s*check\s*\]\s*&quot;, re.IGNORECASE)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;CHECK_MODE_INSTRUCTION = (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;CHECK MODE. The user prefixed this prompt with [check]. Do NOT execute the &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;request, do NOT call any tools, do NOT start the task, and do NOT write &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;task_state.json. Instead reply with a short assessment, under 120 words: &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;(1) one line restating what the request would involve; &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;(2) size and depth: trivial / medium / complex / long-horizon; &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;(3) recommended model (Haiku 4.5, Sonnet 5, Opus 5.5 or Fable 5.1) and effort &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;(low / medium / high), with a one-sentence reason; &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;(4) whether the current task state allows switching. &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;End with exactly: &#39;Switch with /model if needed, then type go.&#39; &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;The keyword heuristic guessed {label}; override it if your reading differs.&quot;&lt;/p&gt;&lt;p&gt;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;FORBIDDEN_MODULES = (&quot;subprocess&quot;, &quot;pty&quot;, &quot;multiprocessing&quot;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# -------------------------------------------------------&lt;/p&gt;&lt;p&gt;# HELPERS&lt;/p&gt;&lt;p&gt;# -------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;def check_prime_directive():&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Return a violation string if any process-spawning module is loaded,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; else an empty string. This hook must never shell out.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; loaded = [m for m in FORBIDDEN_MODULES if m in sys.modules]&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if loaded:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;PRIME DIRECTIVE VIOLATION: process-spawning module(s) loaded: &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; + &quot;, &quot;.join(loaded)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; return &quot;&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;def read_task_state():&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Sole clean-state signal.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Returns (status, task, detail, project, cwd, updated) from task_state.json.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Falls back to (&quot;unknown&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;) if file missing or unreadable.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Status is &quot;missing&quot; if the file parses but has no status field.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; try:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; with open(TASK_STATE_FILE, &quot;r&quot;, encoding=&quot;utf-8&quot;) as f:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data = json.load(f)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data.get(&quot;status&quot;, &quot;missing&quot;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data.get(&quot;task&quot;, &quot;&quot;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data.get(&quot;detail&quot;, &quot;&quot;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data.get(&quot;project&quot;, &quot;&quot;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data.get(&quot;cwd&quot;, &quot;&quot;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data.get(&quot;updated&quot;, &quot;&quot;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; except Exception:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return (&quot;unknown&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;def state_age_hours(updated_str):&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Return hours since the last write of task_state.json, or None.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Primary source is the file&#39;s mtime. The &#39;updated&#39; field is only a&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; fallback if the file cannot be stat&#39;ed; naive values are treated as&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; LOCAL time, because that is how the convention writes them.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; try:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # File mtime is the true time of the last write. Claude does not&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # know the wall clock, so the &#39;updated&#39; field is only a fallback.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; updated = datetime.fromtimestamp(os.path.getmtime(TASK_STATE_FILE)).astimezone()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; except OSError:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; updated = datetime.fromisoformat(updated_str)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if updated.tzinfo is None:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; updated = updated.astimezone()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delta = datetime.now().astimezone() - updated&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return delta.total_seconds() / 3600&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; except Exception:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return None&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;def assess_clean_state():&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Returns (is_clean, reason, is_stale, age_hours, project, task_cwd).&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; task_status, task_name, task_detail, project, task_cwd, updated = read_task_state()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # Age comes from file mtime, so it is computed even if &#39;updated&#39; is empty.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; age_hours = state_age_hours(updated)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; is_stale = (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; task_status == &quot;in_progress&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; and age_hours is not None&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; and age_hours &amp;gt; STALE_HOURS&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; project_tag = f&quot; [{project}]&quot; if project else &quot;&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if task_status == &quot;in_progress&quot;:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reason = f&quot;task in progress: &#39;{task_name}&#39;{project_tag}&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if task_detail:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reason += f&quot; -- {task_detail}&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return False, reason, is_stale, age_hours, project, task_cwd&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if task_status == &quot;clean&quot;:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return True, &quot;task_state.json: clean&quot;, False, None, project, task_cwd&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if task_status == &quot;unknown&quot;:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return True, &quot;task_state.json missing or unreadable -- assuming clean&quot;, False, None, &quot;&quot;, &quot;&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if task_status == &quot;missing&quot;:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return True, &quot;task_state.json has no status field -- assuming clean&quot;, False, None, project, task_cwd&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # Any other value is a convention breach (typo or unknown state).&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # Same handling as state_monitor.py: report it, assume clean.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; return (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; True,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; f&quot;task_state.json status=&#39;{task_status}&#39; is not clean/in_progress -- assuming clean&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; False, None, project, task_cwd,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;def kw_match(kw, prompt_lower):&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;Word-boundary match: keyword must not be embedded in a longer token.&quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; pattern = r&quot;(?&amp;lt;![a-z0-9])&quot; + re.escape(kw) + r&quot;(?![a-z0-9])&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; return re.search(pattern, prompt_lower) is not None&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;def recommend_model(prompt_lower):&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; word_count = len(prompt_lower.split())&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; for label, model_id, purpose, keywords in MODEL_RULES:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if label.startswith(&quot;Haiku&quot;) and word_count &amp;gt; HAIKU_MAX_WORDS:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; continue&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for kw in keywords:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if kw_match(kw, prompt_lower):&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return label, model_id, kw, purpose&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; return DEFAULT_MODEL_LABEL, DEFAULT_MODEL_ID, &quot;default&quot;, DEFAULT_MODEL_PURPOSE&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;def recommend_effort(prompt_lower):&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if any(kw_match(kw, prompt_lower) for kw in EFFORT_HIGH_KEYWORDS):&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return &quot;high&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if any(kw_match(kw, prompt_lower) for kw in EFFORT_LOW_KEYWORDS):&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return &quot;low&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; return None&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# -------------------------------------------------------&lt;/p&gt;&lt;p&gt;# MAIN&lt;/p&gt;&lt;p&gt;# -------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;def main():&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; raw = sys.stdin.read()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; try:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data = json.loads(raw)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; except Exception:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sys.exit(0)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # Current docs name the field &quot;user_prompt&quot;; older builds used &quot;prompt&quot;.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; prompt = data.get(&quot;user_prompt&quot;) or data.get(&quot;prompt&quot;, &quot;&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; check_mode = CHECK_PREFIX_RE.match(prompt) is not None&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if check_mode:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; prompt = CHECK_PREFIX_RE.sub(&quot;&quot;, prompt, count=1)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; pl&amp;nbsp; &amp;nbsp; &amp;nbsp;= prompt.lower()&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; violation = check_prime_directive()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # project and cwd are informational only (kept in the file for the user).&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; is_clean, state_reason, is_stale, age_hours, _project, _task_cwd = assess_clean_state()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; model_label, _, trigger, purpose = recommend_model(pl)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; effort&amp;nbsp; &amp;nbsp;= recommend_effort(pl)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; is_fable = &quot;Fable&quot; in model_label&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; state_tag = &quot;[CLEAN]&quot; if is_clean else &quot;[DIRTY]&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # ---- user-visible message (systemMessage) ----&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # Model recommendation only. The STATE is shown by state_monitor.py&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # (Stop hook) at the end of each turn, before the user types.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; lines = [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;GATEKEEPER&quot; + (&quot;&amp;nbsp; -- CHECK MODE: assessment only, nothing will be executed&quot; if check_mode else &quot;&quot;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; f&quot;&amp;nbsp; Model&amp;nbsp; : /model {model_label}&amp;nbsp; (trigger: &#39;{trigger}&#39;)&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; f&quot;&amp;nbsp; Use for: {purpose}&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ]&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if effort:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(f&quot;&amp;nbsp; Effort : consider /effort {effort}&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if not is_clean:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(f&quot;&amp;nbsp; ! {state_tag} task in progress -- hold off switching model/effort&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if is_fable:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(f&quot;&amp;nbsp; ! {FABLE_WARNING}&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if violation:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(f&quot;&amp;nbsp; !!! {violation}&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; system_message = &quot;\n&quot;.join(lines)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # ---- context injected for Claude (additionalContext) ----&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; stale_note = &quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if is_stale and age_hours is not None:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stale_note = f&quot; WARNING: state has been in_progress for {int(age_hours)}h -- may be stale.&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if is_clean and state_reason == &quot;task_state.json: clean&quot;:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; state_text = &quot;clean -- safe to switch model or effort&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; elif is_clean:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; state_text = &quot;clean (&quot; + state_reason + &quot;) -- safe to switch model or effort&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; else:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; state_text = (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;DIRTY (&quot; + state_reason + &quot;) -- hold off switching model or effort &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;until current task is complete&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; injected = (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; f&quot;[Gatekeeper] State: {state_text}.{stale_note} &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; f&quot;Suggested model: {model_label} (matched keyword &#39;{trigger}&#39;; {purpose}).&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if effort:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; injected += f&quot; Suggested effort: {effort}.&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if is_fable:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; injected += f&quot; {FABLE_WARNING}&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if violation:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; injected += f&quot; {violation}&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # ---- Check mode: assess only, no execution, no state writes ----&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if check_mode:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; injected += &quot; &quot; + CHECK_MODE_INSTRUCTION.format(label=model_label)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # ---- Option D: state maintenance instruction for Claude ----&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # Claude keeps task_state.json honest at the END of its turn, because&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # a Stop hook then displays it to the user before the next prompt.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # Skipped in check mode: nothing is started or finished.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if check_mode:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pass&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; elif is_clean:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; injected += (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot; [Option D] Before ending this turn: if you START substantial work &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;(code, TTL, SPARQL, multi-section docs, a build phase), write &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;task_state.json with status in_progress. Do NOT write it for &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;trivial Q&amp;amp;A.&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; else:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; injected += (&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot; [Option D] Before ending this turn: if the in-progress task is now &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;COMPLETE or handed off to the user, write task_state.json with status &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;clean. If it is still mid-flight, leave it. If you have moved on to a &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;different substantial task, overwrite it with the new task.&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; out = {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;systemMessage&quot;: system_message,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;hookSpecificOutput&quot;: {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;hookEventName&quot;: &quot;UserPromptSubmit&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;additionalContext&quot;: injected,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; print(json.dumps(out))&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;if __name__ == &quot;__main__&quot;:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; main()&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### A.2 `&amp;lt;USER&amp;gt;\.claude\hooks\state_monitor.py`&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```python&lt;/p&gt;&lt;p&gt;&quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;State Monitor -- Stop hook for Claude Code.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;=====================================================================&lt;/p&gt;&lt;p&gt;PRIME DIRECTIVE (shared with gatekeeper.py)&lt;/p&gt;&lt;p&gt;&amp;nbsp; This hook NEVER runs git -- not directly, not indirectly.&lt;/p&gt;&lt;p&gt;&amp;nbsp; It spawns no processes. Its only inputs are the JSON on stdin and&lt;/p&gt;&lt;p&gt;&amp;nbsp; one file, task_state.json. Its only output is JSON on stdout.&lt;/p&gt;&lt;p&gt;=====================================================================&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Fires every time Claude finishes a turn and hands control back to the&lt;/p&gt;&lt;p&gt;user. Reads task_state.json and shows the CURRENT state so the user&lt;/p&gt;&lt;p&gt;knows, before typing the next prompt, whether the deck is clear.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This is the &quot;state&quot; half of the gatekeeper, split out from the&lt;/p&gt;&lt;p&gt;UserPromptSubmit hook so the information arrives BEFORE the next&lt;/p&gt;&lt;p&gt;prompt rather than after it.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Output: one JSON object with a systemMessage (shown to the user).&lt;/p&gt;&lt;p&gt;Never blocks. Always exits 0.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To DISABLE : set ENABLED = False below.&lt;/p&gt;&lt;p&gt;&quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;import sys&lt;/p&gt;&lt;p&gt;import json&lt;/p&gt;&lt;p&gt;import os&lt;/p&gt;&lt;p&gt;from datetime import datetime&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;TASK_STATE_FILE = os.path.join(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; os.path.expanduser(&quot;~&quot;), &quot;.claude&quot;, &quot;hooks&quot;, &quot;task_state.json&quot;&lt;/p&gt;&lt;p&gt;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ENABLED = True&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;if not ENABLED:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; sys.exit(0)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;STALE_HOURS = 24&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;FORBIDDEN_MODULES = (&quot;subprocess&quot;, &quot;pty&quot;, &quot;multiprocessing&quot;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;def check_prime_directive():&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; loaded = [m for m in FORBIDDEN_MODULES if m in sys.modules]&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if loaded:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return &quot;PRIME DIRECTIVE VIOLATION: process-spawning module(s) loaded: &quot; + &quot;, &quot;.join(loaded)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; return &quot;&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;def read_task_state():&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; try:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; with open(TASK_STATE_FILE, &quot;r&quot;, encoding=&quot;utf-8&quot;) as f:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data = json.load(f)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return data, &quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; except FileNotFoundError:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return {}, &quot;task_state.json missing&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; except Exception as exc:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return {}, f&quot;task_state.json unreadable ({type(exc).__name__})&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;def age_text(updated_str):&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Return (hours_float or None, human text).&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Age is taken from the file&#39;s modification time, which is the true moment&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; of the last write. The &#39;updated&#39; field is written by Claude, which does&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; not know the wall clock, so it is only used as a fallback.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; try:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; updated = datetime.fromtimestamp(os.path.getmtime(TASK_STATE_FILE)).astimezone()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; except OSError:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; updated = datetime.fromisoformat(updated_str)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if updated.tzinfo is None:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; updated = updated.astimezone()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; secs = (datetime.now().astimezone() - updated).total_seconds()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hours = secs / 3600&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if secs &amp;lt; 0:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return hours, &quot;timestamp in the future&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if secs &amp;lt; 90:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return hours, &quot;just now&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if secs &amp;lt; 3600:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return hours, f&quot;{int(secs // 60)}m ago&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if hours &amp;lt; 48:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return hours, f&quot;{int(hours)}h ago&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return hours, f&quot;{int(hours // 24)}d ago&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; except Exception:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return None, &quot;no valid timestamp&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;def main():&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # Drain stdin so the caller never sees a broken pipe; content unused.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; try:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sys.stdin.read()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; except Exception:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pass&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; data, problem = read_task_state()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; status&amp;nbsp; = data.get(&quot;status&quot;, &quot;&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; task&amp;nbsp; &amp;nbsp; = data.get(&quot;task&quot;, &quot;&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; detail&amp;nbsp; = data.get(&quot;detail&quot;, &quot;&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; project = data.get(&quot;project&quot;, &quot;&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; updated = data.get(&quot;updated&quot;, &quot;&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; # Age comes from file mtime, so it is computed even if &#39;updated&#39; is empty.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; hours, when = age_text(updated)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; lines = []&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if problem:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(f&quot;STATE&amp;nbsp; [UNKNOWN]&amp;nbsp; {problem} -- assuming clean&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; elif status == &quot;in_progress&quot;:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tag = f&quot; [{project}]&quot; if project else &quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; head = f&quot;STATE&amp;nbsp; [DIRTY]&amp;nbsp; task in progress: &#39;{task}&#39;{tag}&amp;nbsp; (updated {when})&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(head)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if detail:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(f&quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{detail}&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if hours is not None and hours &amp;gt; STALE_HOURS:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; f&quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;! flagged in_progress for {int(hours)}h -- may be stale. &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;If the task is done, ask Claude to reset task_state.json.&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(&quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;! Hold off switching model/effort until this task is complete&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; elif status == &quot;clean&quot;:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(f&quot;STATE&amp;nbsp; [CLEAN]&amp;nbsp; safe to switch model or effort&amp;nbsp; (updated {when})&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; elif status == &quot;&quot;:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(&quot;STATE&amp;nbsp; [UNKNOWN]&amp;nbsp; task_state.json has no status field -- assuming clean&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; else:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # Same handling as gatekeeper.py: report the breach, assume clean.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; f&quot;STATE&amp;nbsp; [UNKNOWN]&amp;nbsp; status=&#39;{status}&#39; -- expected clean or in_progress -- assuming clean&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; violation = check_prime_directive()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if violation:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lines.append(f&quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!!! {violation}&quot;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; out = {&quot;systemMessage&quot;: &quot;\n&quot;.join(lines)}&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; print(json.dumps(out))&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;if __name__ == &quot;__main__&quot;:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; main()&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### A.3 `&amp;lt;USER&amp;gt;\.claude\hooks\task_state.json`&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Contents change constantly; these are the two shapes Claude writes. Install with the&lt;/p&gt;&lt;p&gt;clean form.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Clean (install this):&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```json&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;status&quot;: &quot;clean&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;task&quot;: &quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;detail&quot;: &quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;project&quot;: &quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;cwd&quot;: &quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;updated&quot;: &quot;2026-01-01T00:00:00&quot;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In progress (example):&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```json&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;status&quot;: &quot;in_progress&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;task&quot;: &quot;Writing bfsi-case.ttl&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;detail&quot;: &quot;Phase P1 -- new shared case module&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;project&quot;: &quot;BFSI&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;cwd&quot;: &quot;&amp;lt;USER&amp;gt;\\Projects\\BFSI&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;updated&quot;: &quot;2026-09-26T14:32:00&quot;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### A.4 `&amp;lt;USER&amp;gt;\.claude\settings.json` -- hook blocks only&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Merge these two entries into the existing `&quot;hooks&quot;` object. Do not copy the rest of&lt;/p&gt;&lt;p&gt;`settings.json` between machines; its `env` block contains credentials.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```json&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;hooks&quot;: {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;UserPromptSubmit&quot;: [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;hooks&quot;: [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;type&quot;: &quot;command&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;command&quot;: &quot;/c/miniforge3/python /c/Users/&amp;lt;username&amp;gt;/.claude/hooks/gatekeeper.py&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;statusMessage&quot;: &quot;Gatekeeper assessing prompt...&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ],&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;Stop&quot;: [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;hooks&quot;: [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;type&quot;: &quot;command&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;command&quot;: &quot;/c/miniforge3/python /c/Users/&amp;lt;username&amp;gt;/.claude/hooks/state_monitor.py&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;timeout&quot;: 5&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ]&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### A.5 `&amp;lt;USER&amp;gt;\.claude\CLAUDE.md` -- the &quot;Task State Convention&quot; section&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Paste this section into the global `CLAUDE.md` on the target machine. Without it Claude&lt;/p&gt;&lt;p&gt;never writes `task_state.json` and the state signal is dead. Two paths inside it use&lt;/p&gt;&lt;p&gt;`&amp;lt;USER&amp;gt;`; substitute the real user directory. This is the trimmed v5 form (about 22&lt;/p&gt;&lt;p&gt;lines): it keeps every rule that changes Claude&#39;s behaviour and leaves rationale, scope&lt;/p&gt;&lt;p&gt;and examples to this document (Sections 0, 5, 13, 14).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;````markdown&lt;/p&gt;&lt;p&gt;## Task State Convention (Gatekeeper Hooks)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Two global hooks (`gatekeeper.py` on UserPromptSubmit, `state_monitor.py` on Stop) read&lt;/p&gt;&lt;p&gt;`&amp;lt;USER&amp;gt;\.claude\hooks\task_state.json` and nothing else. Keep it accurate&lt;/p&gt;&lt;p&gt;BEFORE ending a turn; the user sees it immediately after.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- **START of a substantial task** (code, TTL, SPARQL, multi-section docs, scripts, build&lt;/p&gt;&lt;p&gt;&amp;nbsp; phases): write `{&quot;status&quot;: &quot;in_progress&quot;, &quot;task&quot;: &quot;&amp;lt;short name&amp;gt;&quot;, &quot;detail&quot;: &quot;&amp;lt;optional&amp;gt;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;project&quot;: &quot;&amp;lt;e.g. BFSI&amp;gt;&quot;, &quot;cwd&quot;: &quot;&amp;lt;working dir&amp;gt;&quot;, &quot;updated&quot;: &quot;&amp;lt;ISO local time&amp;gt;&quot;}`.&lt;/p&gt;&lt;p&gt;- **END of a task** (complete, handed off, or paused): write `&quot;status&quot;: &quot;clean&quot;` with all&lt;/p&gt;&lt;p&gt;&amp;nbsp; other fields empty strings.&lt;/p&gt;&lt;p&gt;- Trivial follow-ups (a question, a one-line edit) need no update.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**[check] mode:** if a prompt begins with `[check]`, do NOT execute it or call tools.&lt;/p&gt;&lt;p&gt;Reply with a short assessment (what it involves, size, recommended model and effort,&lt;/p&gt;&lt;p&gt;whether the state allows switching) ending &quot;Switch with /model if needed, then type go.&quot;&lt;/p&gt;&lt;p&gt;On &quot;go&quot;, execute the checked prompt.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;**PRIME DIRECTIVE (all projects):** these hooks, and any hook written for this user, must&lt;/p&gt;&lt;p&gt;never run git or spawn processes (no subprocess, os.system, os.popen, pty,&lt;/p&gt;&lt;p&gt;multiprocessing). After any hook edit run `C:\miniforge3\python -m py_compile` on it.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Rationale, scope, decisions and full source:&lt;/p&gt;&lt;p&gt;`&amp;lt;USER&amp;gt;\.claude\prompt_gatekeeper_model_switcher.md`&lt;/p&gt;&lt;p&gt;````&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;*End of Prompt Gatekeeper and Model Switcher documentation.*&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/2519705111783945907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/2519705111783945907' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/2519705111783945907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/2519705111783945907'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2026/09/prompt-gatekeeper-and-model-recommender.html' title='Prompt Gatekeeper and Model Recommender - For Switching Models in ClaudeCode'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-4623530510476858800</id><published>2025-06-21T07:55:00.000-07:00</published><updated>2025-06-27T11:13:59.021-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="crypto"/><category scheme="http://www.blogger.com/atom/ns#" term="MetaMask"/><category scheme="http://www.blogger.com/atom/ns#" term="NFT"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSEA"/><category scheme="http://www.blogger.com/atom/ns#" term="Web3 Wallet"/><title type='text'> How to Publish an NFT on OpenSea: Step-by-Step Guide</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;h2&gt;📁 Prerequisites&lt;/h2&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Item&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;MetaMask Wallet&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;A crypto wallet to create and sign your NFT&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ETH or MATIC&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Needed to pay gas fees (ETH for Ethereum; MATIC for Polygon — which is often free to mint)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;NFT Content&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Your digital asset (image, video, audio, 3D, etc.)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;🛠️ How to Publish an NFT (on OpenSea)&lt;/h2&gt;&lt;h3&gt;✅ Step 1: Set up MetaMask Wallet&lt;/h3&gt;&lt;ol data-spread=&quot;false&quot; start=&quot;1&quot;&gt;&lt;li&gt;&lt;p&gt;Go to &lt;a disabled=&quot;false&quot; href=&quot;https://metamask.io&quot;&gt;https://metamask.io&lt;/a&gt; and install the browser extension.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Create a new wallet and &lt;strong&gt;save your recovery phrase&lt;/strong&gt; securely.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Add some &lt;strong&gt;ETH&lt;/strong&gt; to your wallet (buy or transfer from an exchange like Coinbase or Binance).&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ For Polygon (cheaper), you’ll need MATIC tokens and to switch your network in MetaMask.&lt;/p&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;✅ Step 2: Connect MetaMask to OpenSea&lt;/h3&gt;&lt;ol data-spread=&quot;false&quot; start=&quot;1&quot;&gt;&lt;li&gt;&lt;p&gt;Visit &lt;a disabled=&quot;false&quot; href=&quot;https://studio.opensea.io&quot;&gt;https://studio.opensea.io&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Profile&lt;/strong&gt; (top right) → Choose &lt;strong&gt;MetaMask&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Approve connection in MetaMask — your OpenSea account is now tied to your wallet&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;✅ Step 3: Create a Collection (Optional)&lt;/h3&gt;&lt;ul data-spread=&quot;false&quot;&gt;&lt;li&gt;&lt;p&gt;Go to your profile → &lt;strong&gt;My Collections&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create a Collection&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Add:&lt;/p&gt;&lt;ul data-spread=&quot;false&quot;&gt;&lt;li&gt;&lt;p&gt;Logo&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Royalties (% you’ll earn on resales)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Blockchain (Ethereum or Polygon)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;✅ Step 4: Mint (Publish) Your NFT&lt;/h3&gt;&lt;ol data-spread=&quot;false&quot; start=&quot;1&quot;&gt;&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create&lt;/strong&gt; (top menu)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Upload your file (image, video, audio, or 3D model)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Fill in:&lt;/p&gt;&lt;ul data-spread=&quot;false&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;External link&lt;/strong&gt; (optional)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Properties&lt;/strong&gt;, &lt;strong&gt;levels&lt;/strong&gt;, &lt;strong&gt;unlockable content&lt;/strong&gt; (optional)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Blockchain&lt;/strong&gt;: Ethereum or Polygon&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create&lt;/strong&gt; — your NFT is now minted!&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;✅ On &lt;strong&gt;Polygon&lt;/strong&gt;, this is free. On &lt;strong&gt;Ethereum&lt;/strong&gt;, you may need to pay a one-time &quot;initialize account&quot; fee if it’s your first time.&lt;/p&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;✅ Step 5: List Your NFT for Sale&lt;/h3&gt;&lt;ol data-spread=&quot;false&quot; start=&quot;1&quot;&gt;&lt;li&gt;&lt;p&gt;Go to your newly minted NFT page&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Sell&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Set:&lt;/p&gt;&lt;ul data-spread=&quot;false&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Price&lt;/strong&gt; (fixed or timed auction)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Duration&lt;/strong&gt; (e.g., 7 days)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Complete Listing&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;MetaMask will pop up → sign (and possibly pay gas fee if on Ethereum)&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;🎉 Done! Your NFT is Now Live on OpenSea&lt;/h3&gt;&lt;ul data-spread=&quot;false&quot;&gt;&lt;li&gt;&lt;p&gt;Share your NFT link on social media, Discord, or marketplaces&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Buyers can now purchase it directly from OpenSea&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;🧠 Tips&lt;/h2&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Tip&lt;/td&gt;&lt;td&gt;Why It Matters&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Use &lt;strong&gt;Polygon&lt;/strong&gt; for low fees&lt;/td&gt;&lt;td&gt;No gas fees to mint or list NFTs&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Add &lt;strong&gt;royalties&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;You’ll earn % on every resale&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Include &lt;strong&gt;unlockable content&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Useful for private files, perks, etc.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Verify NFT visibility&lt;/td&gt;&lt;td&gt;May take a few minutes to appear&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;==========================================================&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 data-end=&quot;218&quot; data-start=&quot;157&quot;&gt;✅ &lt;strong data-end=&quot;218&quot; data-start=&quot;162&quot;&gt;Gasless Minting on Polygon (via Rarible or Mintable)&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;243&quot; data-start=&quot;220&quot;&gt;🧭 &lt;strong data-end=&quot;243&quot; data-start=&quot;227&quot;&gt;Why Polygon?&lt;/strong&gt;&lt;/h3&gt;
&lt;ul data-end=&quot;383&quot; data-start=&quot;244&quot;&gt;
&lt;li data-end=&quot;301&quot; data-start=&quot;244&quot;&gt;
&lt;p data-end=&quot;301&quot; data-start=&quot;246&quot;&gt;&lt;strong data-end=&quot;261&quot; data-start=&quot;246&quot;&gt;No gas fees&lt;/strong&gt; (for minting, listing, or transferring)&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;338&quot; data-start=&quot;302&quot;&gt;
&lt;p data-end=&quot;338&quot; data-start=&quot;304&quot;&gt;&lt;strong data-end=&quot;325&quot; data-start=&quot;304&quot;&gt;Fast and low-cost&lt;/strong&gt; transactions&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;383&quot; data-start=&quot;339&quot;&gt;
&lt;p data-end=&quot;383&quot; data-start=&quot;341&quot;&gt;&lt;strong data-end=&quot;383&quot; data-start=&quot;341&quot;&gt;Fully supported on OpenSea and Rarible&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;388&quot; data-start=&quot;385&quot; /&gt;
&lt;h3 data-end=&quot;444&quot; data-start=&quot;390&quot;&gt;🔧 &lt;strong data-end=&quot;444&quot; data-start=&quot;397&quot;&gt;Option 1: Rarible on Polygon (Lazy Minting)&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;462&quot; data-start=&quot;445&quot;&gt;How to Mint:&lt;/h4&gt;
&lt;ol data-end=&quot;872&quot; data-start=&quot;463&quot;&gt;
&lt;li data-end=&quot;510&quot; data-start=&quot;463&quot;&gt;
&lt;p data-end=&quot;510&quot; data-start=&quot;466&quot;&gt;Go to &lt;a class=&quot;&quot; data-end=&quot;510&quot; data-start=&quot;472&quot; href=&quot;https://rarible.com&quot; rel=&quot;noopener&quot; target=&quot;_new&quot;&gt;&lt;strong data-end=&quot;488&quot; data-start=&quot;473&quot;&gt;Rarible.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;549&quot; data-start=&quot;511&quot;&gt;
&lt;p data-end=&quot;549&quot; data-start=&quot;514&quot;&gt;Connect your wallet (e.g. MetaMask)&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;613&quot; data-start=&quot;550&quot;&gt;
&lt;p data-end=&quot;613&quot; data-start=&quot;553&quot;&gt;Switch network to &lt;strong data-end=&quot;582&quot; data-start=&quot;571&quot;&gt;Polygon&lt;/strong&gt; (you can use Rarible’s prompt)&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;635&quot; data-start=&quot;614&quot;&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;617&quot;&gt;Click &lt;strong data-end=&quot;635&quot; data-start=&quot;623&quot;&gt;&quot;Create&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;675&quot; data-start=&quot;636&quot;&gt;
&lt;p data-end=&quot;675&quot; data-start=&quot;639&quot;&gt;Choose &lt;strong data-end=&quot;657&quot; data-start=&quot;646&quot;&gt;Polygon&lt;/strong&gt; as the blockchain&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;718&quot; data-start=&quot;676&quot;&gt;
&lt;p data-end=&quot;718&quot; data-start=&quot;679&quot;&gt;Upload your file, add title/description&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;802&quot; data-start=&quot;719&quot;&gt;
&lt;p data-end=&quot;802&quot; data-start=&quot;722&quot;&gt;&lt;strong data-end=&quot;747&quot; data-start=&quot;722&quot;&gt;Enable &quot;Free minting&quot;&lt;/strong&gt; — this is Rarible’s version of lazy minting on Polygon&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;872&quot; data-start=&quot;803&quot;&gt;
&lt;p data-end=&quot;872&quot; data-start=&quot;806&quot;&gt;Sign (gas-free) — your NFT will be visible on your Rarible profile&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-end=&quot;893&quot; data-start=&quot;874&quot;&gt;After Minting:&lt;/h4&gt;
&lt;ul data-end=&quot;1103&quot; data-start=&quot;894&quot;&gt;
&lt;li data-end=&quot;972&quot; data-start=&quot;894&quot;&gt;
&lt;p data-end=&quot;972&quot; data-start=&quot;896&quot;&gt;Your NFT is &lt;strong data-end=&quot;923&quot; data-start=&quot;908&quot;&gt;lazy minted&lt;/strong&gt;, but still appears on-chain via Polygon metadata&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1017&quot; data-start=&quot;973&quot;&gt;
&lt;p data-end=&quot;1017&quot; data-start=&quot;975&quot;&gt;You can &lt;strong data-end=&quot;1017&quot; data-start=&quot;983&quot;&gt;list it on Rarible immediately&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1103&quot; data-start=&quot;1018&quot;&gt;
&lt;p data-end=&quot;1103&quot; data-start=&quot;1020&quot;&gt;It will appear on &lt;strong data-end=&quot;1049&quot; data-start=&quot;1038&quot;&gt;OpenSea&lt;/strong&gt; automatically after a short delay (indexed by wallet)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1108&quot; data-start=&quot;1105&quot; /&gt;
&lt;h3 data-end=&quot;1155&quot; data-start=&quot;1110&quot;&gt;🔧 &lt;strong data-end=&quot;1155&quot; data-start=&quot;1117&quot;&gt;Option 2: Mintable (Gasless Store)&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;1173&quot; data-start=&quot;1156&quot;&gt;How to Mint:&lt;/h4&gt;
&lt;ol data-end=&quot;1364&quot; data-start=&quot;1174&quot;&gt;
&lt;li data-end=&quot;1223&quot; data-start=&quot;1174&quot;&gt;
&lt;p data-end=&quot;1223&quot; data-start=&quot;1177&quot;&gt;Visit &lt;a class=&quot;&quot; data-end=&quot;1223&quot; data-start=&quot;1183&quot; href=&quot;https://mintable.app&quot; rel=&quot;noopener&quot; target=&quot;_new&quot;&gt;&lt;strong data-end=&quot;1200&quot; data-start=&quot;1184&quot;&gt;mintable.app&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1260&quot; data-start=&quot;1224&quot;&gt;
&lt;p data-end=&quot;1260&quot; data-start=&quot;1227&quot;&gt;Create a &lt;strong data-end=&quot;1260&quot; data-start=&quot;1236&quot;&gt;&quot;gasless store item&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1292&quot; data-start=&quot;1261&quot;&gt;
&lt;p data-end=&quot;1292&quot; data-start=&quot;1264&quot;&gt;Upload your art and metadata&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1364&quot; data-start=&quot;1293&quot;&gt;
&lt;p data-end=&quot;1364&quot; data-start=&quot;1296&quot;&gt;Choose &lt;strong data-end=&quot;1331&quot; data-start=&quot;1303&quot;&gt;Gasless (Mintable Store)&lt;/strong&gt; option — no crypto or gas needed&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-end=&quot;1377&quot; data-start=&quot;1366&quot;&gt;Notes:&lt;/h4&gt;
&lt;ul data-end=&quot;1597&quot; data-start=&quot;1378&quot;&gt;
&lt;li data-end=&quot;1481&quot; data-start=&quot;1378&quot;&gt;
&lt;p data-end=&quot;1481&quot; data-start=&quot;1380&quot;&gt;NFTs minted via Mintable’s gasless store are &lt;strong data-end=&quot;1445&quot; data-start=&quot;1425&quot;&gt;minted off-chain&lt;/strong&gt; until purchased (like lazy minting)&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1597&quot; data-start=&quot;1482&quot;&gt;
&lt;p data-end=&quot;1597&quot; data-start=&quot;1484&quot;&gt;Once sold/minted, they &lt;strong data-end=&quot;1540&quot; data-start=&quot;1507&quot;&gt;can be transferred to OpenSea&lt;/strong&gt;, &lt;strong data-end=&quot;1572&quot; data-start=&quot;1542&quot;&gt;but won’t show immediately&lt;/strong&gt; unless manually imported&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1602&quot; data-start=&quot;1599&quot; /&gt;
&lt;h3 data-end=&quot;1633&quot; data-start=&quot;1604&quot;&gt;🌐 &lt;strong data-end=&quot;1633&quot; data-start=&quot;1611&quot;&gt;OpenSea on Polygon&lt;/strong&gt;&lt;/h3&gt;
&lt;ul data-end=&quot;1884&quot; data-start=&quot;1634&quot;&gt;
&lt;li data-end=&quot;1669&quot; data-start=&quot;1634&quot;&gt;
&lt;p data-end=&quot;1669&quot; data-start=&quot;1636&quot;&gt;OpenSea natively supports Polygon&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1736&quot; data-start=&quot;1670&quot;&gt;
&lt;p data-end=&quot;1736&quot; data-start=&quot;1672&quot;&gt;Go to &lt;a class=&quot;&quot; data-end=&quot;1707&quot; data-start=&quot;1678&quot; href=&quot;https://opensea.io&quot; rel=&quot;noopener&quot; target=&quot;_new&quot;&gt;OpenSea&lt;/a&gt;, connect the &lt;strong data-end=&quot;1736&quot; data-start=&quot;1721&quot;&gt;same wallet&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1768&quot; data-start=&quot;1737&quot;&gt;
&lt;p data-end=&quot;1768&quot; data-start=&quot;1739&quot;&gt;Switch network to &lt;strong data-end=&quot;1768&quot; data-start=&quot;1757&quot;&gt;Polygon&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1828&quot; data-start=&quot;1769&quot;&gt;
&lt;p data-end=&quot;1828&quot; data-start=&quot;1771&quot;&gt;Your Rarible Polygon NFTs will show under &lt;strong data-end=&quot;1828&quot; data-start=&quot;1813&quot;&gt;“Collected”&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1884&quot; data-start=&quot;1829&quot;&gt;
&lt;p data-end=&quot;1884&quot; data-start=&quot;1831&quot;&gt;You can &lt;strong data-end=&quot;1874&quot; data-start=&quot;1839&quot;&gt;list them for resale on OpenSea&lt;/strong&gt;, zero gas&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1889&quot; data-start=&quot;1886&quot; /&gt;
&lt;h3 data-end=&quot;1902&quot; data-start=&quot;1891&quot;&gt;💡 Tips&lt;/h3&gt;
&lt;ul data-end=&quot;2103&quot; data-start=&quot;1903&quot;&gt;
&lt;li data-end=&quot;1959&quot; data-start=&quot;1903&quot;&gt;
&lt;p data-end=&quot;1959&quot; data-start=&quot;1905&quot;&gt;Rarible lets you set royalties and collection metadata&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2044&quot; data-start=&quot;1960&quot;&gt;
&lt;p data-end=&quot;2044&quot; data-start=&quot;1962&quot;&gt;You only pay gas if you mint on &lt;strong data-end=&quot;2006&quot; data-start=&quot;1994&quot;&gt;Ethereum&lt;/strong&gt; — Polygon is gas-free for mint + list&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2103&quot; data-start=&quot;2045&quot;&gt;
&lt;p data-end=&quot;2103&quot; data-start=&quot;2047&quot;&gt;&lt;strong data-end=&quot;2062&quot; data-start=&quot;2047&quot;&gt;No bridging&lt;/strong&gt; required if you mint directly on Polygon&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/4623530510476858800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/4623530510476858800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/4623530510476858800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/4623530510476858800'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2025/06/how-to-publish-nft-on-opensea-step-by.html' title=' How to Publish an NFT on OpenSea: Step-by-Step Guide'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-1003823769001661576</id><published>2025-05-20T19:46:00.000-07:00</published><updated>2025-05-20T22:59:12.123-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CNAME"/><category scheme="http://www.blogger.com/atom/ns#" term="CrazyDomains"/><category scheme="http://www.blogger.com/atom/ns#" term="DNS"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Sites"/><category scheme="http://www.blogger.com/atom/ns#" term="Own Domain"/><category scheme="http://www.blogger.com/atom/ns#" term="Verify domain"/><category scheme="http://www.blogger.com/atom/ns#" term="web hosting"/><title type='text'> How To Hosting Google Sites on own Domain</title><content type='html'>&lt;div style=&quot;text-align: left;&quot;&gt;Create your website at Google Sites - sites.google.com&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;When finished design, Publish first. The website is now working on sites.google.com.&lt;br /&gt;&lt;p style=&quot;text-align: left;&quot;&gt;To connect this website with your domain name which you purchased from a Domain Registrar, do the following:&lt;br /&gt;On the webpage on sites.google.com/, click on the Settings (Gear) icon&lt;br /&gt;On the Settings dialog, click Custom Domains, then click Connect Domain.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB0civ69a6-XWke_420_nulxu8qhnU-3RBp63UOH2RTdCQ2-Bx6Rza-k4NDj5Z0v96kyaNex0dhsZqnWUSZSVa0S-N2BmD82wRUU9YAaKX2yfOpXlOlMVmewuLDNiPIY0IZFOqG8m0vBV7q_M6G0lOdaD40DdfJxzIOajL2iJAcd7Ialewlw/s710/1HowToHostGoogleSitesOnOwnDomain.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;431&quot; data-original-width=&quot;710&quot; height=&quot;194&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB0civ69a6-XWke_420_nulxu8qhnU-3RBp63UOH2RTdCQ2-Bx6Rza-k4NDj5Z0v96kyaNex0dhsZqnWUSZSVa0S-N2BmD82wRUU9YAaKX2yfOpXlOlMVmewuLDNiPIY0IZFOqG8m0vBV7q_M6G0lOdaD40DdfJxzIOajL2iJAcd7Ialewlw/s320/1HowToHostGoogleSitesOnOwnDomain.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Type in the domain that you own already.&lt;br /&gt;It will check the validity of the domain. If ok, proceed to next step.&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPoBr7KmjA3fLWbNISyvmfPgtq4bAT9dntFCfMht2nH2d4WP5qdM9Nl5W_3O6hz2fsll2wx1S5hoGpdG2Ft8P9ikE8SVPFM8Be07p_SMGYCFzzFYBgBCiVmKfaFDH8Dp1g_JVq3gKM89TMdf561kqyd1t33D9AkwLx3dEEVwxjbnTA-qlVmw/s546/2HowToHostGoogleSitesOnOwnDomain.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;371&quot; data-original-width=&quot;546&quot; height=&quot;217&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPoBr7KmjA3fLWbNISyvmfPgtq4bAT9dntFCfMht2nH2d4WP5qdM9Nl5W_3O6hz2fsll2wx1S5hoGpdG2Ft8P9ikE8SVPFM8Be07p_SMGYCFzzFYBgBCiVmKfaFDH8Dp1g_JVq3gKM89TMdf561kqyd1t33D9AkwLx3dEEVwxjbnTA-qlVmw/w320-h217/2HowToHostGoogleSitesOnOwnDomain.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;p style=&quot;text-align: left;&quot;&gt;If you see this message &quot;This domain is not verified. Please verify your ownership&quot;, then click on the link, otherwise skip this section.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj74tqj2Dh9y2MPfLxT4wtDIYQL50_gCkD05NJOof8Cs8JYJ40cycEcg3PhgtMiXbcazZY899VbcwYg-cuLHKMPxwKo_opQkifhTVFmQdCAjjyhLEQP8MdV5bBrLEdKxKY9P5Sx7ToM_pXD8ct9R8deTcaYA7YZHUH-v8VfioWYPI3tz7DR1Q/s538/3HowToHostGoogleSitesOnOwnDomain.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;368&quot; data-original-width=&quot;538&quot; height=&quot;219&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj74tqj2Dh9y2MPfLxT4wtDIYQL50_gCkD05NJOof8Cs8JYJ40cycEcg3PhgtMiXbcazZY899VbcwYg-cuLHKMPxwKo_opQkifhTVFmQdCAjjyhLEQP8MdV5bBrLEdKxKY9P5Sx7ToM_pXD8ct9R8deTcaYA7YZHUH-v8VfioWYPI3tz7DR1Q/w320-h219/3HowToHostGoogleSitesOnOwnDomain.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;This section will prove to Google you own the domain, by creating an extra TXT/CNAME record.&lt;br /&gt;A new dialog will show two options: Domain or URL Prefix&lt;br /&gt;Select the Domain option.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgo4UHwRtED5QkuKMw6uOLEM6OLVK_0QKl-WcOh9YQn4VMuc6X_HKZm8E_RRNdpT_p8Ir1VNUubpJ7CYOfE7FsRpusOG6m5hmMXtOqA0UK-YdhxiiQG7Gr9RBBJggmQh4Zc5JXbdH2-uRxeP0DdOvpSW1tqDvPkG8wbSHsJ-Lf3XakUY7lwA/s776/4HowToHostGoogleSitesOnOwnDomain.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;667&quot; data-original-width=&quot;776&quot; height=&quot;275&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgo4UHwRtED5QkuKMw6uOLEM6OLVK_0QKl-WcOh9YQn4VMuc6X_HKZm8E_RRNdpT_p8Ir1VNUubpJ7CYOfE7FsRpusOG6m5hmMXtOqA0UK-YdhxiiQG7Gr9RBBJggmQh4Zc5JXbdH2-uRxeP0DdOvpSW1tqDvPkG8wbSHsJ-Lf3XakUY7lwA/s320/4HowToHostGoogleSitesOnOwnDomain.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;On the dialog: Verify domain ownership via DNS record.&lt;br /&gt;1. Select record type. TXT or CNAME. I choose CNAME because my domain registrar only has this option.&lt;br /&gt;2. Sign in to your domain registrar (e.g. CrazyDomains)&lt;br /&gt;3. Copy the CNAME record below into the DNS configuration.&amp;nbsp;&lt;br /&gt;i) CName Label/Host: asuiasiaafa&lt;br /&gt;ii)CName Destination / Target: aoanofzdof.googlehosted.com&lt;br /&gt;These two values (masked above) will be given by Google.&lt;br /&gt;4.Press verify below.&lt;/p&gt;Reminder: steps&amp;nbsp; 2 and 3 must be performed on the Domain Registrars page, before coming back here to click Verify. By placing the above information on your Domain Registrar, this shows you have control of the domain name, hence proving to Google that you own that domain.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZiSzafVPYSKRbbcIFbNlT39Kw4ZPdgioqaZBVFi4BSCrhFT85M4ByROWJXeENOLiBK0VNj78YHOp6CjtkYeACL4Y4_76WXxJ6qH4Yi6mEl_Ihgy_qJ3hThGz0RIkqGLha0ClOLeQdfC4BjGmVYhqR3SyfjLO31R3AsX_zRhFvaq92YcJ78g/s457/5HowToHostGoogleSitesOnOwnDomain.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;457&quot; data-original-width=&quot;452&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZiSzafVPYSKRbbcIFbNlT39Kw4ZPdgioqaZBVFi4BSCrhFT85M4ByROWJXeENOLiBK0VNj78YHOp6CjtkYeACL4Y4_76WXxJ6qH4Yi6mEl_Ihgy_qJ3hThGz0RIkqGLha0ClOLeQdfC4BjGmVYhqR3SyfjLO31R3AsX_zRhFvaq92YcJ78g/s320/5HowToHostGoogleSitesOnOwnDomain.jpg&quot; width=&quot;316&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Follow the instructions below to complete the procedure.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Google Sites will show these instructions:&lt;br /&gt;################&lt;br /&gt;Connect to third-party domain registrar&lt;br /&gt;- In a separate tab, sign in to your domain registrar’s website&lt;br /&gt;- Go to your DNS settings&lt;br /&gt;- Create a new CNAME entry&lt;br /&gt;- Under CNAME value or alias, enter www&lt;br /&gt;- In CNAME destination, enter ghs.googlehosted.com&lt;br /&gt;- Note: Your domain registrar might require a full stop at the end&lt;br /&gt;- Save changes&lt;br /&gt;- Come back to this tab and click Done&lt;br /&gt;################&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir2ngGwbneBWwNeOIwBbZox6kKOCbA5cFy54G8NyNN1YQoFIiaPP1s9lM19Ruyvth6_PH2RTl76uQ9JVwKa2heeiw9qjgHBxnTXgKlpTtdmRI8VPhYGDRY1hflVJZU7XQ2OA0Ds1-w7vks_L5zaifFf-x_EPoJDJuSUZyFKMGKHfB4FR2odg/s546/6HowToHostGoogleSitesOnOwnDomain.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;376&quot; data-original-width=&quot;546&quot; height=&quot;220&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir2ngGwbneBWwNeOIwBbZox6kKOCbA5cFy54G8NyNN1YQoFIiaPP1s9lM19Ruyvth6_PH2RTl76uQ9JVwKa2heeiw9qjgHBxnTXgKlpTtdmRI8VPhYGDRY1hflVJZU7XQ2OA0Ds1-w7vks_L5zaifFf-x_EPoJDJuSUZyFKMGKHfB4FR2odg/s320/6HowToHostGoogleSitesOnOwnDomain.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;The next section shows the steps for CrazyDomains as the domain registrar. Others may be similar.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifgQziKI3Kgj7zdtT5blA_Cg11C3vtdvvKqPIvQxtiZ5tKSOjcFhqgPrkp4bXIQHW-P0yPjicx78TYFcqk5b0oSQ3hBMA2-aoSlzMbMvC_lT-afATNL8MQLDWm_XOYlg3lFMalkCbERlmdoqz2xe4a3tZaFmri2ryic26wDdQBBkOVZYI2Mg/s581/7HowToHostGoogleSitesOnOwnDomain.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;371&quot; data-original-width=&quot;581&quot; height=&quot;204&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifgQziKI3Kgj7zdtT5blA_Cg11C3vtdvvKqPIvQxtiZ5tKSOjcFhqgPrkp4bXIQHW-P0yPjicx78TYFcqk5b0oSQ3hBMA2-aoSlzMbMvC_lT-afATNL8MQLDWm_XOYlg3lFMalkCbERlmdoqz2xe4a3tZaFmri2ryic26wDdQBBkOVZYI2Mg/s320/7HowToHostGoogleSitesOnOwnDomain.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/1003823769001661576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/1003823769001661576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/1003823769001661576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/1003823769001661576'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2025/05/how-to-hosting-google-sites-on-own.html' title=' How To Hosting Google Sites on own Domain'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB0civ69a6-XWke_420_nulxu8qhnU-3RBp63UOH2RTdCQ2-Bx6Rza-k4NDj5Z0v96kyaNex0dhsZqnWUSZSVa0S-N2BmD82wRUU9YAaKX2yfOpXlOlMVmewuLDNiPIY0IZFOqG8m0vBV7q_M6G0lOdaD40DdfJxzIOajL2iJAcd7Ialewlw/s72-c/1HowToHostGoogleSitesOnOwnDomain.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-2821782603924891011</id><published>2025-02-08T03:13:00.000-08:00</published><updated>2025-02-08T04:47:24.160-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI video"/><category scheme="http://www.blogger.com/atom/ns#" term="compressing"/><category scheme="http://www.blogger.com/atom/ns#" term="fps"/><category scheme="http://www.blogger.com/atom/ns#" term="framesize"/><category scheme="http://www.blogger.com/atom/ns#" term="video cutting"/><category scheme="http://www.blogger.com/atom/ns#" term="video editing"/><category scheme="http://www.blogger.com/atom/ns#" term="video splitting"/><title type='text'>Veed.io - An online Video Editing with AI-powered features</title><content type='html'>&lt;p&gt;&amp;nbsp;Stumbled upon this online video editor platform while trying to condense video clips taken on my Google Pixel 7 Pro mobile phone. Few quick notes on some cool features that prompted me to share this experience here.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Video Compression includes fps and framesize&lt;/li&gt;&lt;li&gt;Free Account that is usable&lt;/li&gt;&lt;li&gt;Upload and Download that are smooth&lt;/li&gt;&lt;li&gt;Create videos by i) Recording ii) By Video AI (give a description and it produces a video)&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhriZns2ulNVhUGMwEw9yPp0TK0FbCUUHpEvlPVf46zj1mP5RjtRNXx5HCphEf1Iz9OnSqJmA6JD5WJZiahcSWPbBs7u1G_igk42CQRV1g64tytQITe5hVIwdy8dl4mg-5TeukgiYKCLG53U6doWvbU4Sg1ZLmzU___Drq1FzhzInGwILYDUA/s330/Veed_VideoAI.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;213&quot; data-original-width=&quot;330&quot; height=&quot;207&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhriZns2ulNVhUGMwEw9yPp0TK0FbCUUHpEvlPVf46zj1mP5RjtRNXx5HCphEf1Iz9OnSqJmA6JD5WJZiahcSWPbBs7u1G_igk42CQRV1g64tytQITe5hVIwdy8dl4mg-5TeukgiYKCLG53U6doWvbU4Sg1ZLmzU___Drq1FzhzInGwILYDUA/s320/Veed_VideoAI.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another reason that prompted this blog, is the rather un-intuitive layout and operations for the platform. But since it is quite a nice tool, I thought of giving more details here to make things easy for new users.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Video Editing Features:&lt;/div&gt;&lt;div&gt;FPS - for compression, use this to select a lower framerate. Choices are: 30, 25, 24, 10&lt;/div&gt;&lt;div&gt;Framesize - reduces the image to popular social media formats, eg:&amp;nbsp;&lt;/div&gt;&lt;div&gt;Timeline, splitter, cutter - for slicing and dicing&lt;/div&gt;&lt;div&gt;Voiceover&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMqpkZuIy5mLtnRaqZLf9rgp5HD0hEq0wRgI68r9zWfTVK_ywvwoAwpG6AAX67GjXJd8aVwtZpC48fE2lVlF53IkiVywectrYKytl1oUjnISZezK9KjmQ57Mb2Pgvi8-aMVRkIPhs1vwPqIVXczmWMioQWNsqpD5e265LMSHL_ipOhHIqRiA/s397/Veed_Resize.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;396&quot; data-original-width=&quot;397&quot; height=&quot;319&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMqpkZuIy5mLtnRaqZLf9rgp5HD0hEq0wRgI68r9zWfTVK_ywvwoAwpG6AAX67GjXJd8aVwtZpC48fE2lVlF53IkiVywectrYKytl1oUjnISZezK9KjmQ57Mb2Pgvi8-aMVRkIPhs1vwPqIVXczmWMioQWNsqpD5e265LMSHL_ipOhHIqRiA/s320/Veed_Resize.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiui28jly_XvUyETafV4vE5QHF7dAomRs8QUPcntzK4KIR2jQamWiMvJ1ahyJKCmBuf1HHOn_eOv4rm8JPNtRtWVHHPmMUkME3H0FUbGqD2bLAXYFNQnmZkEfFkOhusZr8eIikLRcQ9tde0bGl70JFD_Pugf22KWxS1_AQLGLo4N2UNUeiLRw/s427/Veed_EditFeatures.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;427&quot; data-original-width=&quot;189&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiui28jly_XvUyETafV4vE5QHF7dAomRs8QUPcntzK4KIR2jQamWiMvJ1ahyJKCmBuf1HHOn_eOv4rm8JPNtRtWVHHPmMUkME3H0FUbGqD2bLAXYFNQnmZkEfFkOhusZr8eIikLRcQ9tde0bGl70JFD_Pugf22KWxS1_AQLGLo4N2UNUeiLRw/s320/Veed_EditFeatures.jpg&quot; width=&quot;142&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipf0ESEVylTVBphFso6FenWMkFY1DKG-Z0Eossn6aiF1qJyxiIHmvs8ByqDW8s074GD0yROR-EDmo33k2WaPoC4L_gEkjZ8rtgpPrE4lc9EzwRf4lgEmhvF7BxSeHWj5RXG78D82Zb0IqKeBIRafrA5eJfdN1c8VY3Mf3_BMDiZ2TePJGOzQ/s301/Veed_AdjustVideo.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;301&quot; data-original-width=&quot;168&quot; height=&quot;301&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipf0ESEVylTVBphFso6FenWMkFY1DKG-Z0Eossn6aiF1qJyxiIHmvs8ByqDW8s074GD0yROR-EDmo33k2WaPoC4L_gEkjZ8rtgpPrE4lc9EzwRf4lgEmhvF7BxSeHWj5RXG78D82Zb0IqKeBIRafrA5eJfdN1c8VY3Mf3_BMDiZ2TePJGOzQ/s1600/Veed_AdjustVideo.jpg&quot; width=&quot;168&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-IVEPXIMQ0ZxNgKeSZQYB4uj27iVTCI1f4so5eBPdjYmfKhNFQ4EHpdlRxzhWSSZveM20To93qs1rVRpIXtvwEISarW2hrU78-iDlbgNcPfyfV6qCpRbmRUlWmexYNps2IsU2riG3B7xmTa0nkY59S8wtwGqZrPxZqmYRpYqUov_OWhxrww/s385/Veed_StockMusic.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;385&quot; data-original-width=&quot;157&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-IVEPXIMQ0ZxNgKeSZQYB4uj27iVTCI1f4so5eBPdjYmfKhNFQ4EHpdlRxzhWSSZveM20To93qs1rVRpIXtvwEISarW2hrU78-iDlbgNcPfyfV6qCpRbmRUlWmexYNps2IsU2riG3B7xmTa0nkY59S8wtwGqZrPxZqmYRpYqUov_OWhxrww/s320/Veed_StockMusic.jpg&quot; width=&quot;130&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Some not so cool features:&lt;/div&gt;&lt;div&gt;- you get two free, anonymous, non-sign-in video uploads and edit. Then you need to create an account to do more. You can choose the free plan.&lt;/div&gt;&lt;div&gt;- The interface for the first two free videos are different. Subsequent videos need to be restricted according to the type of plan.&lt;/div&gt;&lt;div&gt;- Free plan features: watermark (based on your name), no privacy (anyone with the link can view your video), 720p, 10min duration per video, 1 GB per video, 20GB storage total.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Hints (for using a Free account):&lt;/b&gt;&lt;/div&gt;&lt;div&gt;- Give a short name, even a dot &quot;.&quot; - so that the watermark is shorter.&lt;/div&gt;&lt;div&gt;- Permanently Delete video from your account if you want privacy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How to start?&amp;nbsp; Create New Project&lt;/div&gt;&lt;div&gt;Must do this before it allows you to upload a video, and access the editing tools.&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1lN69KOB5PzofSsesLHaAnr422PbxOXe9Thyphenhyphen8EfVBartmzF5wuLqnR4PMiJxvSk020zqycLyrnAvIS1pkM2rh2rl9iM7P_QYpgLFTdzGhoK5VVN51aBSgZMra-8lbNmdEmT5xp3-EUbBuu4Fw6re_bGCzislyX_HqexDyifIc1UJPOCT6kQ/s448/Veed_StartCreateProject.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;305&quot; data-original-width=&quot;448&quot; height=&quot;218&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1lN69KOB5PzofSsesLHaAnr422PbxOXe9Thyphenhyphen8EfVBartmzF5wuLqnR4PMiJxvSk020zqycLyrnAvIS1pkM2rh2rl9iM7P_QYpgLFTdzGhoK5VVN51aBSgZMra-8lbNmdEmT5xp3-EUbBuu4Fw6re_bGCzislyX_HqexDyifIc1UJPOCT6kQ/s320/Veed_StartCreateProject.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;How to GET Video when completed?&lt;/div&gt;&lt;div&gt;Done -&amp;gt; Export&lt;/div&gt;&lt;div&gt;You don&#39;t download when you finished creating, editing, compressing the video. You have to EXPORT first. But how to export? You have to click DONE button, since there is no Export button. Then only click Export Video. The export process is where the final video is rendered, using all the changes that we specified.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxV2mW9DsNYrYrWHUR6eiGme5Rv_Hni4fZgXjxU-_Du9bY_QKxc-hjdhPyiHlsbDwAoYeAvllf8O-s4N7YXp0UFrmZo7qH2DJvCh3gpABiLBGjTUwUnhvSkj2ncc5usGeewyCJvE13U-Oz-KVYyfheLsolhRrz4ZggF3MezIgO7bsWGRXqRA/s308/Veed_DoneExport.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;308&quot; data-original-width=&quot;213&quot; height=&quot;308&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxV2mW9DsNYrYrWHUR6eiGme5Rv_Hni4fZgXjxU-_Du9bY_QKxc-hjdhPyiHlsbDwAoYeAvllf8O-s4N7YXp0UFrmZo7qH2DJvCh3gpABiLBGjTUwUnhvSkj2ncc5usGeewyCJvE13U-Oz-KVYyfheLsolhRrz4ZggF3MezIgO7bsWGRXqRA/s1600/Veed_DoneExport.jpg&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How to download?&lt;/div&gt;&lt;div&gt;The typical Download icon does NOT download the video. You need to click on one of the 3 buttons below: MP4 (for video) or MP3 or GIF&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRgBzDxXUess75ADdViJGc5fg7hLgsuTbNVg3s9raGPKrym6R6H7t58UlkbkU192tOkaSSEdSugMvgH0oLCcL-FV5l6c5kNtIDXu4Q4HyaxCRB46G_QGsDOL2UDSS0LufPWCbYvbWiAf4drXYQsU94SZXXLAwUAThDEHlDZ9yvNVuigDcVZg/s341/Veed_DownloadVideo.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;341&quot; data-original-width=&quot;256&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRgBzDxXUess75ADdViJGc5fg7hLgsuTbNVg3s9raGPKrym6R6H7t58UlkbkU192tOkaSSEdSugMvgH0oLCcL-FV5l6c5kNtIDXu4Q4HyaxCRB46G_QGsDOL2UDSS0LufPWCbYvbWiAf4drXYQsU94SZXXLAwUAThDEHlDZ9yvNVuigDcVZg/s320/Veed_DownloadVideo.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;How to get back to main page, after export and download?&lt;/div&gt;&lt;div&gt;Once finished, and you want to upload or start creating a new video, there is NO back to Homepage or project button. It seems stuck at the download page. So you need to click the VEEP word on the top left corner.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How to NOT Share?&lt;/div&gt;&lt;div&gt;For the free account, all videos are SHARED, unless you Delete Permanently.&lt;/div&gt;&lt;div&gt;Sharing happens automatically after the Export process is finished.&lt;/div&gt;&lt;div&gt;Below dialog shows different ways of sharing.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Although the video is public, people can&#39;t see it unless you give them the link.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqjpvlrrWeBNQeZfvgzHkeI29LxB3wYsYecZvpuke78wTez_JF3odnqrD7YkzzJ6ccPoeNzf_xdCZpDrTwV7CA-5JeVP4DRIUmJ7ygmGyPlujXzty_GcTCsRdnGN5IteNvyIDak6_y55r9UsMjQNSy37OpTdw6zSJKabD5bD-EqLt4Rl1KNw/s233/Veed_Share.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;212&quot; data-original-width=&quot;233&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqjpvlrrWeBNQeZfvgzHkeI29LxB3wYsYecZvpuke78wTez_JF3odnqrD7YkzzJ6ccPoeNzf_xdCZpDrTwV7CA-5JeVP4DRIUmJ7ygmGyPlujXzty_GcTCsRdnGN5IteNvyIDak6_y55r9UsMjQNSy37OpTdw6zSJKabD5bD-EqLt4Rl1KNw/s1600/Veed_Share.jpg&quot; width=&quot;233&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/2821782603924891011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/2821782603924891011' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/2821782603924891011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/2821782603924891011'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2025/02/veedio-online-video-editing-with-ai.html' title='Veed.io - An online Video Editing with AI-powered features'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhriZns2ulNVhUGMwEw9yPp0TK0FbCUUHpEvlPVf46zj1mP5RjtRNXx5HCphEf1Iz9OnSqJmA6JD5WJZiahcSWPbBs7u1G_igk42CQRV1g64tytQITe5hVIwdy8dl4mg-5TeukgiYKCLG53U6doWvbU4Sg1ZLmzU___Drq1FzhzInGwILYDUA/s72-c/Veed_VideoAI.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-4864596747712371780</id><published>2024-03-08T06:30:00.000-08:00</published><updated>2024-03-31T00:50:24.185-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="install Ubuntu Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="Surface"/><title type='text'>Linux On Microsoft Surface Laptop</title><content type='html'>&lt;h4 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;Found some materials on how to do this.&lt;/h4&gt;&lt;p&gt;Firstly the YouTube link with title : How to Install Linux on a Microsoft Surface (Ubuntu 22.04 Linux Surface Kernel)&lt;/p&gt;&lt;p&gt;https://youtu.be/6_EHEmz_j4o&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Few things needed:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Linux Ubuntu Iso download&lt;/li&gt;&lt;li&gt;USB key&lt;/li&gt;&lt;li&gt;Software called Rufus&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;When the above are ready, then proceed&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Run the Rufus program with the USB key plugged into the computer.&lt;/li&gt;&lt;li&gt;When prompted, select the Downloaded Ubuntu *.iso for Rufus. Basically Rufus will create a bootable USB with Ubuntu on it.&lt;/li&gt;&lt;li&gt;Plugin the USB onto the Surface&lt;/li&gt;&lt;li&gt;Boot up MS Surface, ensure boot configuration is selected to boot from USB drive.&lt;/li&gt;&lt;li&gt;Go into Ubuntu installation, follow instructions to install, then Reboot&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;At this point, Ubuntu is installed, you can boot and login. However, lots of the Surface hardware features are missing, e.g touchscreen, rotation of screen. To get these capabilities, we need to modify the Ubuntu kernel by installing a special kernal&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Go to Google and search Surface Linux.&lt;/div&gt;&lt;div&gt;Follow the instructions there.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Update 30 Mar 2024&lt;/h4&gt;&lt;div&gt;The following is an attempt to make use of a LIVE Linux on a USB drive. The above discussion is still slightly relevant, but several road-blocks are encountered as discussed below.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://rufus.ie/en/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Rufus&lt;/a&gt; vs &lt;a href=&quot;https://pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Universal USB Installer&lt;/a&gt; (UUI)&lt;/div&gt;&lt;div&gt;There are various good reviews of Rufus which states some of its advantages, so I won&#39;t repeat here. From experience, I can say it is easy to use to write a Linux ISO onto a USB drive and it seemed fast. However, specifically with Microsoft Surface that I tried on, it failed to get pass the Secure Boot (Bitlocker) screen. I changed the options at the MS Surface boot screen on the Security menu, trying all 3 options including no security, but still it would not boot. (Please leave comment, if I did not use correctly - but you must have experience in using Rufus on MS Surface).&lt;/div&gt;&lt;div&gt;Note: I&#39;ve checked with the Microsoft account specifically to this MS Surface device, and there is no BitLocker key. Yet the device was still unusable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So then I tried the UUI - and it is similarly as easy to write a Linux ISO to a USB drive than Rufus. This actually was able to go pass the Secure Boot. At the appropriate boot up screen, we should select VTOYEFI option, then followed by &quot;Enroll_This_Key_In_MokManager.cer&quot;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.slax.org/starting.php&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;SLAX&lt;/a&gt; vs &lt;a href=&quot;https://lubuntu.me/downloads/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Lbuntu&lt;/a&gt;&lt;/div&gt;&lt;div&gt;I chose SLAX because its ISO was under 500GB. After burning this into the USB using UUI, and starting up using the USB, it would not boot. The reason is that it appears UEFI is not fully available for some reason. Switching to Lbuntu instead, and using UUI, the USB was finally able to boot Lbuntu onto the MS Surface.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now the next problem is that MS Surface Wi-Fi hardware may not have been supported by Lbuntu. So the next step is to find a Linux that supports MS Surface, at least for the Wi-Fi adapter.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wifi problem:&lt;/div&gt;&lt;div&gt;It seems that the Linux that I&#39;ve tried, including Lbuntu and Ubuntu above does not recognize the wifi adapter hardware. From internet searches, it seems the hardware is Marvell branded wifi adapter. A few commands to check whether the wifi hardware adapter is detectable or not:&lt;/div&gt;&lt;div&gt;lspci&lt;/div&gt;&lt;div&gt;ip -a&lt;/div&gt;&lt;div&gt;It will be obvious if theses commands do not mention anything about any wifi adapters&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Persistence&lt;/div&gt;&lt;div&gt;To consider persistence, that is keeping the changes made to the Live Linux, the overlayfs in Linux is used. A few good references include:&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.baeldung.com/linux/overlayfs-usage&quot;&gt;https://www.baeldung.com/linux/overlayfs-usage&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://linuxconfig.org/introduction-to-the-overlayfs&quot;&gt;https://linuxconfig.org/introduction-to-the-overlayfs&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/4864596747712371780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/4864596747712371780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/4864596747712371780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/4864596747712371780'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2024/03/linux-on-microsoft-surface-laptop.html' title='Linux On Microsoft Surface Laptop'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-1192912656780240968</id><published>2023-10-12T17:10:00.003-07:00</published><updated>2023-10-12T17:10:30.816-07:00</updated><title type='text'>Security</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Hidden Cameras&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://us.norton.com/blog/how-to/how-to-find-hidden-cameras&quot;&gt;https://us.norton.com/blog/how-to/how-to-find-hidden-cameras&lt;/a&gt; - an excellent list of methods to identify hidden cameras&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Will have more in this article ......&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/1192912656780240968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/1192912656780240968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/1192912656780240968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/1192912656780240968'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2023/10/security.html' title='Security'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-5282347986820489194</id><published>2023-01-17T06:34:00.005-08:00</published><updated>2023-01-17T06:36:56.290-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Bone Conduction Earphones"/><category scheme="http://www.blogger.com/atom/ns#" term="IBC-R6"/><category scheme="http://www.blogger.com/atom/ns#" term="iRiver"/><category scheme="http://www.blogger.com/atom/ns#" term="South Korea"/><title type='text'>iRiver IBC-R6 Bone Conduction Earphone - Manual and Review</title><content type='html'>&lt;p&gt;&amp;nbsp;Recently bought this bone conduction earphone from the mature company iRiver of South Korea. You may remember iRiver from the days of really portable MP3 players, recorders and such. It is priced in the mid-range of 65,000 to 70,000 Won. The reason I chose this over no-brand or unheard-of-brands which are less than half the price is because it is from a South Korean company, rather than China. There are more expensive ones of course, such as Aftershock, which has been rebranded as Shokz, but I cannot justify the price to myself.&lt;/p&gt;&lt;p&gt;The first part of this blog would be showing the User Guide / Manual which is originally in Korean. The English translation (via Google Translate Camera function) is also shown below.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSgmov0IlapmqyQv1-u-VaQjjKFviFQT2CPHdrIobIPM0ADcOTVuuKcEPzT6RBDJ012SZ8fJZgafdYV-liQesio5yQL5VF3LRS0w5p9-4Y-vgtIWPehgQzk_4Ie8tdhoGnRYBsnybixpLv4ZhjvpOUZ1eKU3UTDOmLio5UNU2y8f2E-l4/s913/iRiver_IBC-R6-Manual_Korean_pg1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;840&quot; data-original-width=&quot;913&quot; height=&quot;589&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSgmov0IlapmqyQv1-u-VaQjjKFviFQT2CPHdrIobIPM0ADcOTVuuKcEPzT6RBDJ012SZ8fJZgafdYV-liQesio5yQL5VF3LRS0w5p9-4Y-vgtIWPehgQzk_4Ie8tdhoGnRYBsnybixpLv4ZhjvpOUZ1eKU3UTDOmLio5UNU2y8f2E-l4/w640-h589/iRiver_IBC-R6-Manual_Korean_pg1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzTZgdoKqH5bSYZE_nbz9XR6D9H8ZRlLqK3nPK204tzBlUrsVzIYVYFm_nIxFFSw2HQMXufXe8ejvyleiJiPJ2tBUeItAdE78g-xM0Xih3qj_hO05QB7P553mF4Kz7oCbx1YDKIZ39DPM5zQwbuksqENui8dL73EFEAPzfYTz3hAPMC7Q/s916/iRiver_IBC-R6-Manual_Korean_pg2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;837&quot; data-original-width=&quot;916&quot; height=&quot;584&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzTZgdoKqH5bSYZE_nbz9XR6D9H8ZRlLqK3nPK204tzBlUrsVzIYVYFm_nIxFFSw2HQMXufXe8ejvyleiJiPJ2tBUeItAdE78g-xM0Xih3qj_hO05QB7P553mF4Kz7oCbx1YDKIZ39DPM5zQwbuksqENui8dL73EFEAPzfYTz3hAPMC7Q/w640-h584/iRiver_IBC-R6-Manual_Korean_pg2.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoq6v-2EJu3Fvx2ysgOJSG6TIMP5FpGCdxB8jCJgKGEd4aSsWDp8loxChn_LO0O3k36_X1Lm5YXoUEgDjCjh1n3I6zqZf27JhtLLahUgCLvpaZAd88PaQo9lmxjPSRIO1DBkDsxO4T5ew3ibv0MNa3FKs4pWrSFjQcnMybosiMyVmissA/s2400/pg2_Screenshot_20230117-193230.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2400&quot; data-original-width=&quot;1080&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoq6v-2EJu3Fvx2ysgOJSG6TIMP5FpGCdxB8jCJgKGEd4aSsWDp8loxChn_LO0O3k36_X1Lm5YXoUEgDjCjh1n3I6zqZf27JhtLLahUgCLvpaZAd88PaQo9lmxjPSRIO1DBkDsxO4T5ew3ibv0MNa3FKs4pWrSFjQcnMybosiMyVmissA/w288-h640/pg2_Screenshot_20230117-193230.png&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHjEVh0fB-qtuA-nl1xc8RWSMGwNt98bOtwS2X0cB1rN2nI0XgfHI0lqb7i4i3KyZCN9chJBC-Vz6GpJL-4d44-uUUzymbdDXWFsoKp8T7AV005PtZMZobQtQPgWJ7A7Fg0UpKEp2cvI-mFl_BQM9yDDsPMbkvIaZ7D5z6UY3qe70XugQ/s2400/pg3_Screenshot_20230118-003010.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2400&quot; data-original-width=&quot;1080&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHjEVh0fB-qtuA-nl1xc8RWSMGwNt98bOtwS2X0cB1rN2nI0XgfHI0lqb7i4i3KyZCN9chJBC-Vz6GpJL-4d44-uUUzymbdDXWFsoKp8T7AV005PtZMZobQtQPgWJ7A7Fg0UpKEp2cvI-mFl_BQM9yDDsPMbkvIaZ7D5z6UY3qe70XugQ/w288-h640/pg3_Screenshot_20230118-003010.png&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhlVST5_h78nk95afC_5IaSninYInqFeZ9h3lJGGZsrxFfsu6Gna1L9bXyInHsKY34p-WNC1Xs4VJ7oBGiH51_uMR58EaRW_fbWZXOKx0aO15FmVX6HKzxMQ7Ah9hfFNdhwJ2AwNPTT1Z3RqQb3jyMnAJB4_hj4SSnphAL-QE8xrZx4yg/s2400/pg4_Screenshot_20230118-000524.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2400&quot; data-original-width=&quot;1080&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhlVST5_h78nk95afC_5IaSninYInqFeZ9h3lJGGZsrxFfsu6Gna1L9bXyInHsKY34p-WNC1Xs4VJ7oBGiH51_uMR58EaRW_fbWZXOKx0aO15FmVX6HKzxMQ7Ah9hfFNdhwJ2AwNPTT1Z3RqQb3jyMnAJB4_hj4SSnphAL-QE8xrZx4yg/w288-h640/pg4_Screenshot_20230118-000524.png&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_wJ2PawV05lraMui798FzbHwYvpN7HFmyuoWNRsi7zwoId5VFpUBk1tWLnHUGA2XAblzunSoddNInMV4Ag-sjXk82xa1F0IKuXfD4VeeJZboC245ClRFgL5y3DaGA2aXTCcn2NwNQ5T9L47FOPdQlR2uaslwA4Ms0g2H90fj_6UZ7VXo/s2400/pg5_Screenshot_20230118-000640.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2400&quot; data-original-width=&quot;1080&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_wJ2PawV05lraMui798FzbHwYvpN7HFmyuoWNRsi7zwoId5VFpUBk1tWLnHUGA2XAblzunSoddNInMV4Ag-sjXk82xa1F0IKuXfD4VeeJZboC245ClRFgL5y3DaGA2aXTCcn2NwNQ5T9L47FOPdQlR2uaslwA4Ms0g2H90fj_6UZ7VXo/w288-h640/pg5_Screenshot_20230118-000640.png&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4rbuHfsQzqMDTWoq2giT4OCoOFOav3yyiUjwzkYFiI_Yh8Qcxae5iSVOlvoQ5VCy-aYBFISp9UYyv8JKY1u7NxMPp1U4DpoTyWjEroB_INxX3N8_9Gyu4iPVnEZ518tGSlr5DkAVDt1ONq4Qhb2tEEA4Nwq6NdFrKEjrpaUpIac4mqPc/s2400/pg5b_Screenshot_20230118-000710.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2400&quot; data-original-width=&quot;1080&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4rbuHfsQzqMDTWoq2giT4OCoOFOav3yyiUjwzkYFiI_Yh8Qcxae5iSVOlvoQ5VCy-aYBFISp9UYyv8JKY1u7NxMPp1U4DpoTyWjEroB_INxX3N8_9Gyu4iPVnEZ518tGSlr5DkAVDt1ONq4Qhb2tEEA4Nwq6NdFrKEjrpaUpIac4mqPc/w288-h640/pg5b_Screenshot_20230118-000710.png&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnI5y5NXyc5Hk6SGD4OLEYGuSJ2r7j6-_ey_gBsW5_sGsI18zgoKWFnmD0SJt_bAttZ7q9DYO399GhDoHsPbtDjg2aT30anqQidX8d6ooy0Cqjet1hiyyXtz12Oj5Hi3WzV0kU86rHEmoRjLCud410XRHWOkdxobHaHd1OJbMqBwgfw20/s2400/pg6_Screenshot_20230118-001436.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2400&quot; data-original-width=&quot;1080&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnI5y5NXyc5Hk6SGD4OLEYGuSJ2r7j6-_ey_gBsW5_sGsI18zgoKWFnmD0SJt_bAttZ7q9DYO399GhDoHsPbtDjg2aT30anqQidX8d6ooy0Cqjet1hiyyXtz12Oj5Hi3WzV0kU86rHEmoRjLCud410XRHWOkdxobHaHd1OJbMqBwgfw20/w288-h640/pg6_Screenshot_20230118-001436.png&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilPnygcp3yJL3U8qLI9rBeS-9m85ptbz-_k0W9IuVtHRPn3RdSElpHw6P92bW9D7MpgZEHiLlw8ftO77ERQxa1Tb7ql603--UQf3pmpvyGitSL3rbqOmZ5zd5GViobTiT_IemQwAKT_UPeyUjtv3vLR8iXTYaF9towINT21lFKVL9ssZE/s2400/pg7_Screenshot_20230118-001454.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2400&quot; data-original-width=&quot;1080&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilPnygcp3yJL3U8qLI9rBeS-9m85ptbz-_k0W9IuVtHRPn3RdSElpHw6P92bW9D7MpgZEHiLlw8ftO77ERQxa1Tb7ql603--UQf3pmpvyGitSL3rbqOmZ5zd5GViobTiT_IemQwAKT_UPeyUjtv3vLR8iXTYaF9towINT21lFKVL9ssZE/w288-h640/pg7_Screenshot_20230118-001454.png&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhlAX6Jmn3-80Wv81G_jilgt9IPzalypDZ1VPRvoywfjMOuV3Mrm6MsN1LYbK8FYrTznUPb3RYJlC2E0Xndf6KEVRoLBrOoFDNkaUrq9mR_QYMno6y4CGxfauje9lg2iL814gU_5tOrSKh9rz_-KwzWyIQQKtfjQGbUOZ3u96br2JeZ4w/s2400/pg8_Screenshot_20230118-002710.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2400&quot; data-original-width=&quot;1080&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhlAX6Jmn3-80Wv81G_jilgt9IPzalypDZ1VPRvoywfjMOuV3Mrm6MsN1LYbK8FYrTznUPb3RYJlC2E0Xndf6KEVRoLBrOoFDNkaUrq9mR_QYMno6y4CGxfauje9lg2iL814gU_5tOrSKh9rz_-KwzWyIQQKtfjQGbUOZ3u96br2JeZ4w/w288-h640/pg8_Screenshot_20230118-002710.png&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzaUR5xVN2qbKSFIK18ZFEEKGtl3N2uDePzq0Q3L95R8EeUNTaZ0VzPxkxl497jLn_9Bk-T6-tmQ7BsGD7CKD4uYh9th1KR_nU86ryg-WtQ5hu4LdYrBdPvFoOsxU13_zet9A-NfiIjvZYDkQreDhVfkJe7StjvSN643ePA1PWLhvMaow/s2400/pg9_Screenshot_20230118-002757.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2400&quot; data-original-width=&quot;1080&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzaUR5xVN2qbKSFIK18ZFEEKGtl3N2uDePzq0Q3L95R8EeUNTaZ0VzPxkxl497jLn_9Bk-T6-tmQ7BsGD7CKD4uYh9th1KR_nU86ryg-WtQ5hu4LdYrBdPvFoOsxU13_zet9A-NfiIjvZYDkQreDhVfkJe7StjvSN643ePA1PWLhvMaow/w288-h640/pg9_Screenshot_20230118-002757.png&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;The review will be coming soon .... stay tuned&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/5282347986820489194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/5282347986820489194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/5282347986820489194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/5282347986820489194'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2023/01/iriver-ibc-r6-bone-conduction-earphone.html' title='iRiver IBC-R6 Bone Conduction Earphone - Manual and Review'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSgmov0IlapmqyQv1-u-VaQjjKFviFQT2CPHdrIobIPM0ADcOTVuuKcEPzT6RBDJ012SZ8fJZgafdYV-liQesio5yQL5VF3LRS0w5p9-4Y-vgtIWPehgQzk_4Ie8tdhoGnRYBsnybixpLv4ZhjvpOUZ1eKU3UTDOmLio5UNU2y8f2E-l4/s72-w640-h589-c/iRiver_IBC-R6-Manual_Korean_pg1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-2678584322579897600</id><published>2022-04-09T08:01:00.011-07:00</published><updated>2024-08-06T19:25:16.326-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Game"/><category scheme="http://www.blogger.com/atom/ns#" term="Grand Mafia"/><title type='text'>Grand Mafia Strategy</title><content type='html'>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Rules&lt;/h2&gt;&lt;h3&gt;City Rules&lt;/h3&gt;&lt;div&gt;This can be found in: Event Centre -&amp;gt; Governor&#39;s War Season 2 -&amp;gt; Battle for The City Hall -&amp;gt; City Announcement -&amp;gt; Check Announcement&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Mansions&lt;/h2&gt;&lt;div&gt;Level 17 - Get Babe #3 Julia&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Campaign&amp;nbsp;&lt;/h2&gt;&lt;p&gt;Normal vs Elite - both have 7 stages.&lt;/p&gt;&lt;p&gt;Each Normal stage has to be completed first, then only the Elite stage can go to the same level of stages.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Elite #5-12 - Bubba - Need Sparrow, Vinny, Mike, Nurse Doxxy, Nioh&lt;/p&gt;&lt;p&gt;Elite #7-12 - Anonymous - Need Sparrow, Big Shot, Bubba, Lok, Nurse Doxxy&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Defense&lt;/h2&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Wall&amp;nbsp;&lt;/h3&gt;&lt;div&gt;This is one of the keys to defense against attackers. The higher the level, the better.&lt;/div&gt;&lt;div&gt;In general, go to Investment Center to upgrade various wall defence items.&lt;/div&gt;&lt;div&gt;Within the Wall, the Traps also need to be upgraded.&lt;/div&gt;&lt;div&gt;Enforcers can be selected as Defensive Enforcers within the Wall. Some Enforces are better than others, e.g. Sparrow, @nonymous, Tony, etc.&lt;/div&gt;&lt;div&gt;Radar - built this structure to ensure you get notified when others are attacking you.&lt;/div&gt;&lt;div&gt;Enforcers should return home (from Robbing or other activities), once you know (from the Radar notification) that you are under attack.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Safehouse&lt;/h3&gt;&lt;div&gt;Keep Enforcers and Associates in Safehouse if Turf is under attack.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Police Raids&lt;/h3&gt;&lt;div&gt;Enforcer - choose the one that is under the Wall category, e.g. Tony or El Cortardo.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Gear up the Enforcer - maximise the biker gear.&lt;/div&gt;&lt;div&gt;Jewels - biker attack and biker defence, wall defence and trap attack&lt;/div&gt;&lt;div&gt;Crew Defense buff - enable this under the Combat buffs&lt;/div&gt;&lt;div&gt;Specialties - normal or Governor - should be all Biker and Crew Def/HP&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Reinforce vs Station&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;Station - will be based on our stats. We can also station our Underboss on the other Turf, but if the battle is lost, then we will lose the UB too.&lt;/div&gt;&lt;div&gt;Reinforce - based on the stats of the other player.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Construction&lt;/h2&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Workshop&lt;/h3&gt;&lt;div&gt;Workshop has links to Set, Armory, Jewels&lt;/div&gt;&lt;div&gt;Materials needed for workshop items can be obtained from Kingpins. Click on Item -&amp;gt; Upgrade -&amp;gt; Select Missing Material -&amp;gt; Method of obtaining&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Buildings:&lt;/div&gt;&lt;div&gt;Wall &amp;lt;- Workshop &amp;lt;- Smelter&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Training vs Hospital vs Diamond Production&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For miniH:&lt;/div&gt;&lt;div&gt;To train T4 bikers takes 6 days 18hr, 240,000 influence Hll events&lt;/div&gt;&lt;div&gt;Given that stats are:&lt;/div&gt;&lt;div&gt;2 training, 2 diamonds&lt;/div&gt;&lt;div&gt;total associates 1.993m&lt;/div&gt;&lt;div&gt;hourly upkeep 5.053m&lt;/div&gt;&lt;div&gt;training speed bonus 229.3%&lt;/div&gt;&lt;div&gt;training time -69.63%&lt;/div&gt;&lt;div&gt;associates/session 15,747&lt;/div&gt;&lt;div&gt;---&lt;/div&gt;&lt;div&gt;hospital capacity: 566/791,764&amp;nbsp; 318.8%&amp;nbsp; 566&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Robbery&lt;/h2&gt;&lt;div&gt;Clothing to increase speed: electric gun, builder&#39;s shirt/boots, investor&#39;s trouser/dagger&lt;/div&gt;&lt;div&gt;Clothing to increase load: investor&#39;s trouser/pistol, builder&#39;s shirt/shoes/shovel&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Robbing efficiency - Level 4 resources:&lt;/div&gt;&lt;div&gt;&lt;div&gt;Arms. 1.26m x 14 PTS / 126min = 0.14 pts/min&lt;/div&gt;&lt;div&gt;Metal 0.945m x 14 pts/ 96. min = 0.138 pts/min&lt;/div&gt;&lt;div&gt;Depot 1.26m x 14 pts/ 140mi. = 0.126 pts/min&lt;/div&gt;&lt;div&gt;Diamond&amp;nbsp; 0.4725 x25 pts / 82mins= 0.144 pts/min&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Enforcers&lt;/h2&gt;&lt;div&gt;&lt;div&gt;Specialties increase: when Exp level of Underboss is increased.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enforcers level up when: attacking kingpins, go on campaign&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Troops increase&lt;/div&gt;&lt;div&gt;- by Enforcer Rank increase&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Items&lt;/h2&gt;&lt;div&gt;Where to acquire the items that we need?&lt;/div&gt;&lt;div&gt;Go to Faction Shop -&amp;gt; Faction Shop to buy with coins.&lt;/div&gt;&lt;div&gt;Go to Faction Shop -&amp;gt; Broker to buy with gold.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The items are categorised in:&lt;/div&gt;&lt;div&gt;Premium: Direct/Random Relocator&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgH4tQyIP4aRjnVKwz4mZMTsIS5rGwPwfC3M6yNvZ-mZus1hk6XmORaSD4PUIkXDsdpCuiUR9qskpxUXhFf6YUNqZ5DDmQrkpD5aZUv8ekoqSM--Bk9KU72UPaMtzLF-j0nMVNKWp-zaYb2WoCh4locSOJmiexDa_vJNAR18VW0qPLzK5Y&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1466&quot; data-original-width=&quot;1065&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgH4tQyIP4aRjnVKwz4mZMTsIS5rGwPwfC3M6yNvZ-mZus1hk6XmORaSD4PUIkXDsdpCuiUR9qskpxUXhFf6YUNqZ5DDmQrkpD5aZUv8ekoqSM--Bk9KU72UPaMtzLF-j0nMVNKWp-zaYb2WoCh4locSOJmiexDa_vJNAR18VW0qPLzK5Y=w291-h400&quot; width=&quot;291&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;clear: both; text-align: justify;&quot;&gt;Kingpins&lt;/h2&gt;&lt;div&gt;&lt;div&gt;Experience&lt;span style=&quot;white-space: pre;&quot;&gt;				&lt;/span&gt;&lt;/div&gt;&lt;div&gt;DMG&amp;nbsp; &amp;nbsp; &amp;nbsp; L1&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;L2&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; L3&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; L4&lt;/div&gt;&lt;div&gt;1&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;819&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;1431&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;2304&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;3973&lt;/div&gt;&lt;div&gt;2&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1638&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;2862&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;4608&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;7946&lt;/div&gt;&lt;div&gt;3&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 2457&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;4293&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;6912&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;11919&lt;/div&gt;&lt;div&gt;4&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;  &lt;/span&gt;&lt;/span&gt;3276&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;5724&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;9216&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;15892&lt;/div&gt;&lt;div&gt;5&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;  &lt;/span&gt;&lt;/span&gt;4095&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;7155&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;11520&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;19865&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;				&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Governor&#39;s War Specialties&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&lt;/div&gt;&lt;div&gt;DMG&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;L1&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp;L2&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; L3&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; L4&lt;/div&gt;&lt;div&gt;1&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;492&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp;858&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1382&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;2383&lt;/div&gt;&lt;div&gt;2&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;984&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp;1716&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;2764&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;4766&lt;/div&gt;&lt;div&gt;3&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1476&amp;nbsp; 2574&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;4146&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;7149&lt;/div&gt;&lt;div&gt;4&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1968&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp;3432&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;5528&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;9532&lt;/div&gt;&lt;div&gt;5&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2460&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;nbsp;4290&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;6910&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;11915&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Please excuse the numbers above if the format is jumbled up. The first column is the DMG levels reading downwards. Across the columns are the 4 different levels.&lt;div&gt;The Levels L1-L4 are the levels of the Kingpins&lt;/div&gt;&lt;div&gt;The DMG is in the game, where if we have enough Energy, we can hit a L1 Kingpin with DMGx2 or DMGx3 etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The main question the table above tries to answer is: Should I hit on a L4 OR using the similar energy to hit a L1 by using DMGx4?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The answer from the table is hitting a L1 with DMGx2 or DMGx3 is better than hitting a single (DMGx1) L2 or L3. However, if you can hit L4, then it is better to hit 1 L4 Kingpin (Exp=3973) than hitting an L1 Kingpin using DMGx4 (Exp=3276).&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Governor&#39;s War&lt;/h2&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Events Sequence&lt;/h3&gt;&lt;div&gt;&lt;div&gt;Day1 : Robbery&lt;/div&gt;&lt;div&gt;Day2 : Street Sweep / Police Station - Kingpins, Action points, Police Stations, family currency/insignia&lt;/div&gt;&lt;div&gt;Day3 : Increase Influence - enforcer wheel, family currency/insignia&amp;nbsp;&lt;/div&gt;&lt;div&gt;Day4 : Speed Ups&lt;/div&gt;&lt;div&gt;Day5 : Kill Event / Massacre Day&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Battle&lt;/h2&gt;&lt;div&gt;L5 Police Station - Bruiser Square&lt;/div&gt;&lt;div&gt;T3: Bruisers 1.140m Hitmen 1.169m Bikers 0.588m Cars 0.151m&lt;/div&gt;&lt;div&gt;Our Side: Hitman Square&amp;nbsp; UB: Bruiser Mike. Call for Bruisers.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;T3: Bruisers 1&amp;nbsp; Hitmen 1&amp;nbsp; Bikers Max Cars 0&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enemy has:&lt;/div&gt;&lt;div&gt;&lt;div&gt;L5 Police Station - Bruiser Square&lt;/div&gt;&lt;div&gt;T3: Bruisers 1.064m Hitmen 1.144m Bikers 0.425m Cars 0.0m&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Our Side: Bruisers Square&amp;nbsp; UB: Biker Bubba. Call for Bikers.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;T3: Bruisers Mine Max&amp;nbsp; Hitmen 0&amp;nbsp; Bikers Others Max Cars 0&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;good win&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/2678584322579897600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/2678584322579897600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/2678584322579897600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/2678584322579897600'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2022/04/grand-mafia-strategy.html' title='Grand Mafia Strategy'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgH4tQyIP4aRjnVKwz4mZMTsIS5rGwPwfC3M6yNvZ-mZus1hk6XmORaSD4PUIkXDsdpCuiUR9qskpxUXhFf6YUNqZ5DDmQrkpD5aZUv8ekoqSM--Bk9KU72UPaMtzLF-j0nMVNKWp-zaYb2WoCh4locSOJmiexDa_vJNAR18VW0qPLzK5Y=s72-w291-h400-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-6395772068519752584</id><published>2022-03-30T05:43:00.006-07:00</published><updated>2024-03-08T06:15:44.658-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android 11"/><category scheme="http://www.blogger.com/atom/ns#" term="Forgot Password"/><category scheme="http://www.blogger.com/atom/ns#" term="Hidden SSID"/><category scheme="http://www.blogger.com/atom/ns#" term="Mac filtering"/><category scheme="http://www.blogger.com/atom/ns#" term="Missing Back button"/><category scheme="http://www.blogger.com/atom/ns#" term="Nokia 8.3"/><category scheme="http://www.blogger.com/atom/ns#" term="Recovery mode"/><category scheme="http://www.blogger.com/atom/ns#" term="Screenshot button missing"/><title type='text'>Notes Nokia 8.3 Android 11</title><content type='html'>&lt;div&gt;&lt;b&gt;&lt;span style=&quot;color: red; font-size: medium;&quot;&gt;DON&#39;T BUY - Mine got Overheated with no chance of recovery. Bad thermal design.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Recovery Mode&lt;/div&gt;&lt;div&gt;Forgot Password&lt;/div&gt;&lt;div&gt;Missing Back button&lt;/div&gt;&lt;div&gt;Wifi - Hidden and MAC address&lt;/div&gt;&lt;div&gt;Screenshot button missing&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This notes may apply to Anroid 11 mobiles in general, although the notes are based on my Nokia 8.3. This is because the Nokia 8.3 is running Android One, which is supposed to be an unaltered version of pure Android.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Recovery Mode&lt;/div&gt;&lt;div&gt;===============&lt;/div&gt;&lt;div&gt;To enter recovery mode:&lt;/div&gt;&lt;div&gt;- plug in USB-C cable&lt;/div&gt;&lt;div&gt;- turn off the phone&lt;/div&gt;&lt;div&gt;- Press Volume Down AND Power button and hold for a few seconds.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once in Recovery mode, the options are:&lt;/div&gt;&lt;div&gt;- START&lt;/div&gt;&lt;div&gt;- Restart Bootloader&lt;/div&gt;&lt;div&gt;- Recovery Mode&lt;/div&gt;&lt;div&gt;- Power Off&lt;/div&gt;&lt;div&gt;- Boot to FFBM&lt;/div&gt;&lt;div&gt;- Boot to QMMI&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Forgot Password&lt;/div&gt;&lt;div&gt;=================&lt;/div&gt;&lt;div&gt;This will WIPE ALL DATA&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Go to Recovery Mode as mentioned above.&lt;/div&gt;&lt;div&gt;- Select Recovery Mode. The Android logo is shown&lt;/div&gt;&lt;div&gt;- Unplug the cable&lt;/div&gt;&lt;div&gt;- Press the Power and the Volume Up key once&lt;/div&gt;&lt;div&gt;- The Recovery Mode menu will show many options&lt;/div&gt;&lt;div&gt;- Choose the Wipe Data / Factory Reset&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Missing Back button&lt;/div&gt;&lt;div&gt;====================&lt;/div&gt;&lt;div&gt;By default, Android 11 hides the 3 usual buttons, including the Back button.&lt;/div&gt;&lt;div&gt;To enable these 3 buttons on Nokia 8.3 Android 11:&lt;/div&gt;&lt;div&gt;- go to Settings -&amp;gt; Accessibility -&amp;gt; System Navigation&lt;/div&gt;&lt;div&gt;- Choose between:&lt;/div&gt;&lt;div&gt;Gesture Navigation&lt;/div&gt;&lt;div&gt;3 button Navigation (includes the Back, Home, Apps buttons)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wifi - Hidden and MAC address&lt;/div&gt;&lt;div&gt;================================&lt;/div&gt;&lt;div&gt;Two important items when connecting to a Wifi on the phone is:&lt;/div&gt;&lt;div&gt;- using a Hidden wifi network&lt;/div&gt;&lt;div&gt;- using the Device MAC address, NOT Randomized Mac.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately modern Android phone deliberately make these two security features very hard by HIDING the relevant settings.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On a totally new Android phone, with no SIM card, adding a Wifi network also seems to be a challenge. I forgot the exact details, but persevere and click through all possible options to add the first wifi network.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Before configuring the phone, ensure to&amp;nbsp;&lt;/div&gt;&lt;div&gt;i) change the network Wifi settings, to be it NOT HIDDEN temporarily.&lt;/div&gt;&lt;div&gt;ii) Add the MAC address of the phone&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then go into the phone and start Configuring:&lt;/div&gt;&lt;div&gt;- go to Settings -&amp;gt; Network and Internet -&amp;gt; Wifi&lt;/div&gt;&lt;div&gt;- Click Add Network at the bottom.&lt;/div&gt;&lt;div&gt;- Type in SSID, Security option eg WPA2, Password&lt;/div&gt;&lt;div&gt;- Click Advanced Options&lt;/div&gt;&lt;div&gt;--- In Hidden Network, change to &#39;Yes&#39;&lt;/div&gt;&lt;div&gt;--- In Privacy, change to &#39;Use device MAC&#39;&lt;/div&gt;&lt;div&gt;- Click Save and Connect.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Go back to network Wifi and change back to:&lt;/div&gt;&lt;div&gt;- Hidden Network enabled&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Screenshot button missing&amp;nbsp;&lt;/div&gt;&lt;div&gt;=============================&lt;/div&gt;&lt;div&gt;In previous Android or other handset, the screenshot features is available in two places:&lt;/div&gt;&lt;div&gt;1. Swiping down from the Top of the screen will reveal apps settings like WiFi connection, GPS, HotSpot, Bluetooth, etc, AND Screenshot.&lt;/div&gt;&lt;div&gt;2. Pressing the Power and Volume Down button, will trigger screenshot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However the above methods is no longer available in Nokia 8.3 running Android 11. It may also be the same for other mobile brands using Android 11.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Screenshot however is still available in a new spot. This applies to whether using 3-button navigation or Gesture navigation. To trigger Screenshot, simply go to the screen that shows the multiple background apps.&lt;/div&gt;&lt;div&gt;i) Using 3 button navigation, the Background Apps is available by pressing the Squre icon button. Then the words Screenshot will appear on the bottom.&lt;/div&gt;&lt;div&gt;ii) Using Gesture navigation, the Background Apps is available by Swiping upwards from the bottom of the screen. Then the words Screenshot will appear on the bottom.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I can imagine this is a very smart and intuitive location, even though it is very annoying if we got used to the previous methods. It is intuitive because the Screenshot is taken for the whole screen. What better location than to put the Screenshot at the Background Apps area, where we can scroll through different Background Apps to take screenshot for.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;NOTE: The word background does not mean wallpaper background. It means the multiple apps that we open, but it is hidden by the recent app. So these background apps are the ones still running but not on the front screen.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/6395772068519752584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/6395772068519752584' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/6395772068519752584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/6395772068519752584'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2022/03/notes-nokia-83-android-11.html' title='Notes Nokia 8.3 Android 11'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-7386819763904548646</id><published>2022-01-31T18:02:00.003-08:00</published><updated>2022-01-31T18:04:33.370-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Backup and Sync"/><category scheme="http://www.blogger.com/atom/ns#" term="Cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="file storage"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Drive Desktop"/><title type='text'>Google Drive Desktop - Different modes of Syncing and Offline</title><content type='html'>&lt;p&gt;&amp;nbsp;A bit of background&amp;nbsp;first on Google Drive:&lt;/p&gt;&lt;div&gt;Google Drive have been in existence over many&amp;nbsp;years. It&#39;s basically an online, browser based, file storage where you can drag-n-drop any files from your computer onto the webpage of Google Drive. Then there are specific Google office apps which are equivalents to Microsoft Office such as:&lt;/div&gt;&lt;div&gt;Docs (like Word)&lt;/div&gt;&lt;div&gt;Sheets (like Excel)&lt;/div&gt;&lt;div&gt;Slides (like Powerpoint)&lt;/div&gt;&lt;div&gt;.... and even better new apps like: Forms, Drawings, etc&lt;/div&gt;&lt;div&gt;Basically Google Drive allow you to have a file system / file storage plus working on some of those files online from a browser webpage.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Google Sync&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;Then came the little technology that allows us to install a component on our computer, which then automatically syncs between Google Drive and our computer. This means that we see the Google Drive files and folders on our computer, through File Explorer - as if those Google Drive files are on our computer.&amp;nbsp;&lt;/div&gt;&lt;div&gt;The reason for this blog is that the Google Sync technology has undergone a few iterations with new names and so creating some amount of confusion. Every few years coming back to this technology again, the name has changed. I may be mistaken, but I roughly remembered the earlier name as Google Sync -&amp;gt; then it became Backup and Sync -&amp;gt; now it became &quot;Google Drive Desktop&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Google Drive Desktop&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;This post is about the new syncing technology called Google Drive Desktop (now that we are sort of clear on the history) and we won&#39;t mention the previous products from this point on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Installation&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;Simply open your favourite browser and search engine and type: Google Drive Desktop&lt;/div&gt;&lt;div&gt;Then click on the results as shown below.&lt;/div&gt;&lt;div&gt;&lt;img alt=&quot;image.png&quot; class=&quot;CToWUd a6T&quot; data-image-whitelisted=&quot;&quot; height=&quot;492&quot; src=&quot;https://mail.google.com/mail/u/5?ui=2&amp;amp;ik=6ac5c23e9e&amp;amp;attid=0.1&amp;amp;permmsgid=msg-f:1723518957736140334&amp;amp;th=17eb2b5c47839e2e&amp;amp;view=fimg&amp;amp;fur=ip&amp;amp;sz=s0-l75-ft&amp;amp;attbid=ANGjdJ-4q40VpA2oSSu_ViDif3ZZ5oZQ3580p5x2QeEZb8H0754KSRsZEvG54amOw5MAqsgPvApWyq8ABWE7en6mo18ww3xn0ReKypc3IPRns4UvA_tJ6PZFULn65wo&amp;amp;disp=emb&amp;amp;realattid=ii_kz3e3fwn0&quot; style=&quot;cursor: pointer; outline: 0px;&quot; tabindex=&quot;0&quot; width=&quot;542&quot; /&gt;&lt;span style=&quot;color: #888888;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit; font-size: medium;&quot;&gt;Installation Problems&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;It is worth&amp;nbsp;mentioning a few of the installation problems I encountered which does not seem to have a specific or logical solution - but I managed to solve it and will share it here.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;The problem occurs after installing the Google Drive Desktop, the little icon in the taskbar is visible but nothing much else. There is a button or link to prompt us to sign in to our Google account or sign in to Google using the web browser or various other ways to prompt us to sign in to Google. But after signing in, still there are no options in the Google Drive Desktop taskbar icon except to sign-in. So I encountered this loop where I keep signing in and there are no results after that. Right click on the taskbar icon and select Preferences, and a window seems to pop up and disappear immediately. There is also a new icon on the desktop itself, and that also prompts us to sign-in, again repeated sign-in had no results.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;You may also see the &#39;Success!&#39; message below after each sign-in attempt, but we may still get nowhere, i.e the Google Drive files is still not showing in our local computer.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;&quot;&gt;&lt;img alt=&quot;image.png&quot; class=&quot;CToWUd a6T&quot; data-image-whitelisted=&quot;&quot; height=&quot;243&quot; src=&quot;https://mail.google.com/mail/u/5?ui=2&amp;amp;ik=6ac5c23e9e&amp;amp;attid=0.4&amp;amp;permmsgid=msg-f:1723523506691751595&amp;amp;th=17eb2f7f6a65beab&amp;amp;view=fimg&amp;amp;fur=ip&amp;amp;sz=s0-l75-ft&amp;amp;attbid=ANGjdJ-HNpwzM8ozybX-p1M92p1gBipIKlt684Vm_tsEfhVt3CgA-qrPWp7Xfv_TbqEoS70hIymogD-DNOMSwlD1R7Ex0Ei56oASvNjfWeCjkzFlK_7uroVTR2761FI&amp;amp;disp=emb&amp;amp;realattid=ii_kz3g5lkb3&quot; style=&quot;cursor: pointer; outline: 0px;&quot; tabindex=&quot;0&quot; width=&quot;350&quot; /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Here are a few things&amp;nbsp;I tried that may in combination provided the solution:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;- Restart your computer, perhaps do this two or three times.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;- Definitely try signing in two or three or more times after each step.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;- When there is an opportunity to sign-out, then completely sign-out of any Google accounts.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;- Finally when there is an option to &#39;Disconnect&#39; from Google Drive, then click Disconnect (this may appear in a smaller window)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Summary - keep on trying various things to sign-out, disconnect etc and signing in again until it works.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 style=&quot;background-color: white; color: #222222; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: inherit; font-size: medium;&quot;&gt;Installation Working&lt;/span&gt;&lt;/h2&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;When the installation is successful, then in Windows File Explorer, it should show the Google Drive like this:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img alt=&quot;image.png&quot; class=&quot;CToWUd&quot; data-image-whitelisted=&quot;&quot; height=&quot;79&quot; src=&quot;https://mail.google.com/mail/u/5?ui=2&amp;amp;ik=6ac5c23e9e&amp;amp;attid=0.2&amp;amp;permmsgid=msg-f:1723523506691751595&amp;amp;th=17eb2f7f6a65beab&amp;amp;view=fimg&amp;amp;fur=ip&amp;amp;sz=s0-l75-ft&amp;amp;attbid=ANGjdJ9we-o_gYIzyUaZ_fV56hP_-nbRGVFSFOfjrrYWEIZDPXnW5sLDp9ewaf1e3rR3LU0uTeepKbrwfdUVXgCA0GLN3T8XqGcutYvHoNonB0pg1xDIQ-8e6OtO1iQ&amp;amp;disp=emb&amp;amp;realattid=ii_kz3fe84a1&quot; width=&quot;235&quot; /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 style=&quot;background-color: white; color: #222222; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: inherit; font-size: medium;&quot;&gt;Syncing Warning&lt;/span&gt;&lt;/h2&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;1. By default all files in MyDrive on Google Drive will be synced and appears in File Explore on the local computer&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;2. Deleting a file on the local computer, e.g. through File Explorer, will ALSO delete the file in the cloud Google Drive.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;For my usage, I prefer NOT to sync everything between the Google Drive and my computer, so I prefer to choose which folders in Google Drive need to be synced to my computer.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;The next section will discuss more on how to configure the other modes of syncing, and not deleting the files on the cloud when the local file is deleted.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&quot;Set up offline access&quot; - Right-click on the file or folder you want to make available for offline use. Next, choose &quot;Available Offline&quot; under the &quot;offline access&quot; menu.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img alt=&quot;image.png&quot; class=&quot;CToWUd&quot; data-image-whitelisted=&quot;&quot; height=&quot;206&quot; src=&quot;https://mail.google.com/mail/u/5?ui=2&amp;amp;ik=6ac5c23e9e&amp;amp;attid=0.3&amp;amp;permmsgid=msg-f:1723523506691751595&amp;amp;th=17eb2f7f6a65beab&amp;amp;view=fimg&amp;amp;fur=ip&amp;amp;sz=s0-l75-ft&amp;amp;attbid=ANGjdJ-lfCDt_GWDgjTBhpsN1718X_k_iWG6mYXTzKU5zmklQNvyUJ2FX7CfCXk1RwW0Z0BHK3psscyCCRLuNWjGyPTcOY5WM32S7f-Z43DCEoVZ-ipG9XihGwXUTEE&amp;amp;disp=emb&amp;amp;realattid=ii_kz3fmiue2&quot; width=&quot;299&quot; /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 style=&quot;background-color: white; color: #222222; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: inherit; font-size: medium;&quot;&gt;Syncing with Offline access&lt;/span&gt;&lt;/h2&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Several modes are described here:&amp;nbsp;&amp;nbsp;&lt;a data-saferedirecturl=&quot;https://www.google.com/url?q=https://support.google.com/a/users/answer/9308619&amp;amp;source=gmail&amp;amp;ust=1643766882603000&amp;amp;usg=AOvVaw2CH4WwPDoO8ZN54t-QIvus&quot; href=&quot;https://support.google.com/a/users/answer/9308619&quot; style=&quot;color: #1155cc;&quot; target=&quot;_blank&quot; wotdonut=&quot;true&quot;&gt;https://support.google.com/a/&lt;wbr&gt;&lt;/wbr&gt;users/answer/9308619&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Essentially with the offline access mode, we can work on the documents while temporarily not having internet connection. For example, this could be on a flight, in a park, in a coffee shop where we don&#39;t trust their public wifi, etc.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;1. Working with non-Google files (ie not Docs, not Sheets, etc)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Assuming Google Drive for Desktop is installed, open the&amp;nbsp;Google Drive folder. Select the file or folder to be accessed offline. Right-click on it, and select Drive File Streama and then Available offline.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;2. Working with Google files (eg. Docs, Sheets, etc)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Install the Google Docs Offline extension.&amp;nbsp;In Drive, click Settings, thenSettings.&lt;br /&gt;Go to the Offline section, check the Create, open and edit your recent Google Docs, Sheets, and Slides files on this device while offline.&lt;br /&gt;Right-click a file and turn on Available offline.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;3. Working on mobile phones&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;On your mobile device, open the Google Docs, Sheets, or Slides app. Tap Menu and thenSettings. Turn on Make recent files available offline.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 style=&quot;background-color: white; color: #222222; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: inherit; font-size: medium;&quot;&gt;Syncing Mode Preferences&lt;/span&gt;&lt;/h2&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;As shown below, there are at least 3 different syncing modes. To come to these options, right click on the Google Drive Desktop taskbar icon, then select Preferences.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img alt=&quot;image.png&quot; class=&quot;CToWUd a6T&quot; data-image-whitelisted=&quot;&quot; height=&quot;406&quot; src=&quot;https://mail.google.com/mail/u/5?ui=2&amp;amp;ik=6ac5c23e9e&amp;amp;attid=0.5&amp;amp;permmsgid=msg-f:1723523506691751595&amp;amp;th=17eb2f7f6a65beab&amp;amp;view=fimg&amp;amp;fur=ip&amp;amp;sz=s0-l75-ft&amp;amp;attbid=ANGjdJ80mx56bXaudmg4n4PYj5_HhVNtjNjczUhFsoANwe8ui1Bts38V8cVCbzxqqS_bOQEZ7GpEqcoJAea0BMMkamXGtmatla4xmQIKmxgPhVWrNNPXm39MKApMw_U&amp;amp;disp=emb&amp;amp;realattid=ii_kz3g8u4q4&quot; style=&quot;cursor: pointer; outline: 0px;&quot; tabindex=&quot;0&quot; width=&quot;562&quot; /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img alt=&quot;image.png&quot; class=&quot;CToWUd a6T&quot; data-image-whitelisted=&quot;&quot; height=&quot;408&quot; src=&quot;https://mail.google.com/mail/u/5?ui=2&amp;amp;ik=6ac5c23e9e&amp;amp;attid=0.6&amp;amp;permmsgid=msg-f:1723523506691751595&amp;amp;th=17eb2f7f6a65beab&amp;amp;view=fimg&amp;amp;fur=ip&amp;amp;sz=s0-l75-ft&amp;amp;attbid=ANGjdJ86iRWVqXOxata1P_6ax7priQrolz_10sMbUMVENbl64F8iehfrYF9ezJG3ETNw3qR0nITD8P1vJC4kfXPSoLzDzVEyK-XjSNQdYHb5kpEhkoAO6R9bPFAG0yU&amp;amp;disp=emb&amp;amp;realattid=ii_kz3gg6f95&quot; style=&quot;background-color: white; color: #222222; cursor: pointer; outline: 0px;&quot; tabindex=&quot;0&quot; width=&quot;562&quot; /&gt;&lt;br style=&quot;background-color: white; color: #222222;&quot; /&gt;&lt;/span&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;1. Google Drive - My Drive - Stream files&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;The files are mostly in the cloud (not on our computer). But when we need to work on the files with no internet connection, we can make the files and folders available offline. See section above about working with offline files.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;2. Google Drive - My Drive - Mirror files&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;The files are stored both in the cloud of Google Drive and also on the local computer. The files on the local computer are available to work with, even when there is no internet. There is no extra steps to make these files to be offline, since there is always an offline or local copy already.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;3. My PC - This option allows us to select files or folders originally on our local computer already, to be stored / backed-up on the cloud. Click on the Add Folder button to select which existing local folders should be placed on the cloud.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;When everything is working, opening the taskbar icon for Google Drive Desktop should show something like this:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img alt=&quot;image.png&quot; class=&quot;CToWUd a6T&quot; data-image-whitelisted=&quot;&quot; height=&quot;447&quot; src=&quot;https://mail.google.com/mail/u/5?ui=2&amp;amp;ik=6ac5c23e9e&amp;amp;attid=0.7&amp;amp;permmsgid=msg-f:1723523506691751595&amp;amp;th=17eb2f7f6a65beab&amp;amp;view=fimg&amp;amp;fur=ip&amp;amp;sz=s0-l75-ft&amp;amp;attbid=ANGjdJ-bkOYZIb8wyW3hyR041bTC1BcBRWgbMtxSYZ9iI-D7wIVMQkqU6BVzYBRMDMz29EHRYlTwDCoqRrnjVeN5OYjX9_-D0Pl46tYFmG8X1hGsON3WUtiNNAf89nA&amp;amp;disp=emb&amp;amp;realattid=ii_kz3gobaj6&quot; style=&quot;cursor: pointer; outline: 0px;&quot; tabindex=&quot;0&quot; width=&quot;394&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;color: #888888;&quot;&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br style=&quot;background-color: white; font-family: Arial, Helvetica, sans-serif; font-size: small;&quot; /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/7386819763904548646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/7386819763904548646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/7386819763904548646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/7386819763904548646'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2022/01/google-drive-desktop-different-modes-of.html' title='Google Drive Desktop - Different modes of Syncing and Offline'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-1109756916982402547</id><published>2022-01-31T17:52:00.000-08:00</published><updated>2022-01-31T17:52:26.950-08:00</updated><title type='text'>Setting up a Secured Email Server</title><content type='html'>&lt;p&gt;&amp;nbsp;This article is Work In Progress....&lt;/p&gt;&lt;p&gt;There are lots of good info on the web about setting up email servers. So this article will start with some links to those sites.&lt;/p&gt;&lt;p&gt;References:&lt;/p&gt;&lt;p&gt;https://helpdeskgeek.com/how-to/how-to-set-up-your-own-email-server/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Mail Server - it looks like the most popular on is &#39;hmailserver&#39; - https://www.hmailserver.com/download/&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/1109756916982402547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/1109756916982402547' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/1109756916982402547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/1109756916982402547'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2022/01/setting-up-secured-email-server.html' title='Setting up a Secured Email Server'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-2182460363305147405</id><published>2022-01-05T06:07:00.003-08:00</published><updated>2022-01-24T06:19:37.246-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blockchain"/><category scheme="http://www.blogger.com/atom/ns#" term="cryptocurrency"/><category scheme="http://www.blogger.com/atom/ns#" term="Metaverse"/><title type='text'>Metaverse and the Bitcoin Blockchain CryptoCurrency</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;b&gt;Metaverse - What is it?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The metaverse has been around for a few decades in one way or another. However it is not until recently when Facebook chief - the Zuck - announced the new name Meta for his company that the Metaverse has come into heightened attention. Here are some definitions of the Metaverse typically found on Google search:&lt;/p&gt;&lt;p&gt;Wikipedia - &quot;A metaverse is a network of 3D virtual worlds focused on social connection. In futurism and science fiction, the term is often described as a hypothetical iteration of the Internet as a single, universal virtual world that is facilitated by the use of virtual and augmented reality headsets&quot;&lt;/p&gt;&lt;p&gt;Nvidia - &quot;The metaverse is a shared virtual 3D world, or worlds, that are interactive, immersive, and collaborative. Just as the physical universe is a collection of worlds that are connected in space, the metaverse can be thought of as a bunch of worlds, too. Massive online social games, like battle royale juggernaut Fortnite and user-created virtual worlds like Minecraft and Roblox, reflect some ...&quot;&lt;/p&gt;&lt;p&gt;Bybit - &quot;Living, working and playing in an alternate reality requires funding, and that means cryptocurrency. Just as there are several metaverses to use, there are also multiple cryptocurrencies. Understanding the options, differences, and pros and cons f each one can help you make the best investment decision for your needs.&lt;/p&gt;&lt;p&gt;When I first encountered the hype about the Metaverse, it sounded very much like Virtual Reality (VR) - which was the big thing touted in the late 80s and early 90s. VR has not really taken off in the big way, although there are definitely some tangible benefits realised. Things like pilot training simulators and immersive technology certainly have their niches. There could even be a revival in the form of Google Glasses and the Oculus devices. Thinking a bit deeper, VR is usually associated with the technology that allows the&amp;nbsp; 3D immersive experience. Although the implementation of the Metaverse is&amp;nbsp; also dependent on technology, the Metaverse is much more than about the 3D reality aspect - but it seems to encompass all aspects of the virtual world itself, including commerce, way of life and much more in this alternative metaverse.&lt;/p&gt;&lt;p&gt;The life and commercial aspect of the Metaverse is where cryptocurrency comes in. The quote by Bybit above says it precisely. What currency is better suited to a virtual meta world, then a virtual meta currency embodied by the cryptocurrency blockchain?&lt;/p&gt;&lt;p&gt;Here are some of the up and coming cryptocurrencies that may follow the development of the Metaverse:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;ALIEN WORLDS (TLM)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Atari Token (ATRI)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Bloktopia (BLOK) &lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Boson Protocol (BOSON)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;CEEK VR (CEEK) &lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Chromia (CHR)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;CryptoPlanes (CPAN)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;DEAPcoin (DEP)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Decentraland (MANA) &lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;inSure DeFi (SURE)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;IOTEX (IOTX) &lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;METAHERO (HERO)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;MINIGAME, &lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;MRE&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;METAL&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;NJF&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Polygon (MATIC) &lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Radio Caca (RACA)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;RMRK (RMRK)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Sandbox (SAND)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Solana (SOL)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;SQUID, &lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Starlink (STARL)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;TERRA VIRTUA KOLECT (TVK)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Theta Network (THETA)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Torum (XTM)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;UFO Gaming (UFO)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Verasity (VRA)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Victoria (VR)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Vulcan Forged (PYR)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;WAX (WAXP)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #202124; font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/2182460363305147405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/2182460363305147405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/2182460363305147405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/2182460363305147405'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2022/01/metaverse-and-bitcoin-blockchain.html' title='Metaverse and the Bitcoin Blockchain CryptoCurrency'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-8445476911900858492</id><published>2021-09-10T06:42:00.003-07:00</published><updated>2021-09-10T07:09:12.754-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DVB-T + DAB +FM - Software survey"/><title type='text'>DVB-T + DAB +FM - Software survey</title><content type='html'>&lt;p&gt;&amp;nbsp;Bought an el-cheapo Digital TV (DVB-T) USB stick which also has Digital Radio (DAB) and FM Radio - what more could I ask for?&lt;/p&gt;&lt;p&gt;Actually I would ask for an actual software to come with that. As with all things in Ebay, there is a reason why they are cheap. The advertisement itself shows nice and flashy TV pictures on a software. It&#39;s only in the fine print of the Package contents that says the software is a Trial Version. I did read that in the ad, but subconsciously put that aside. So now, I&#39;m left with a USB stick with drivers installed but nothing to play with. I don&#39;t think I want to touch Windows Media Center, though I guess that is an option to some people.&lt;/p&gt;&lt;p&gt;So the point of this post is to collect and comment of my research on the software that can work with the newly acquired DVB-T stick. Here goes..... (perhaps starting with the paid software, then saving the best free ones for last).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;DVB Viewer -&amp;nbsp;&lt;a href=&quot;http://www.dvbviewer.com/en/index.php?page=features&quot;&gt;http://www.dvbviewer.com/en/index.php?page=features&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Cost around 20Eu - which is not a bad price. However there are paid add-ons such as Media Server add-on and Video Editor add-on. On Screenshot pages shows it looks very professional. The Features pages is very comprehensive and also list a lot of TV cards that it supports. Unfortunately mine is a generic brand and I don&#39;t expect to find it on the list. The payment is by bank transfer and you put the description of the bank transfer as DVBViewer + email. So it feels quite old school and an independent developer (not a commercial company), and this is one of the positive point for me.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;AltDVB -&amp;nbsp;&lt;a href=&quot;https://www.videohelp.com/software/ALTDVB&quot;&gt;https://www.videohelp.com/software/ALTDVB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Looks like it is free and is under active development, since the last update at the time of writing is May 2021. It&#39;s meant to work with DVB-S (Satellite, meaning worldwide signals are available. The T in DVB-T stands for Terrestrial, meaning the local stations). It&#39;s 11Mb, its portable, and it has a whole list of Changelog and Release notes. It has its own YouTube subscription channel to explain how to use it.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ProgDVB -&amp;nbsp;&lt;a href=&quot;https://www.progdvb.com/progtva_download.html&quot;&gt;https://www.progdvb.com/progtva_download.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;There is a paid version with the title name and there is also a free version called ProgTV. The free version won&#39;t support recording and is around 11Mb. It&#39;s supposed to let you watch digital TV and listen to radio channels. The paid version supports IPTV, DVB-S/S2, DVB-C (cable) and more.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Media Portal -&amp;nbsp;&lt;a href=&quot;https://www.team-mediaportal.com/mediaportal/about-mediaportal&quot;&gt;https://www.team-mediaportal.com/mediaportal/about-mediaportal&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This looks like a very complete media center - a full fledged solution. So its ability to play DVB-(C/S/T) is almost drowned out by all the other features. Incredibly, it&#39;s not only free but it&#39;s open-source too. When it comes to popular software that non-technical people use and download, there is generally a risk of using Free software on the internet. However when a software is open source, like Media Portal, the risk is reduced because the source code is available for the world to see. (this is a general statement about truly open source software and it is not an assessment of the security and safety of using Media Portal). Only drawback is that some DAB (digital radio) functionality may not be fully supported yet.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/8445476911900858492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/8445476911900858492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/8445476911900858492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/8445476911900858492'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2021/09/dvb-t-dab-fm-software-survey.html' title='DVB-T + DAB +FM - Software survey'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-1325603778737048900</id><published>2021-07-09T19:00:00.008-07:00</published><updated>2021-07-09T23:18:22.414-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AMD FM2"/><category scheme="http://www.blogger.com/atom/ns#" term="Antec C40 CPU Cooler"/><category scheme="http://www.blogger.com/atom/ns#" term="copper pipes"/><category scheme="http://www.blogger.com/atom/ns#" term="heat pipe"/><category scheme="http://www.blogger.com/atom/ns#" term="heat sinks"/><title type='text'>Review - Antec C40 CPU Cooler</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;i&gt;Is a CPU Cooler really necessary? Is it all hype? Or does it actually work? Or will it be much better than the stock CPU coolers that come together with the original CPUs.&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;In this simple, unofficial review of the Antec C40 CPU Cooler, I hope to answer some of those questions from my experience with this product. Firstly, for all the official information, please go to the following sites, so I won&#39;t repeat the stats of the device in this post:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;a href=&quot;https://www.antec.com/product/cooling/c40&quot;&gt;https://www.antec.com/product/cooling/c40&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIvgEg9x7cX1oMBhn6fsw7uCPrFmLWNvsF3h5gwCzFt_MkLSo5fjcfTlQREp0JDtfe7cUOgRqQoJgB1HvSbeewF1nCP1lmusjd1cwsNTqVlyywHBSTF6V62rLX9daGYOvX01I/s1920/20210710_114514640.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1920&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIvgEg9x7cX1oMBhn6fsw7uCPrFmLWNvsF3h5gwCzFt_MkLSo5fjcfTlQREp0JDtfe7cUOgRqQoJgB1HvSbeewF1nCP1lmusjd1cwsNTqVlyywHBSTF6V62rLX9daGYOvX01I/w640-h360/20210710_114514640.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;(Apologies for not having a real photo of the actual cooler. I was too excited to install it before thinking about taking photos. The product link should have many photos of this product)&lt;/div&gt;&lt;h2 style=&quot;clear: both; text-align: justify;&quot;&gt;Why do I need a CPU cooler?&lt;/h2&gt;&lt;div&gt;My Windows PC has been turning-off by itself at irregular and unpredictable times. Sure most of the times it is because of Windows - and I am never shy of blaming Windows because most of the time it is Windows&#39; fault. I&#39;ve checked for drivers incompatibilities, new programs that may cause crashes, anti-virus/anti-malware, plugins misbehaving, Windows Update. But none of this were the reasons. Good for Windows that it is not the problem this time.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By the way, the effect is not really the PC &#39;crashing&#39;. What happens is that while working on the PC, the computer literally turns-off or powers-off, the same effect as if someone just pull out the power plug.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So this can only be two things:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Power Supply Unit&lt;/li&gt;&lt;li&gt;Overheating CPU (either motherboard or CPU triggers a shutdown to prevent damage)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;The Power Supply Unit problem will be very difficult to check. Perhaps qualified electricians can use a multimeter to check a few points (DO NOT TRY THIS). But most PC enthusiasts way of testing is to try a different Power Supply and see if the problem exist. In addition, this problem happens at totally different activities while working on the PC.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Although it looks random, the pattern of the auto turn-off problem emerges. It happens when the computer is left running for some time. It may also happen when doing heavy browsing. It feels more and more like a heat problem. But SpeedFan program says the temperature is between 45-60 degrees. This does not seem to be overly critical although it is high.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then one day I rebooted, when into BIOS and check the temperature from the BIOS stats, and it is &lt;b&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;80&#39;C degrees&lt;/span&gt;&lt;/b&gt;. Obviously SpeedFan is wrong! The PC is placed at a corner next to a tall filing cabinet, which I thought would have sufficient airflow since it is not tightly cramped, but apparently not. Bringing the PC out of the corner, and removing the side panel of the motherboard reduced the temperature to 60-70&#39;C degrees.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So definitely temperature is the most likely culprit. Although 60-70&#39;degrees may not cause the problem anymore, but I would need to place the PC back to its original position, hence I thought of purchasing another CPU Cooler to replace the stock standard CPU cooler that came with the original CPU.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;clear: both; text-align: justify;&quot;&gt;CPU Socket Type&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;My desktop PC is based on an AMD APU (CPU + graphics) of FM2 socket type. So I did a whole lot of research of price vs functionality of CPU coolers before selecting this. What I did not realise that was motherboard was FM2+ socket type until after the purchase. However it turns out to be fine since FM2/FM2+ are compatible not only in terms of the motherboard but also the Antec C40.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc56PhqkR4n7aHsHdHFrDuR5pUt3mpRDytYmsUkIj9QgCEPUX8h54Eu1fp09iWqrcBrFXld9cbFT2QjYM98eRg9uZ9bZMA04oSl36iO5VEYIQWLNE8LEab1efxUUn861_NROg/s1920/20210710_114536583.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1920&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc56PhqkR4n7aHsHdHFrDuR5pUt3mpRDytYmsUkIj9QgCEPUX8h54Eu1fp09iWqrcBrFXld9cbFT2QjYM98eRg9uZ9bZMA04oSl36iO5VEYIQWLNE8LEab1efxUUn861_NROg/w640-h360/20210710_114536583.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;In fact the Antec C40 is compatible against a variety of AMD CPUs(see product link above or specs in the images above), but it is also compatible with some types of Intel CPUs. For the Intel CPUs, Antec C40 provides an extra harness / frame to screw onto the motherboard (screws provided), on which to secure the CPU cooler. In addition, Antec C40 also comes with a thermal paste, which MUST be applied between the CPU and base of the cooler when installing it.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdIBYLEzdKHUVq_iR_mz3n4lDw9oNjaqmJxY1ZH58pWkH9A5ltjEC146rXnn_SkOA9YmdrqYWhxu0j3Zyt3EPA5d76HCuuQNNXyBfMO9649wOr9pztPwVYfLnfKTtUZW7-e18/s1353/20210710_142950199.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1353&quot; data-original-width=&quot;1078&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdIBYLEzdKHUVq_iR_mz3n4lDw9oNjaqmJxY1ZH58pWkH9A5ltjEC146rXnn_SkOA9YmdrqYWhxu0j3Zyt3EPA5d76HCuuQNNXyBfMO9649wOr9pztPwVYfLnfKTtUZW7-e18/w510-h640/20210710_142950199.jpg&quot; width=&quot;510&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;clear: both; text-align: justify;&quot;&gt;Product Selection&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;So apart from the price / functionality, why exactly did I choose this among the many other choices:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;ul&gt;&lt;li&gt;Antec seems to be a specialised brand when it comes to CPU cooling. Other brands which I seriously considered were Coolermaster and Thermaltake.&lt;/li&gt;&lt;li&gt;The Copper base was an important point for me.&lt;/li&gt;&lt;li&gt;The weight of the cooler - it is not the lightest but quite reasonable given the dimensions.&lt;/li&gt;&lt;li&gt;The cool factor from the blue LED lighting.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu-9FIxqUxJdtN0uO7VOdZCGnrZJ0ydJ1O3amPqTw0DvVS2beJm4lpH3rAmQEo5znsNSC1rewOaU4tpQfKFKOrpvaPW7wKVdZ5RTd_qH_tKflHur4Qihx_nYdv-MHyPLWlAH4/s1920/20210710_114557139.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1920&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu-9FIxqUxJdtN0uO7VOdZCGnrZJ0ydJ1O3amPqTw0DvVS2beJm4lpH3rAmQEo5znsNSC1rewOaU4tpQfKFKOrpvaPW7wKVdZ5RTd_qH_tKflHur4Qihx_nYdv-MHyPLWlAH4/w640-h360/20210710_114557139.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;b&gt;Installation&lt;/b&gt;&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;Before installation of the Antec C40, the original stock standard AMD CPU cooler fan has to be removed. These are the steps I follow - and I do not guarantee any safety&amp;nbsp; - please read other instructions or manuals before doing this.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;clear: both; text-align: justify;&quot;&gt;Uninstalling the AMD stock standard CPU cooler:&lt;/h3&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;ol&gt;&lt;li&gt;Switch of the PC and all connected equipment.&lt;/li&gt;&lt;li&gt;Unplug everything connected to the PC.&lt;/li&gt;&lt;li&gt;Open the CPU case and make sure you touch the metal from to unearth any static charge.&lt;/li&gt;&lt;li&gt;Reposition the CPU case in a comfortable position, with proper lighting, so it is easy to work with.&lt;/li&gt;&lt;li&gt;Gently move any wires aside.&lt;/li&gt;&lt;li&gt;Unlock by pressing the lever on one side of the AMD stock standard CPU cooler. This type of cooler is extremely easy to remove. Once unlock, gently and lightly tilt both ways to let the CPU cooler unhinge from the motherboard latches. NEVER EVER use force. If anything does not move, just tilt or change some other position.&lt;/li&gt;&lt;li&gt;As you lift up the old CPU cooler, you will see some old thermal paste on top of both the CPU and the base of the old CPU cooler. Clean the thermal paste on top of the AMD CPU by rolling the tip of a cotton butt on it.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgustPRqSpn4F3e4SxpWld17br8ppPrM9-4WgAMl3vrNnofzlIx1-SV6wJ8cr6AfQQpE7kLHqCPe04SAyY3P-v698ogJIIwOJAO-i3KXdXsUF8PU44jDbR3fdBlKQfsptjpdfY/s1920/20210702_223754379.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1920&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgustPRqSpn4F3e4SxpWld17br8ppPrM9-4WgAMl3vrNnofzlIx1-SV6wJ8cr6AfQQpE7kLHqCPe04SAyY3P-v698ogJIIwOJAO-i3KXdXsUF8PU44jDbR3fdBlKQfsptjpdfY/w640-h360/20210702_223754379.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;(Old AMD stock standard CPU. The best thing about this is the super easy way to install/remove due to the excellent lever design. The Antec C40 on the other hand is hard to clip on, and even harder to unclip to remove)&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Installing the new Antec C40&lt;/h3&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Unpack the Antec C40.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Ignore the screws and square harness. Those items are for Intel CPUs.&lt;/li&gt;&lt;li&gt;Test Run Only: Gently lower the Antec C40 on top of the AMD CPU. Practice to latch one side of the CPU Cooler onto the motherboard around the CPU - just to experience any challenges or difficulties. Get a feel of how difficult or easy it is to secure the latch but DON&#39;T do the actual attachment yet.&lt;/li&gt;&lt;li&gt;Use the thermal paste supplied by Antec and squeeze a light amount on top of the AMD CPU. Gently spread the paste with the thermal paste tip, then use a small flat thin cardboard to evenly spread the paste on the CPU.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Get the Antec C40 cooler AND REMOVE THE THIN FILM from the base of the C40 cooler.&lt;/li&gt;&lt;li&gt;Lower the C40 down on top of the AMD CPU. In my case, lowering the side opposite to the latch until it hooks onto the CPU edge was actually quite easy - to this at an angle.&lt;/li&gt;&lt;li&gt;When one side is latched, then very very gently tilt the CPU cooler to be horizontal, to latch on the other side, in order to clip it on. This is the hardest part. You need to apply force, but applying too much force may damage the CPU.&lt;/li&gt;&lt;li&gt;When securely attached, close the PC case, attach the PC components again, restart the PC and go to BIOS screen.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Problem Solved&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYL5qhifPfxe8VK4lY2HFcUBB2J-n8tvr96T5l8-LA0rScRdDX3gteauJUXhPQTj_6nzNV02B2jBjXpwicubGQ4J-0eCYnMyTp857wUOD_eF1A1OpWe233Yy-mDdp0kb70UxM/s1920/20210703_004937663.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1920&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYL5qhifPfxe8VK4lY2HFcUBB2J-n8tvr96T5l8-LA0rScRdDX3gteauJUXhPQTj_6nzNV02B2jBjXpwicubGQ4J-0eCYnMyTp857wUOD_eF1A1OpWe233Yy-mDdp0kb70UxM/w640-h360/20210703_004937663.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;i&gt;Is a CPU Cooler really necessary? Is it all hype? Or does it actually work? Or will it be much better than the stock CPU coolers that come together with the original CPUs.&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;YES, it is necessary. No it is not hype. Yes it does work. Yes, it is definitely better than the AMD Stock Standard CPU Cooler.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;Actually the first time I installed it, the BIOS showed 80&#39;C degrees. That was totally unexpected. At least if it was like 60-70&#39;C degrees, that would be similar to the old AMD CPU cooler - that would be understandable. But why would the new Antec C40 produces 80&#39;C degrees when first installed. After checking this and that, with the PC case still open, there seems to be&amp;nbsp; a shiny border between the CPU and the base of the CPU Cooler. Then the shocking realisation that I actually forgotten to remove the thin film packaging on the C40 cooler&#39;s base as described in step 4 above.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;So after uninstalling the new C40 cooler (uninstalling is even more difficult&amp;nbsp; when trying to unclip the new C40 cooler), remove the thin file at the base of the cooler, then reinstall everything again,&amp;nbsp; the PC was rebooted. Now the very good surprise was that the temperature is hitting about &lt;b&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;40&#39;C degrees &lt;/span&gt;&lt;/b&gt;only. What&#39;s more when I place my hand near the CPU cooler fan, it is actually cool air, instead of the hot air I previously felt.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;When Windows was restarted, running many applications, browsers, etc to test, the temperature was much lower than with the previous old AMD cooler (actual numbers given by SpeedFan were wrong in absolute terms, but the temperature readings are significantly lower with the new Antec C40 cooler). So the conclusion, at least on my particular AMD FM2 system, the Antec C40 cooler definitely show a dramatic reduction in CPU temperature and the PC does not switch off by itself anymore.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;Below image shows the Antec C40 in all its glory (PC case is open)&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz3lSIMekdyAAlUTzFcOX5KKVWT8rf3DrLbSYDxsGFQf74diPqGnxHrivH9-GeuJYcCTsRCOcYGPPzlI5NJ-59GUvxWGKJmx0nGqacuBKW6hrrBkrfDAHLVSjjOWRjtVFQ3EY/s1920/20210702_223350546.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1920&quot; data-original-width=&quot;1080&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz3lSIMekdyAAlUTzFcOX5KKVWT8rf3DrLbSYDxsGFQf74diPqGnxHrivH9-GeuJYcCTsRCOcYGPPzlI5NJ-59GUvxWGKJmx0nGqacuBKW6hrrBkrfDAHLVSjjOWRjtVFQ3EY/w360-h640/20210702_223350546.jpg&quot; width=&quot;360&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/1325603778737048900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/1325603778737048900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/1325603778737048900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/1325603778737048900'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2021/07/review-antec-c40-cpu-cooler.html' title='Review - Antec C40 CPU Cooler'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIvgEg9x7cX1oMBhn6fsw7uCPrFmLWNvsF3h5gwCzFt_MkLSo5fjcfTlQREp0JDtfe7cUOgRqQoJgB1HvSbeewF1nCP1lmusjd1cwsNTqVlyywHBSTF6V62rLX9daGYOvX01I/s72-w640-h360-c/20210710_114514640.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-7553554189619889114</id><published>2021-05-14T07:30:00.007-07:00</published><updated>2021-05-14T07:30:56.742-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="code snippet"/><category scheme="http://www.blogger.com/atom/ns#" term="coggle"/><category scheme="http://www.blogger.com/atom/ns#" term="figma"/><category scheme="http://www.blogger.com/atom/ns#" term="ideaone"/><category scheme="http://www.blogger.com/atom/ns#" term="mindmap"/><category scheme="http://www.blogger.com/atom/ns#" term="online development tools"/><category scheme="http://www.blogger.com/atom/ns#" term="prototyping"/><category scheme="http://www.blogger.com/atom/ns#" term="sqldbm"/><title type='text'>Online Development Tools</title><content type='html'>&lt;p&gt;&amp;nbsp;This post is a collection of useful tools for the programmer. The list will be updated as necessary:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://gist.github.com/discover&quot;&gt;https://gist.github.com/discover&lt;/a&gt; - Gist is a way to share codes and snippets with others. Every Gists are individual git repository and this is forkable and usable.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://ideone.com/&quot;&gt;https://ideone.com/&lt;/a&gt;&amp;nbsp;-&amp;nbsp;No need for any tools or installing compiler and editors. Ideone is capable to compile over 60 programming languages.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sqldbm.com/Home/&quot;&gt;https://sqldbm.com/Home/&lt;/a&gt;&amp;nbsp;-&amp;nbsp; go to the website and start building your database. Supported database types&lt;/p&gt;&lt;p&gt;SQL server&lt;/p&gt;&lt;p&gt;MySQL&lt;/p&gt;&lt;p&gt;PostgreSQL&lt;/p&gt;&lt;p&gt;Another main facility here is work with the term in a collaboration. Developers can work remotely on a single project through this platform.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.figma.com/&quot;&gt;https://www.figma.com/&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Figma is a prototyping tool. Just go to the web and start building your design and save online.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://coggle.it/&quot;&gt;https://coggle.it/&lt;/a&gt;&amp;nbsp;-&amp;nbsp;This is a mind mapping application also applicable for structured documents like document trees.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/7553554189619889114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/7553554189619889114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/7553554189619889114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/7553554189619889114'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2021/05/online-development-tools.html' title='Online Development Tools'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-7919983721378156723</id><published>2021-04-23T21:24:00.001-07:00</published><updated>2021-04-23T21:25:16.302-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ANN"/><category scheme="http://www.blogger.com/atom/ns#" term="Bias"/><category scheme="http://www.blogger.com/atom/ns#" term="Clustering"/><category scheme="http://www.blogger.com/atom/ns#" term="Decision Trees"/><category scheme="http://www.blogger.com/atom/ns#" term="Feature Selection"/><category scheme="http://www.blogger.com/atom/ns#" term="KNN"/><category scheme="http://www.blogger.com/atom/ns#" term="ML"/><category scheme="http://www.blogger.com/atom/ns#" term="Neural Networks"/><category scheme="http://www.blogger.com/atom/ns#" term="Regression"/><category scheme="http://www.blogger.com/atom/ns#" term="SVM"/><category scheme="http://www.blogger.com/atom/ns#" term="Variance"/><title type='text'>Review - Machine Learning For Absolute Beginners - Oliver Theobold</title><content type='html'>&lt;div style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Machine Learning For Absolute Beginners: A Plain English Introduction (Second Edition)&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;Oliver Theobald&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://amzn.to/3gvf2wB&quot;&gt;This book at Amazon&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ISBN-10 : 1549617214&lt;/p&gt;&lt;p&gt;ISBN-13 : 978-1549617218&lt;/p&gt;&lt;p&gt;There is a wealth of information out there on the subject of Machine Learning (ML) especially over the last 10 years. There are books with catch-phrase titles but lacking in substance. Conversely there are books which dwell too deeply into certain kinds of programming framework for ML (nothing wrong with that). For a data scientist, there are not many books out there which cover a broad spectrum of ML, yet with substance on each topic. &#39;Machine Learning for Absolute Beginners&#39; by Oliver Theobold seems to be one of these rare gems that covers ML broadly and capable of explaining important concepts without too much mathematics or code snippets. Despite the title, a seasoned data scientist may yet find this as a valuable reference.&lt;/p&gt;&lt;p&gt;Following a pleasant introduction to ML and an overview of a typical workflow, it discusses in detail the 3 classes of ML: Supervised, Unsupervised and Reinforcement Learning. It describes a special case of Reinforcement Learning known as Q-Learning. This is followed by a chapter on ML Toolbox where it discusses the data requirements, the infrastructure, the algorithms and the visualisation options that are available. Here it explores the various programming languages (Python, C, R, etc), the cloud platforms (Azure, AWS, Google) and the algorithm frameworks (Tensorflow, Caffe, Torch, etc).&lt;/p&gt;&lt;p&gt;The chapters on data preparation and feature selection covers a lot of the techniques as well as the motivation behind them. These include row and column compression, one hot encoding, binning, treatment of missing data, normalization and standardization. Partitioning of data and cross validation (k-fold) are discussed as the final stages of preparing the data before model training.&lt;/p&gt;&lt;p&gt;The next two chapters were devoted each to Regression and Clustering respectively. These are perhaps the two foundational families of algorithms which are also known outside the context of ML. The difference between Linear and Logistic regression conceptually and applicability to real scenarios were well illustrated. A very simple hand calculation shows how linear regression really works. Logistic regression is then explained by contrasting its usage with linear regression. Similarly the concepts and application for k-Nearest Neighbours and k-Means Clustering for supervised and unsupervised learning were well explained, including the reasonings behind the algorithms.&lt;/p&gt;

&lt;a href=&quot;https://www.amazon.com.au/gp/product/B07335JNW1/ref=as_li_tl?ie=UTF8&amp;amp;camp=247&amp;amp;creative=1211&amp;amp;creativeASIN=B07335JNW1&amp;amp;linkCode=as2&amp;amp;tag=amazpckingsfo-22&amp;amp;linkId=955c7006209e9232d9bbc1747337638e&quot; target=&quot;_blank&quot;&gt;Machine Learning For Absolute Beginners: A Plain English Introduction (Second Edition) (Machine Learning From Scratch Book 1)&lt;/a&gt;

&lt;p&gt;Bias and variance has a short chapter by itself and is enough to explain with sufficient details. Here is another example that brings this book above other ML books which just focus on coding. The understanding of the interplay between bias and variance, which is also emphasized in Andrew Ng&#39;s Machine Learning course, differentiates between a data scientist and an ML coder.&lt;/p&gt;&lt;p&gt;Next two chapters deal with the advanced algorithms Support Vector Machines (SVM) and Artificial Neural Networks (ANN). SVM is contrasted with Logistic regression, with explanation of the hyperplanes concept and the margins around the boundary for SVM. ANN concepts were explained from the basic components of neurons and activation functions, building up to the perceptron with mathematical examples for very simple cases. Multilayered Perceptron (MLP) and the various Deep Learning techniques were briefly discussed.&lt;/p&gt;&lt;p&gt;While ANN may be very effective in some cases, it is well known for its lack of explanability (except perhaps with recent developments in SHAP, ICE, LIME, etc). On the other hand Decision Trees has often been hailed for its high explainability nature. So a decent chapter is devoted to Decision Trees with simple mathematical calculations of entropy - which is key to decide on how to split the nodes of the tree. This is expanded to the advanced trees family including Boosting, Bagging and Random Forest and when to use them effectively. This is followed by a short chapter in Ensemble Modelling, where the Stacking method is also discussed.&lt;/p&gt;&lt;p&gt;The last three chapters, finally but rightly put, deals with introducing the development environment and the tool necessary for machine learning work. These include using the anaconda environent to program in the Python language and using the Panda library&#39;s dataframes. It also discusses the concept of model optimization and illustrated using the Grid Search technique. Towards the end there is a source code for a simple but complete Python code for an ML workflow, recommendation of other useful books, an Appendix on the introduction of Python but what I consider most useful is pointers to a few free datasets.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/7919983721378156723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/7919983721378156723' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/7919983721378156723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/7919983721378156723'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2021/04/review-machine-learning-for-absolute.html' title='Review - Machine Learning For Absolute Beginners - Oliver Theobold'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-1330247475908073798</id><published>2021-03-20T06:20:00.003-07:00</published><updated>2021-03-20T06:20:56.327-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CleanBrowsing"/><category scheme="http://www.blogger.com/atom/ns#" term="Cloudflare"/><category scheme="http://www.blogger.com/atom/ns#" term="DNS"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenDNS"/><category scheme="http://www.blogger.com/atom/ns#" term="Quad9"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="VPN"/><title type='text'>Help - Ping request could not find host ... DNS problem</title><content type='html'>&lt;p&gt;&amp;nbsp;You may have seen this message before:&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Ping request could not find host www.cnn.com. Please check the name and try again.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;There could be many things that can go wrong with the networking that caused this. Ultimately it is very likely the DNS that is the problem.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Firstly, let&#39;s simply go through a few troubleshooting options - just to rule out it is not because of the them. Do one step at a time, check the WiFi and if it works, don&#39;t need to progress to the next step.&lt;/p&gt;&lt;p&gt;1. For older laptops, believe it or not, there is actually a slider switch to click the WiFi on or off. Check this if you have it.&lt;/p&gt;&lt;p&gt;2. On Windows, on the TaskBar, ensure that the Wifi (not any particular Wifi network yet) itself is turn on. The WiFi can be either On or Off or Flight Mode or something else.&lt;/p&gt;&lt;p&gt;3. Check that the Wifi is connected to a particular WiFi network. Make sure it says Connected and Secured. And there is no yellow exclamation mark.&lt;/p&gt;&lt;p&gt;4. Open up CMD command terminal, type:&lt;/p&gt;&lt;p&gt;ipconfig&amp;nbsp; /release&amp;nbsp;&lt;/p&gt;&lt;p&gt;ipconfig /renew&lt;/p&gt;&lt;p&gt;ipconfig /flushdns&lt;/p&gt;&lt;p&gt;5. Reboot the computer.&lt;/p&gt;&lt;p&gt;If all else does not work, it is now time to suspect the DNS.&lt;/p&gt;&lt;p&gt;The DNS, in layman&#39;s term (you can Google for the exact definition), is directory service that lookup the URL you type and translate to an IP address. Its like a Post Office that receives an address and then go to that address. Our computer need to have the address of the DNS server itself - eg. we need the POST OFFICE&#39;s address, so that we can give them our letter.&lt;/p&gt;&lt;p&gt;The so somehow, our computer needs to know which DNS IP address to use. Most of the time, this is hidden from the user, that is why most computer user don&#39;t have to deal with it and so don&#39;t understand it. It can be automatically set on the modem or router, and also optionally automatically set on the Windows network settings.&lt;/p&gt;&lt;p&gt;So why should there be a problem when the DNS working nicely behind the scenes one day, then the internet is not working the next day? There could be many answers, but a recent experience has shown that some software, including VPN software can go it to the network settings and change the DNS address.&lt;/p&gt;&lt;p&gt;Hence one more solution to above error message is to change the DNS address on the Windows networking level. Whichever Windows version you have,&amp;nbsp;&lt;/p&gt;&lt;p&gt;- find your own way to the &#39;Network Connections&#39; page or &#39;Change Adapter Settings&#39; and you can see a page with a list of your network (ethernet, Wifi, VPN) adapters.&amp;nbsp;&lt;/p&gt;&lt;p&gt;- Right click on the Wifi adapter, if you are using the Wifi adapter.&lt;/p&gt;&lt;p&gt;- Choose &#39;Internet Protocol Version 4&#39;, and click on the Properties&lt;/p&gt;&lt;p&gt;- Go to the section called &#39;Use the following DNS server addresses&#39;, and add &#39;Preferred DNS&#39; and &#39;Alternative DNS&#39;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Some of the free DNS addresses are:&lt;/p&gt;&lt;p&gt;Quad9 - known for security&lt;/p&gt;&lt;p&gt;9.9.9.9, 149.112.112.112 (Secured)&lt;/p&gt;&lt;p&gt;9.9.9.10, 149.112.112.10 (Unsecured)&lt;/p&gt;&lt;p&gt;Google - you know them&lt;/p&gt;&lt;p&gt;8.8.8.8, 8.8.4.4&lt;/p&gt;&lt;p&gt;Cloudfare - known for speed&lt;/p&gt;&lt;p&gt;1.1.1.2, 1.0.0.2&lt;/p&gt;&lt;p&gt;OpenDNS - mature and known for security,&amp;nbsp;&lt;/p&gt;&lt;p&gt;208.67.222.222, 208.67.220.220&lt;/p&gt;&lt;p&gt;CleanBrowsing - known for parental filtering&lt;/p&gt;&lt;p&gt;185.228.168.168, 185.228.169.168&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/1330247475908073798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/1330247475908073798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/1330247475908073798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/1330247475908073798'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2021/03/help-ping-request-could-not-find-host.html' title='Help - Ping request could not find host ... DNS problem'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-4756827180492896494</id><published>2020-10-07T00:05:00.003-07:00</published><updated>2020-10-07T00:05:47.947-07:00</updated><title type='text'>Notes Crypto Coin (CRO)</title><content type='html'>Recently discovered ths exciting new crypto coin.

There are a few features:
- staking
- The Syndycate

https://www.securities.io/investing-in-crypto-com-cro-a-comprehensive-guide/
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/4756827180492896494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/4756827180492896494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/4756827180492896494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/4756827180492896494'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2020/10/notes-crypto-coin-cro.html' title='Notes Crypto Coin (CRO)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-681857811252596650</id><published>2020-09-12T19:26:00.004-07:00</published><updated>2020-09-12T20:59:54.415-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Landscape"/><category scheme="http://www.blogger.com/atom/ns#" term="linkedin"/><category scheme="http://www.blogger.com/atom/ns#" term="Messages"/><category scheme="http://www.blogger.com/atom/ns#" term="Portrait"/><category scheme="http://www.blogger.com/atom/ns#" term="Printing"/><category scheme="http://www.blogger.com/atom/ns#" term="Save As PDF"/><category scheme="http://www.blogger.com/atom/ns#" term="Scale"/><title type='text'>Notes LinkedIn</title><content type='html'>&lt;p&gt;&amp;nbsp;NotesLinkedIn&lt;/p&gt;&lt;p&gt;=================&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;How to Print Messages to PDF&lt;/p&gt;&lt;p&gt;How to Block someone without them knowing&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;How to Print Messages to PDF&lt;/p&gt;&lt;p&gt;================================&lt;/p&gt;&lt;p&gt;Printing to PDF is a very simple thing, or it should be. But by default, it seems very difficult to do to get the formatting just right. It is either cut off on the right hand (maybe we can change to Landscape). But then it only prints a little bit of the message on one page.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;How to we print the many items of a very long message conversation? The trick is as follows.&lt;/p&gt;&lt;p&gt;- Use Chrome Browser&lt;/p&gt;&lt;p&gt;- Click Messaging on the top horizontal panel.&lt;/p&gt;&lt;p&gt;- The main screen has a left panel of various people, and the middle panel has the main message history of a chosen person.&lt;/p&gt;&lt;p&gt;- On the left panel, click on the person whose message you want to print, and check that the correct message history is on the main panel.&lt;/p&gt;&lt;p&gt;- For privacy, if you want to hide the people on the left panel before printing, go to the left panel, click on the triple dots on top, and select &#39;Manage Inbox Request&#39;&lt;/p&gt;&lt;p&gt;- On the middle message panel, scroll up to see the start of the messages you want to print.&lt;/p&gt;&lt;p&gt;- Press Ctrl-P, choose Save as PDF.&lt;/p&gt;&lt;p&gt;- In the browser Print panel, Portrait was enough for my printing. But you can change to Landscape.&lt;/p&gt;&lt;p&gt;- In the browser Print panel, in Scale, choose a smaller number say 70% and try a few different numbers until the size and content of messages is OK for you.&lt;/p&gt;&lt;p&gt;- Then click Save. This will produce a PDF file.&lt;/p&gt;&lt;p&gt;- Open the PDF and print as usual.&lt;/p&gt;&lt;p&gt;The main step above is to choose the scaling to make sure it fits enough information of the messages you want to print.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;How to Block someoone without them knowing&lt;/p&gt;&lt;p&gt;============================================&lt;/p&gt;&lt;p&gt;No problem, LinkedIn does the block discreetly. It says:&lt;/p&gt;&lt;p&gt;&quot;The blocked member won&#39;t receive any notification of this action.&quot;&amp;nbsp;&lt;/p&gt;&lt;p&gt;in here: https://www.linkedin.com/help/linkedin/answer/47081&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The steps are very simple and listed on the link above.&lt;/p&gt;&lt;p&gt;Basically you have to go to that person&#39;s page, click on More, select Report/Block.&amp;nbsp;&lt;/p&gt;&lt;p&gt;When a few options are presented, click on the option that says &quot;Block [user name]&quot;. Then click Block.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Note: Blocking is different from Removing a Connection. With blocking it seems you are still connected but would not be able to see their profile, updates and cannot message them anymore.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To unblock is a bit different. Go back to your main page.&lt;/p&gt;&lt;p&gt;On top, click Me, click Settings and Privacy, click Block and Hiding, click Block and select Change. Then choose the person you want to block.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/681857811252596650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/681857811252596650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/681857811252596650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/681857811252596650'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2020/09/notes-linkedin.html' title='Notes LinkedIn'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-639331144482116710</id><published>2020-09-12T09:34:00.002-07:00</published><updated>2020-09-12T19:28:55.328-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CEO"/><category scheme="http://www.blogger.com/atom/ns#" term="fake profile"/><category scheme="http://www.blogger.com/atom/ns#" term="head-hunter"/><category scheme="http://www.blogger.com/atom/ns#" term="linkedin"/><category scheme="http://www.blogger.com/atom/ns#" term="scam"/><category scheme="http://www.blogger.com/atom/ns#" term="Social Engineering"/><category scheme="http://www.blogger.com/atom/ns#" term="Whaling"/><title type='text'>Whaling and Social Engineering by a LinkedIn Babe</title><content type='html'>&lt;p&gt;&amp;nbsp;On LinkedIn, I have been recently approached by a very professional seeming young lady. Have you had that experience? Then read on......&lt;/p&gt;&lt;p&gt;(Google Reviewers, please do read carefully before making any decision).&lt;/p&gt;&lt;p&gt;Firstly, I am a male, and I am susceptible to be very friendly with females who are friendly to me (I accept not all males feel the same). Female readers are very welcome to leave your comments, but please understand our weakness.&lt;/p&gt;&lt;p&gt;This article is about an experience which can potentially lead to severe security compromise for the victim, their relatives, friends, colleagues and employers. This article is about a potential account of a whaling or social engineering attempt.&lt;/p&gt;&lt;p&gt;There are various definitions of whaling or social engineering, but let&#39;s just use the definition below as an example (not that it is the 100% correct definition), so that we have a rough idea to proceed.&amp;nbsp;&lt;/p&gt;&lt;p&gt;https://searchsecurity.techtarget.com/definition/whaling&lt;/p&gt;&lt;p&gt;&quot;A whaling attack, also known as whaling phishing or a whaling phishing attack, is a specific type of phishing attack that targets high-profile employees, such as the CEO or CFO, in order to steal sensitive information from a company, as those that hold higher positions within the company typically have complete access to sensitive data. In many whaling phishing attacks, the attacker&#39;s goal is to manipulate the victim into authorizing high-value wire transfers to the attacker.&quot;&lt;/p&gt;&lt;p&gt;Guys, this paragraph is for you. It&#39;s not unusual I get unsolicited invites from LinkedIn. They include bearded guys whose name I cannot pronounce, I click Ignore. Nice looking gentlemen who are headhunters, maybe I accept or ignore. Various ladies who are headhunters, again I may accept or ignore. PhD or students of various types, I may accept if they have an interesting profile, otherwise I ignore. But I have never been invited by a babe-level (non-headhunter) who wanted to strike a conversation which is non-work / non-professional related - until now.....&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Initial invitation -&lt;/p&gt;&lt;p&gt;So this under 30s, corporate entreprenuer and executive professional who appears to be running a company, decide to invite me in LinkedIn. Let&#39;s call her LX from here. To be specific her LinkedIn profile photo is not babe-level, but instead very professional and very expensive looking high class lady. So the invitation is unusual in the sense of it being rare (I don&#39;t get invitations like this) but not enough to be suspicious initially - maybe her work or project made her see something in my professional background that may be interesting - after all this is what LinkedIn is about, thank you. On a personal level, she is also the same ethnic background as myself, so in this case, that increased my interest a little.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Interaction -&amp;nbsp;&lt;/p&gt;&lt;p&gt;The following is an account of the interaction and so far the interaction is still on going and there is no conclusion yet.&lt;/p&gt;&lt;p&gt;- After connection at LinkedIn, we started with well wishes and small conversations. Nothing unusual, but I&#39;m quite excited to have this interaction.&lt;/p&gt;&lt;p&gt;- Not long after, LX admits she does not use LinkedIn much, and asks if I use WhatsApp or WeChat. Immediately I too wanted to move off from LinkedIn and continue our conversation privately in a non-professional platform for chats.&amp;nbsp;&lt;/p&gt;&lt;p&gt;- On the Chat platform, the conversation continued. The conversations was very pleasant and non-committal. We started to talk about what each other is doing. From my personal view, I enjoyed this very much because it was refreshing to have a new friend who seemed to be very interested in my routine life. She was not nosy and not at all inquisitive of what I do. So no alarm bells there.&lt;/p&gt;&lt;p&gt;- I asked a few questions about her professional life, ie the business that she does. The questions were in the direction of trying to see if there is any synergies between my work and her work so there is more to talk about professionally, or help each other&#39;s business. Again this is quite standard in what LinkedIn is suppose to allow for.&lt;/p&gt;&lt;p&gt;- No business talk. However her response to work and business questions were polite and relevant, but usually ended quickly. For example, her company is multinational, and although they have offices in your country, she does not have direct dealings with your branch. This is quite plausible but adds or subtracts nothing in terms of evidence.&lt;/p&gt;&lt;p&gt;- How is your day? The conversation continues very politely and showing interest in daily life routine, such as how is your day, did you sleep well, have you eaten. These are all very nice and I&#39;m very touched to have this level of interest from someone else.&lt;/p&gt;&lt;p&gt;- Niiice photos - Without making any requests, she voluntarily send me photos of herself doing sports (in tight sports gear, calm down you guys) and also showing her at dinner. The dinner picture of her is sensational - very photogenic. So of course I want to continue the interaction more.&lt;/p&gt;&lt;p&gt;- We talked about music, food, weekend activities. So very nice indeed. She does not seem to care about my family background, education background, social status. I have no pressure to try to impress her simply because she seems to have everything. Wow I really like to meet her. Even if for a purely platonic relationship (guys, please!), she is so refreshing to interact with.&lt;/p&gt;&lt;p&gt;- The summary of the interaction is so far we have both kept it very friendly and have not demanded anything from each other at all. Hence no pressure and no expectations. Other males in this position may have taken a different direction and I don&#39;t really know how she would respnd. In any case, at this point there is no cause for alarm based on the interaction in the chat room.&lt;/p&gt;&lt;p&gt;Let&#39;s now go to the other side of thought.....&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Reality Check -&amp;nbsp;&lt;/p&gt;&lt;p&gt;1. Who am I that such a perfect lady (looks, wealth, charm, humour) would pay attention to me? An old saying goes &#39;Look at your own cat-face (literal translation from another culture)&#39;, &#39;Look at your own mug-shot&#39;, &#39;Have you looked in the mirror lately&#39;? This is one reality check that pulled me down to earth. Though not looking like Brad Pitt or George Clooney, etc, I do think I&#39;m not bad looking at times. But with double chin, and an average look, really? would a pretty and wealthy and successful young lady choose me out of millions of nicer looking guys out there? (If you answer yes, you don&#39;t deserve sympathy if you are taken for a ride).&lt;/p&gt;&lt;p&gt;2. &#39;If it is too good to be true, then it is not true&#39;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Countless people with higher intelligence than myself have fallen victims to scams. I&#39;m not qualified to give all the reasons why and how smart people get scammed, conned, tricked, but it happens all the time. To re-iterate many smart people fall for it. Simply put, when we see something is so good, and we really want it, then we will try to find all the reasons why this good thing can be true. It&#39;s not a matter of being optimistic that makes people vulnerable. Those who fall victim to scams, really do want the bait (money, pretty looking person, etc) - we all want something and sooner or later, there is scammer out there who would have the correct bait for us.&amp;nbsp;&lt;/p&gt;&lt;p&gt;3. Use logic not our senses - A Beutifual Mind.&lt;/p&gt;&lt;p&gt;Men have often been accused of thinking, not with their brain, but with the organ below. If looking in the mirror does not bring a reality check (coz You&#39;re So Vain), then remember the movie A Beutiful Mind about the Noble Prize winning mathematician and schizophrenic John Nash. Spolier Alert: Since his university days, he was seeing an imaginary little child. Through his many years of struggle with schizophrenia including hospitalization and medication, he still believed the child was real because he saw with his own eyes, and hear with his own ears. This super briliant mathematician knew he had schizophrenia but cannot deny the existence of the little child. However, the Reality Check came one day, when he realised (using simple logic), that he knew this child (seeing and talking with her) for many decades of his life but she did not grow old. This is the reality check that even all his physical senses tell him it is real, simple logic about humans and ageing brought him out of his delusion and so he accepted the little girl cannot be real.&lt;/p&gt;&lt;p&gt;OK - let&#39;s put our suspiscious cap on for a moment. (Remember, nothing in the interaction so far seems like she wants anything or has anything to offer, except friendship. Neither of us have spoken anything other than what two very familiar friends would speak about.)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Profile:&lt;/p&gt;&lt;p&gt;- Profile photo included whole person, so her face is quite small in the picture.&lt;/p&gt;&lt;p&gt;- LinkedIn people also viewed other ladies with profiles which are very suggestive, yet with high corporate titles.&lt;/p&gt;&lt;p&gt;- She has a 500+ followers. Nothing wrong with that by itself.&lt;/p&gt;&lt;p&gt;- She has a very important, high position title, but somehow the wording is not quite right.&amp;nbsp;&lt;/p&gt;&lt;p&gt;- Education and work experience profile is quite short. For a yound person, this is understandable. Two universities were listed. Three work experiences listed, the first is an internship. The third is the current very high and important sounding role.&lt;/p&gt;&lt;p&gt;None of these stand out too much by itself, but ordinarily I would not have accepted the Connect invitation with someone with a very brief education and work experience profile. So my confession is that I accepted because she was an interesting lady.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Suspicions - Putting on the tin-foil hat.&lt;/p&gt;&lt;p&gt;The conversations in the chat does not indicate she wanted anything from me, neither information nor resources. The LinkedIn profile described above is not unusual for each individual item, but collectively, they are starting to ring the alarm bells. From there, trying much harder to look through all the evidence, here is a list of suspicious items.&lt;/p&gt;&lt;p&gt;- In the interaction / chats, when I tried to talk about her business to stimulate her interest or passion in her work or business, her answers very soon changed the topic. It was not avoiding the question, but the answers were very plausible, but like &#39;now let&#39;s talk about something more interesting in your personal life&#39;&lt;/p&gt;&lt;p&gt;- She does not ask me about my work, except simply &#39;what I do at work&#39;. There is no attempt to extract any kind of work related information at all. In fact this almost lack of interest about my professional experience, considering we met at LinkedIn is a bit unsual I thought.&lt;/p&gt;&lt;p&gt;- She has so far send two photos. The photo in a sporting activity shows her in a tight exercise suit - revealing a nice body (sorry, I have say it as it attracted my attention). The one at dinner was very proper looking, showing such a cute and sweet face. But comparing these two photos with her LinkedIn profile photo and the chat app profile photo, I cannot say for sure that it is or it is not the same person. Each photo was taken either at a different angle, with different hair style and different pose, basically enough differences that it could still be the same person.&lt;/p&gt;&lt;p&gt;- Photos - another thing about the photos is that they are not selfies. So she always has someone with her, taking these nice photos of her, whether in an action during sports or at dinner for one, yet looking nice and framed properly in the photos. Who took these photos? Was she with someone? If there is someone, even a friend, why would she be chatting with me half way around the world instead of giving more attention to that person who is with her?&lt;/p&gt;&lt;p&gt;- Looking more closely at the education level in combination with the work experience. She attended two universities consecutively from 2011-2017. A brief internship was done. Then it appears her first job after the internship is CEO of a company (4 years ago until now) and and second job at the executive level from (3 years ago until now). So this is what I meant by a seemingly successful or wealthy young lady. Can this be true? Yes since her country is a place where rule-of-law is not always true, and important people (e.g. her father) has significant advantages. Or it could be a not-very-good fake profile.&lt;/p&gt;&lt;p&gt;- Looking at her LinkedIn connections, it is almost all males out of the first 8 pages with only one female who is another high-powered successful lady. All the males are CXO, C-level executives, directors, Heads of xyz, business leaders etc. Not even head-hunters has such high powered connections. Could all these male high-flying individuals be potential victims?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Why me? What for?&lt;/p&gt;&lt;p&gt;Although some alarm bells may start to tingle, most likely we may not know the reason until it is too late. Here are just a few very general reasons and there could be more.&lt;/p&gt;&lt;p&gt;https://www.smh.com.au/lifestyle/life-and-relationships/don-t-know-why-i-sent-more-sally-lost-her-entire-savings-to-a-love-scam-20200909-p55ttb.html&lt;/p&gt;&lt;p&gt;1. The article above is about old-fashioned scamminng involving romantic love, but the technology could be modern, like chat or video conferencing. The scammers are patient and build trust and love on the victims, then the objective of the scam is old-fashioned money.&lt;/p&gt;&lt;p&gt;2. For more modern whaling, the objective would be to target high level corporate leaders, or someone influential enough in an organisation, such as an IT Administrator. Then if the scammer can infect the devices of the victim, potentially everyone else in the victim&#39;s computer network (ie the office) could be vulnerable.&lt;/p&gt;&lt;p&gt;3. Social engineering - this may combined the old-fashioned charm and get-to-know-the-person-trick, then with the similar objective as whaling, by having the goal of being able to access information or computer systems of more high value targets in the organisation of the victim.&amp;nbsp;&lt;/p&gt;&lt;p&gt;I don&#39;t think I can fall in the romantic scam trick, but that is in fact what I could fall for. I don&#39;t have a high title in my company nor important role, but that does not mean I cannot be used to get to another person through me. Just because I don&#39;t know why, does not make me any less valuable to a scammer.&lt;/p&gt;&lt;p&gt;4. Here is another potential reason (I won&#39;t comment further)&lt;/p&gt;&lt;p&gt;https://www.asianage.com/world/americas/310818/china-using-fake-linkedin-accounts-to-recruit-americans-us-top-spy-catcher.html&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Checks&lt;/p&gt;&lt;p&gt;The suspicions above may or may not reflect the truth - and I still cannot be sure at this point.&lt;/p&gt;&lt;p&gt;However, a few things can be checked.&lt;/p&gt;&lt;p&gt;- Contact University? Alumni Lookup service?&lt;/p&gt;&lt;p&gt;- Check with a few others she has been in contact with.&lt;/p&gt;&lt;p&gt;- Check by calling the work company, maybe not directly, but approach with tact.&lt;/p&gt;&lt;p&gt;- Image check in the internet.&lt;/p&gt;&lt;p&gt;- Common scammer fake profiles search&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Update:&lt;/p&gt;&lt;p&gt;I just verified using reverse image search (&lt;a href=&quot;https://tineye.com/search/&quot;&gt;https://tineye.com/search/&lt;/a&gt;), that the chat app profile photo is taken from a young lady at a tourist website. The website has a lot of photos of the same lady and they are clearly recognizable as the same person. However, LX&#39;s various photo seem difficult to identify as the same person.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/639331144482116710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/639331144482116710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/639331144482116710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/639331144482116710'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2020/09/whaling-and-social-engineering-by.html' title='Whaling and Social Engineering by a LinkedIn Babe'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-6889419875779722953</id><published>2020-08-23T08:41:00.002-07:00</published><updated>2020-08-25T07:11:36.510-07:00</updated><title type='text'>Offline Browser, Proxy Server, Cache for viewing web pages without the Internet</title><content type='html'>&lt;p&gt;&amp;nbsp;The following is a work in progress to find a way to view web pages without the internet.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.howtogeek.com/263577/how-to-enable-offline-browsing-in-chrome/&quot;&gt;How to Enable Offline Browsing in Chrome&lt;/a&gt;&amp;nbsp;- an experimental feature within Chrome and like browsers.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.hongkiat.com/blog/windows-offline-browsers/&quot;&gt;https://www.hongkiat.com/blog/windows-offline-browsers/&lt;/a&gt;&amp;nbsp;- a good list of offline browsers&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://proxy-offline-browser.com/professional/Installation.html&quot;&gt;https://proxy-offline-browser.com/professional/Installation.html&lt;/a&gt;&amp;nbsp;- MM3 Web Assistant. This functions as a proxy and automatically saves the webpages that have been visited. However the free version does not handle HTTPS. The benefit is that users do not need to specify which sites to save specifically.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.httrack.com/&quot;&gt;HTTrack Website Copier&lt;/a&gt; - seems to be the best so far. Will test soon.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.cyotek.com/cyotek-webcopy&quot;&gt;WebCopy&lt;/a&gt; - similar to HTTrack but not JavaScript....&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Wiki for Offline browsing&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Download the linux version:&amp;nbsp;&lt;a href=&quot;http://xowa.org/home/wiki/Help/Download_XOWA.html&quot;&gt;http://xowa.org/home/wiki/Help/Download_XOWA.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;On Linux, open a terminal and run sh /home/Your_Name/xowa/xowa_linux.sh&lt;/li&gt;&lt;li&gt;Note that the shell script is a wrapper for java -Xmx256m -jar /home/Your_Name/xowa/xowa_linux.jar&lt;/li&gt;&lt;li&gt;Path of jar file /home/Your_Name/xowa/xowa_linux.jar&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Or when doing this from within docker&lt;/div&gt;&lt;div&gt;# on host of containers&lt;/div&gt;&lt;div&gt;docker run -it ....alpine&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# inside the container&lt;/div&gt;&lt;div&gt;apk add wget&lt;/div&gt;&lt;div&gt;wget&amp;nbsp;https://github.com/gnosygnu/xowa/releases/download/v4.6.5.1911/xowa_app_linux_64_v4.6.5.1911.zip&lt;/div&gt;&lt;div&gt;apk update&lt;/div&gt;&lt;div&gt;apk get openjdk11&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/6889419875779722953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/6889419875779722953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/6889419875779722953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/6889419875779722953'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2020/08/offline-browser-proxy-server-cache-for.html' title='Offline Browser, Proxy Server, Cache for viewing web pages without the Internet'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-349963346300492810</id><published>2020-08-21T15:59:00.009-07:00</published><updated>2020-08-24T17:58:13.723-07:00</updated><title type='text'>Notes Video Editing</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://au.oberlo.com/blog/best-free-video-editing-software&quot;&gt;https://au.oberlo.com/blog/best-free-video-editing-software&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I&#39;ll add comments to help narrow down even further for myself basically - but others may find it helpful too.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.blender.org/&quot;&gt;Blender &lt;/a&gt;- originally for 3D animation. I&#39;ve also heard about its not-so-easy to learn aspect, though it has lots of features. But I won&#39;t be trying this.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.lwks.com/&quot;&gt;Lightworks &lt;/a&gt;- the Free version has a limit of 720p. I&#39;ve used another converter to convert to 1280x720 and compare with the original and very common 1920x1080 size. The 720 one is noticeably fuzzier. So I won&#39;t be testing this further.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://shotcut.org/&quot;&gt;Shortcut&lt;/a&gt; -&amp;nbsp;&lt;/p&gt;&lt;p&gt;While the cut function seems OK, the Export is difficult to configure. Pressing the Export button does nothing. In one case when it did export, the file is more than twice the original.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.openshot.org/&quot;&gt;OpenShot&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;not really that straight-forward to use without using any help&lt;/li&gt;&lt;li&gt;Export to a lot of formats, but for some reason, the output is 10 times larger than the original. Why it doesn&#39;t use the exact compression level of the input?&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;a href=&quot;http://fixounet.free.fr/avidemux/&quot;&gt;Avidemux&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;BEST so far&lt;/li&gt;&lt;li&gt;Small footprint, about 80MB fully installed (according to the installation dialog)&lt;/li&gt;&lt;li&gt;Best Feature - COPY - this option in the video encoder format allows it to use exactly the same video format as the input. So if there are no edits being made, the new output is exactly the same size. This is very useful in comparison with other software above which, in most cases, result in an output which is larger than the input video file.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.kapwing.com/&quot;&gt;Kapwing &lt;/a&gt;Online Editor&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;limited to 7 minutes&amp;nbsp; clip for free version&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/349963346300492810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/349963346300492810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/349963346300492810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/349963346300492810'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2020/08/notes-video-editing.html' title='Notes Video Editing'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-7639858222548335432</id><published>2020-07-26T06:49:00.005-07:00</published><updated>2020-07-26T07:13:03.245-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Caffe2"/><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="cuDNN"/><category scheme="http://www.blogger.com/atom/ns#" term="GPU"/><category scheme="http://www.blogger.com/atom/ns#" term="keras"/><category scheme="http://www.blogger.com/atom/ns#" term="Machine Learning"/><category scheme="http://www.blogger.com/atom/ns#" term="RTX 2060"/><category scheme="http://www.blogger.com/atom/ns#" term="tensorflow"/><title type='text'>Tensorflow Deployment Requirements for Machine Learning / Neural Networks</title><content type='html'>This blog will be continuously updated.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Obviously from the title, out of the many Machine Learning (ML) framework, this post is about the Tensorflow (&lt;a href=&quot;https://www.tensorflow.org/&quot;&gt;https://www.tensorflow.org/&lt;/a&gt;) framework as oppose to other ML frameworks. As a quick reference, the other ML frameworks are:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Caffe2 -&amp;nbsp;&lt;a href=&quot;https://caffe2.ai/&quot;&gt;https://caffe2.ai/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;PyTorch -&amp;nbsp;&lt;a href=&quot;https://pytorch.org/&quot;&gt;https://pytorch.org/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PyTorch vs TensorFlow — spotting the difference&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://towardsdatascience.com/pytorch-vs-tensorflow-spotting-the-difference-25c75777377b&quot;&gt;https://towardsdatascience.com/pytorch-vs-tensorflow-spotting-the-difference-25c75777377b&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;TensorFlow vs Caffe -&amp;nbsp;&lt;a href=&quot;https://www.educba.com/tensorflow-vs-caffe/&quot;&gt;https://www.educba.com/tensorflow-vs-caffe/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Keypoints from this link is that Tensorflow is for the server whereas Caffe is for production edge deployment. Both support parallel computing but in a different way. Caffe needs to be installed by compiling from source, but Tensorflow is easier to deploy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The following has simple instructions on how the setup the Tensorflow environment.&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://towardsdatascience.com/setup-an-environment-for-machine-learning-and-deep-learning-with-anaconda-in-windows-5d7134a3db10&quot;&gt;https://towardsdatascience.com/setup-an-environment-for-machine-learning-and-deep-learning-with-anaconda-in-windows-5d7134a3db10&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://towardsdatascience.com/installing-tensorflow-with-cuda-cudnn-and-gpu-support-on-windows-10-60693e46e781&quot;&gt;https://towardsdatascience.com/installing-tensorflow-with-cuda-cudnn-and-gpu-support-on-windows-10-60693e46e781&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The articles in the link above are helpful in determining which software versions will work with other software versions. Please&amp;nbsp; note that the latest software version may not be compatible with other software it needs to work with.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Software Requirements:&amp;nbsp;&lt;/div&gt;&lt;div&gt;Python&lt;/div&gt;&lt;div&gt;CUDA toolkit&lt;/div&gt;&lt;div&gt;cuDNN&lt;/div&gt;&lt;div&gt;Tensorflow&lt;/div&gt;&lt;div&gt;Keras - Python Deep Learning API which works on top of Tensorflow&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hardware Requirements:&lt;/div&gt;&lt;div&gt;GPU is optional. However, when GPU is preferred, and specifically CUDA is preferred, then the GPU will be from NVIDIA.&lt;/div&gt;&lt;div&gt;In terms of laptops, there are broad classes of laptops referred to as Workstations and other are Gaming laptops. Workstations are generally more expensive. In a particular search, a Workstation laptop with Quadro T2000 GPU is clearly more expensive than a Gaming laptop with RTX 2060 GPU card. Yet benchmarks show that the RTX2060 performs much better than the Quadro T2000.&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;#&quot; id=&quot;CUDA Benchmarks&quot; name=&quot;CUDA Benchmarks&quot;&gt;https://browser.geekbench.com/cuda-benchmarks&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/7639858222548335432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/7639858222548335432' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/7639858222548335432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/7639858222548335432'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2020/07/tensorflow-deployment-requirements-for.html' title='Tensorflow Deployment Requirements for Machine Learning / Neural Networks'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-1757438622287928864</id><published>2020-06-22T06:52:00.002-07:00</published><updated>2020-06-22T07:01:23.900-07:00</updated><title type='text'>Unboxing - AIMOS HDMI KVM 2-port Switch</title><content type='html'>&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;270&quot; src=&quot;https://www.youtube.com/embed/SnocZBfHhWg&quot; width=&quot;480&quot;&gt;&lt;/iframe&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Below are some images of the manual&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUSt44bOkR6-U6AscCukjdGGHNYaX17ikz7PQyKq7G_2l5FxZ7ius6aET1LB9uQsDtBXc9DRLQzYzqh0z4JWMPdJFpmmBUC7d6tnkBZ0Dc4LQVV3sn0VJhJTIJc9gAfyP-HiU/s13671/AIMOS_HDMI_KVM_2port_01.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3950&quot; data-original-width=&quot;13671&quot; height=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUSt44bOkR6-U6AscCukjdGGHNYaX17ikz7PQyKq7G_2l5FxZ7ius6aET1LB9uQsDtBXc9DRLQzYzqh0z4JWMPdJFpmmBUC7d6tnkBZ0Dc4LQVV3sn0VJhJTIJc9gAfyP-HiU/w781-h225/AIMOS_HDMI_KVM_2port_01.jpg&quot; width=&quot;781&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Chinese&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI4lyJicfY1K8luj2H4lfX76PA7NGX7mt_cicXzXSUFVtdfGzjVC6vsHJqWtIfukm5HnwZWJ8A5nlWEgoADlqofiOBKcfp9WL5v9zgn1wYNCCAIo8_K-NNrCaF5to26oLbaX4/s13671/AIMOS_HDMI_KVM_2port_02.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3950&quot; data-original-width=&quot;13671&quot; height=&quot;231&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI4lyJicfY1K8luj2H4lfX76PA7NGX7mt_cicXzXSUFVtdfGzjVC6vsHJqWtIfukm5HnwZWJ8A5nlWEgoADlqofiOBKcfp9WL5v9zgn1wYNCCAIo8_K-NNrCaF5to26oLbaX4/w800-h231/AIMOS_HDMI_KVM_2port_02.jpg&quot; width=&quot;800&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Add caption&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The package comes with two identical cables.&lt;/div&gt;&lt;div&gt;On one end of the cable is the normal USB connector which should be plug on your computers&lt;/div&gt;&lt;div&gt;On the other end of the cable is a connection that looks like a printer cable - this should of into the KVM.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are 3 male-to-male HDMI cables that need to be purchased separately.&lt;/div&gt;&lt;div&gt;Cable 1 connect HDMI port on KVM to HDMI port on computer 1&lt;/div&gt;&lt;div&gt;Cable 2 connect HDMI port on KVM to HDMI port on&amp;nbsp;computer 2&lt;/div&gt;&lt;div&gt;Cable 3 connect HDMI port on KVM (labelled &#39;output&#39;) to HDMI port on Monitor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once all cables are plugged in, the system is ready to be used.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/1757438622287928864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/1757438622287928864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/1757438622287928864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/1757438622287928864'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2020/06/unboxing-aimos-hdmi-kvm-2-port-switch.html' title='Unboxing - AIMOS HDMI KVM 2-port Switch'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/SnocZBfHhWg/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21773982.post-4859741996956450824</id><published>2020-04-28T14:08:00.003-07:00</published><updated>2020-04-28T14:08:44.069-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Investment trading"/><category scheme="http://www.blogger.com/atom/ns#" term="KDB"/><category scheme="http://www.blogger.com/atom/ns#" term="Kx"/><category scheme="http://www.blogger.com/atom/ns#" term="Kx Systems"/><category scheme="http://www.blogger.com/atom/ns#" term="q"/><category scheme="http://www.blogger.com/atom/ns#" term="real-time database"/><category scheme="http://www.blogger.com/atom/ns#" term="time-series"/><title type='text'>Notes q</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
You Tube - Introduction to KDB+ and q&lt;br /&gt;
An Overview of the q language&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You Tube - Introduction to KDB+ and q&lt;br /&gt;
========================================&lt;br /&gt;
Tutorial: https://www.youtube.com/watch?v=8eoysfqO3UY&amp;amp;list=PLypX5sYuDqvrwBD2EMWadIMiTqJZmVsqm&lt;br /&gt;
The following is a transcribe of the details in the above introduction course. It is meant as rough notes to capture the syntax and used as a reference, and may not give good worded descriptions.&lt;br /&gt;
&lt;br /&gt;
#lesson 1&lt;br /&gt;
NO: control flow, loop, if-else, threads, shared globals, objects, inheritance&lt;br /&gt;
interpretive language, dynamically type, vector programming, functional programming, list, dictionaries, tables (1st class items, based on list, dicts)&lt;br /&gt;
&lt;br /&gt;
#lesson 2&lt;br /&gt;
function has TYPE&lt;br /&gt;
42&amp;nbsp; -&amp;gt; 64 bit&lt;br /&gt;
42i -&amp;gt; 32 bit&lt;br /&gt;
4%2 -&amp;gt; % is division&lt;br /&gt;
2f&amp;nbsp; -&amp;gt; float&lt;br /&gt;
&lt;br /&gt;
#lesson 3&lt;br /&gt;
1 2 3+10 20 30&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; vecotr operation, results is 11 22 33, spaces are used to separate list items&lt;br /&gt;
count 1.0 2.0 3.0&amp;nbsp; -&amp;gt; 3 is the result&lt;br /&gt;
1+10 20 30&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; 11 21 31&amp;nbsp; scalar(atom) + vector&lt;br /&gt;
# All operations have precedence, operations done right to left&lt;br /&gt;
2*3+4&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; (3+4) =7 then *2&amp;nbsp; =14&lt;br /&gt;
til 100&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; generates 01 2 ... up to 100 numbers&lt;br /&gt;
count til 100&amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 100&lt;br /&gt;
101+2*til 1000&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; generate (0 .. 999), then x 2, then add 100 to every item. Result: 101 103 105 ....&lt;br /&gt;
&lt;br /&gt;
#lesson 4&lt;br /&gt;
0b&amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; false&lt;br /&gt;
1b&amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; true&lt;br /&gt;
101b&amp;nbsp; &amp;nbsp; -&amp;gt; list of booleans true, false, true, NOT separated by space, and NOT a bitmask representation&lt;br /&gt;
42=6*7&amp;nbsp; -&amp;gt; 1b (true)&lt;br /&gt;
1 2 3=10 2 30&amp;nbsp; -&amp;gt; 010b&amp;nbsp; vector results of false, true, false&lt;br /&gt;
2018.01.01&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; actually count of days since millenium (yyyy.mm.dd)&lt;br /&gt;
2000.01.01=0&amp;nbsp; &amp;nbsp;-&amp;gt; 1b True&lt;br /&gt;
1999.12.31=-1&amp;nbsp; -&amp;gt; 1b True&lt;br /&gt;
2000.02.01-2000.01.01&amp;nbsp; -&amp;gt; 31i (31 days, in INTEGER &#39;i&#39;) date arithmetic&lt;br /&gt;
2000.01.01+til 31&amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; make 31 integers then add to 1st Jan 2000 -&amp;gt; gives the dates of that month. List-Date arithmetic&lt;br /&gt;
2000.01m&amp;nbsp; &amp;nbsp; -&amp;gt; month&lt;br /&gt;
2000.01m=0&amp;nbsp; -&amp;gt; 1b&amp;nbsp; &amp;nbsp; Comparing the 1st month since millennium&lt;br /&gt;
2000.02m=1&amp;nbsp; -&amp;gt; 1b&amp;nbsp; &amp;nbsp; Comparing the 2nd month since millennium&lt;br /&gt;
2000.01.01=2000.01m&amp;nbsp; Comparing 1st day ever, to 1st month ever, q assumes the month is 1st day of month when comparing to date, hence true.&lt;br /&gt;
&lt;br /&gt;
#lesson 5 - Casting&lt;br /&gt;
`long$1.0&amp;nbsp; -&amp;gt; cast to long&lt;br /&gt;
`float$1&amp;nbsp; &amp;nbsp;-&amp;gt; cast to float&lt;br /&gt;
`boolean$1 -&amp;gt; cast to boolean&lt;br /&gt;
`date$31&amp;nbsp; &amp;nbsp;-&amp;gt; cast to date format, ie 31 days since millennium is 2000.02.01&lt;br /&gt;
2000.01m+til 12&amp;nbsp; &amp;nbsp;-&amp;gt; list of 12 months&amp;nbsp; 2000.01 2000.02 2000.03 ...&lt;br /&gt;
15+2000.01m+til 3 -&amp;gt; 2001.04 2001.05 2001.06m&amp;nbsp; &amp;nbsp; 1st 3 months, after 15 months from the millenium&lt;br /&gt;
&lt;br /&gt;
# lesson 6 - Operations on List&lt;br /&gt;
Declarative programming - what we want in q. Other languages are imperative, ie write loops to tell how to compute.&lt;br /&gt;
0 +/ 10 20 30 40 50&amp;nbsp; &amp;nbsp; Initialise to zero then add the items on the list. The +/ symbol called &#39;over&#39; in q, &#39;fold&#39; in functional language.&lt;br /&gt;
(+/) 10 20 30 40 50&amp;nbsp; &amp;nbsp; Same as above - add across a list. Does not need to be initialised.&lt;br /&gt;
&#39;/&#39;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; The slash is ALSO behaving like an iterator&lt;br /&gt;
sum 10 20 30 40 50&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;&amp;nbsp; same as above&lt;br /&gt;
(*/) 1+til 5&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Does Factorial(5)&lt;br /&gt;
4|5&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 5 returns larger number&lt;br /&gt;
10&amp;amp;2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; 2 returns smaller number&lt;br /&gt;
0b|1b&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 1b&amp;nbsp; Larger operator for Boolean is equivalent to &#39;OR&#39; operator&lt;br /&gt;
0b&amp;amp;1b&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 0b&amp;nbsp; Smaller operator for Boolean is equivalent to &#39;AND&#39; operator&lt;br /&gt;
(|/) 10 30 20&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 30&lt;br /&gt;
max 10 30 20&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; 30&lt;br /&gt;
(&amp;amp;/) 10 30 20&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 10&lt;br /&gt;
min 10 30 20&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; 10&lt;br /&gt;
(+\) 10 20 30 40 50&amp;nbsp; &amp;nbsp; -&amp;gt; 10 30 60 100 150. Backslash means create a CUMULATIVE / RUNNING list. also called &#39;sums&#39;&lt;br /&gt;
(&amp;amp;\) 40 20 30 10 50&amp;nbsp; &amp;nbsp; -&amp;gt; 40 20 20 10 10. Running minimum. Also called &#39;mins&#39;. Similarly with &#39;maxs&#39;&lt;br /&gt;
&lt;br /&gt;
# Lesson 7 - Functions&lt;br /&gt;
{[x]x*x}&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; [x] is the parameter&lt;br /&gt;
{[x]x*x}5&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; substitutes 5 into x. Result is 5*5. Can also use {[x]x*x}[5]&lt;br /&gt;
{x*x}5&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; implicit parameter, don&#39;t need to declare.&lt;br /&gt;
&lt;br /&gt;
# Lesson 8 - Newton Raphson and Fibonacci Sequence&lt;br /&gt;
Say Function is f(x) 2-x^2. So f&#39;(x) = -2x. NewtRaph algo is xn = xn - f(x)/f&#39;(x)&lt;br /&gt;
{[xn]xn+(2-xn*xn)%2*xn}/[1.0]&amp;nbsp; &amp;nbsp;-&amp;gt; 1.414214&amp;nbsp; &amp;nbsp;.... result from Newton Raphson using 1.0 as initial point, being put into the function on the left iteratively.&lt;br /&gt;
{[xn]xn+(2-xn*xn)%2*xn}\[1.0]&amp;nbsp; &amp;nbsp;-&amp;gt; 1&amp;nbsp; 1.5&amp;nbsp; 1.4.....&amp;nbsp; shows the intermediate results from Newton Raphson&lt;br /&gt;
\P 16&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; shows 16 decimals. iteration stops until diff is 1e-14&lt;br /&gt;
2#10 20 30 40 50&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 10 20&amp;nbsp; &amp;nbsp;&#39;#&#39; retrieves the integers from the left of list&lt;br /&gt;
-2#10 20 30 40 50&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; 40 50&amp;nbsp; &amp;nbsp;&#39;#&#39; retrieves the integers from the right of list&lt;br /&gt;
10 20, 100 200 300&amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 10 20 100 200 300&amp;nbsp; &amp;nbsp; &amp;nbsp; joins lists&lt;br /&gt;
{x, sum -2#x}/[10;1 1]&amp;nbsp; -&amp;gt; returns the Fibonacci Sequence. Iterate 10 times, starting with [1 1]&lt;br /&gt;
&lt;br /&gt;
# Lesson 9 - Function, Variables&lt;br /&gt;
deltas 110 120 130&amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 110 10 10&amp;nbsp; &amp;nbsp;takes differences between two numbers. The first result assumes difference with zero.&lt;br /&gt;
deltas sums 110 120 130 -&amp;gt; is the same as sums deltas 110 120 130&amp;nbsp; &amp;nbsp;-&amp;gt; result is 110 120 130. Invariance in q.&lt;br /&gt;
a:42&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; assign value of 42 to variable a.&lt;br /&gt;
buys:2 1 4 3 5 4&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt;&lt;br /&gt;
sell:12&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; want to sell 12 units from the various buys&lt;br /&gt;
sums buys&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; 2 3 7 10 15 19&lt;br /&gt;
sell&amp;amp;sums buys&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 2 3 7 10 12 12 - creates a list of minimum between two lists.&lt;br /&gt;
deltas sell&amp;amp;sums buys&amp;nbsp; &amp;nbsp;-&amp;gt; 1 2 4 3 2 0&amp;nbsp; &amp;nbsp; - list of what how should buy&lt;br /&gt;
&lt;br /&gt;
# Lesson 10 - Tables&lt;br /&gt;
Table = Collection of columns in q. Operations are column based, hence vector operations.&lt;br /&gt;
dates:2018.01.01+10000000?31&amp;nbsp; -&amp;gt; list of 10 million numbers between 0(including BUT not stated) and 31(stated, but EXCLUSIVE)&lt;br /&gt;
times:10000000?24:00:00.0000&amp;nbsp; -&amp;gt; 10 million random nums, between 0 (including, BUT not stated) and midnight (EXCLUSIVE)&lt;br /&gt;
qtys:100*1+10000000?100&amp;nbsp; &amp;nbsp;-&amp;gt; 10 mil random numbes from 0 to 100, then +1, then * 100&lt;br /&gt;
ixs:10000000?3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 10 mil rand num, from 0 1 2.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; store random numbers in ixs&lt;br /&gt;
10 20 30 ixs&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 10 10 30 20 30 20 ......&amp;nbsp; &amp;nbsp; &amp;nbsp;Since ixs has 3 unique values, so the 10 20 30 will apply to 10 20 30, MAPPED into the 10 million entries of ixs.&lt;br /&gt;
syms:`appl`amzn`googl ixs -&amp;gt; `googl`aapl`amzn`googl`googl ....&amp;nbsp; &amp;nbsp; &amp;nbsp;applies symbols to list, store in syms. The 3 stock quotes is MAPPED to the 3 unique values of ixs for all 10 million values of ixs&lt;br /&gt;
172.0 1189.0 1073.0 ixs&amp;nbsp; &amp;nbsp;-&amp;gt; maps the 3 unique values into the 10million numbers of ixs&lt;br /&gt;
pxs:(1+10000000?.03) 172.0 1189.0 1073.0 ixs&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; adds some random noise to the 10 million stock prices.&lt;br /&gt;
t:([] date:dates;time:times;sym:syms;qty:qtys;px:pxs)&amp;nbsp; -&amp;gt; creates a table, with specified column names, and columns of data&lt;br /&gt;
t:`date`time xasc t&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; sort ascending time, then date&lt;br /&gt;
5#t&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; returns top(head) 5 rows&lt;br /&gt;
&lt;br /&gt;
# Lesson 11 - qSQL&lt;br /&gt;
select date,time,qty,px from t where sym=`aapl&amp;nbsp; &lt;br /&gt;
\t select date,time,qty,px from t where sym=`aapl&amp;nbsp; &amp;nbsp; -&amp;gt; returns time in milliseconds&lt;br /&gt;
first 10 20 30 40 50&amp;nbsp; &amp;nbsp;-&amp;gt; first item on list&lt;br /&gt;
last 10 20 30 40 50&amp;nbsp; &amp;nbsp; -&amp;gt; last item on list&lt;br /&gt;
select open:first px,close:last px by date,time from t where sym=`aapl&lt;br /&gt;
&lt;br /&gt;
#Lesson 12 - Complex Queries(*)&lt;br /&gt;
4 3 2 1 wavg 10 20 30 40&amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 20f&amp;nbsp; calculate weighted average&lt;br /&gt;
5 xbar 0 1 2 3 4 5 10 11 21&amp;nbsp; &amp;nbsp;-&amp;gt; 0 0 0 0 0 5 10 10 20&amp;nbsp; &amp;nbsp;returns bucketed result. Useful for time domain values that needs bucketing&lt;br /&gt;
select max px - mins px from t where sym=`appl&amp;nbsp; &amp;nbsp;-&amp;gt; is the Max idealised profit (ie buy at the lowest price of the day and sell at the highest price of the day. The function is the same as select (max (px - (mins px from t where sym=`appl) )). The mins is a running cumulative vector of the minimum, while the max just returns the single value.&lt;br /&gt;
&lt;br /&gt;
#Lesson 13 - Interprocess Communication(*)&lt;br /&gt;
Server and Client - ie running two different q.&lt;br /&gt;
On Server&lt;br /&gt;
\p 4242&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Starts the server on port 4242&lt;br /&gt;
On Client&lt;br /&gt;
h:hopen`::4242&amp;nbsp; &amp;nbsp; &amp;nbsp;Where machine name is omitted between two colons, since it is on the same machine. h is the handler&lt;br /&gt;
h &quot;6*7&quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Do compute on remote server&lt;br /&gt;
sq:{x*x}&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Send function to remote server&lt;br /&gt;
h (sq; 5)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Execute on remote server&lt;br /&gt;
DON&#39;T DO ABOVE since open ports are dangerous&lt;br /&gt;
On Server&lt;br /&gt;
cub3:{0N!x*x*x}&amp;nbsp; &amp;nbsp; 0N! displays computation on local server first, before shifting to client&lt;br /&gt;
On Client&lt;br /&gt;
h (`cub3; 5)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Safer this way, CALL the name of the function. First Argument is function name, the rest are arguments&lt;br /&gt;
&lt;br /&gt;
#Lesson 14 - Callbacks(*)&lt;br /&gt;
Previously the client server were synchronous, meaning the parties wait for each other after sending a message.&lt;br /&gt;
For Asynchronous, when message is sent, the sender does not need to wait.&lt;br /&gt;
The handler h is an &#39;integers&#39;.&lt;br /&gt;
On Client&lt;br /&gt;
h&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 3i&amp;nbsp; is the integer 3. this is a function handler&lt;br /&gt;
(neg h) (`cub3;5)&amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; h is positive, neg h is negative. So &quot;(neg h) (`cub3; 5)&quot; is an ASYNCHRONOUS call.&lt;br /&gt;
Callback: Without callback, an asynchronous function would send message to server, then receives no response. With callback provided on the server, the server will send the result back whenever it is ready.&lt;br /&gt;
Client uses &#39;h&#39; as its handler to call the server&lt;br /&gt;
Server uses &#39;.z.w&#39; as its handler of the function send from the client.&amp;nbsp; .z.w returns 6i&lt;br /&gt;
&lt;br /&gt;
On Client (FINAL)&lt;br /&gt;
continue:{0N!x}&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; displays x over here&lt;br /&gt;
(neg h) (`worker; 5; `continue)&amp;nbsp; &amp;nbsp;-&amp;gt; (neg h) for asynchronous, call process &#39;worker&#39; on server, with argument &#39;5&#39;, use the callback label &#39;continue&#39;. First Argument `worker is function name, the rest are arguments [5; `continue]&lt;br /&gt;
&lt;br /&gt;
On Server (FINAL)&lt;br /&gt;
cub3:{0N!.z.w; x*x*x}&lt;br /&gt;
worker:{[arg; callback] r:cub3 arg; (neg .z.w) (callback; r)&amp;nbsp; -&amp;gt; &#39;worker&#39; is process called by client, defined here on server. [arg; callback] are the parameters passed from client. &#39;callback&#39; is the dummy name corresponding to &#39;continue&#39;. Runs cub3 on arg, store result in r. Then (neg .z.w) triggers the callback to client asynchronously. Thirdly execute the &#39;callback&#39; (which is &#39;continue&#39;) with result r.&lt;br /&gt;
&lt;br /&gt;
# Lesson 15 - I/O&lt;br /&gt;
Strings - abit different than other languages. Strings are a list of characters, not a primitive type.&lt;br /&gt;
&quot;jab&quot;&amp;nbsp; &amp;nbsp; is a list&lt;br /&gt;
`jab&amp;nbsp; &amp;nbsp; &amp;nbsp;is a variable name&lt;br /&gt;
Binary files - operations have 1 in their names&lt;br /&gt;
Text files - operations have 0 in their names&lt;br /&gt;
File records are list of strings to q. Which means they are a list of list of characters to q.&lt;br /&gt;
&lt;br /&gt;
(&quot;So long&quot;; &quot;and thanks&quot;; &quot;for all the dish&quot;)&amp;nbsp; &amp;nbsp; - a list of list of chars&lt;br /&gt;
count (&quot;So long&quot;; &quot;and thanks&quot;; &quot;for all the dish&quot;)&amp;nbsp; &amp;nbsp; -&amp;gt; three list items&lt;br /&gt;
`:/data/solong.txt&amp;nbsp; 0: (&quot;So long&quot;; &quot;and thanks&quot;; &quot;for all the dish&quot;)&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; `:/data/solong.txt&amp;nbsp; &amp;nbsp;returns this file handler as acknowledgment&lt;br /&gt;
&#39;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; error messages are &#39;Straight ticks&#39;&lt;br /&gt;
`&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; File handlers are &#39;back ticks&#39;&lt;br /&gt;
`:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;is the file handler or names a file.&lt;br /&gt;
/data/solong.txt&amp;nbsp; &amp;nbsp;is the local path&lt;br /&gt;
0:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;is the name of the WRITE to text file function&lt;br /&gt;
read0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; is the name of the READ from text file operation&lt;br /&gt;
read0 `:/data/solong.txt&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; prints out the lines of the file&lt;br /&gt;
`:/data/answer.txt&amp;nbsp; 0: txt,txt:read0 `:/data/solong.txt&amp;nbsp; &amp;nbsp;-&amp;gt; `:/data/answer.txt&amp;nbsp; &amp;nbsp;returns this file handler as acknowledgment&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Date - starts from the millennum&lt;br /&gt;
Vector Column operations - not Rows&lt;br /&gt;
select from 10million rows in 150ms&lt;br /&gt;
Single line of code for even for non-trivial functions&lt;br /&gt;
&lt;br /&gt;
select max px - mins px from t where sym=`appl&amp;nbsp; &amp;nbsp; Algorithm for Idealised Profit in Trading (sym is symbol column, px is price column of table t )&lt;br /&gt;
{[xn]xn+(2-xn*xn)%2*xn}\[1.0]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Algorithm for Newton Raphson with initial point as 1.0&lt;br /&gt;
{x, sum -2#x}/[10;1 1]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Algorithm for Fibonacci Sequence, initial points 1 1 , for 10 iterations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
An Overview of the q language&lt;br /&gt;
================================&lt;br /&gt;
&lt;br /&gt;
&#39;q&#39; is a proprietary language build on top of an existing &#39;k&#39; language (developed by ex-Morgan Stanley computer scientist Arthur Whitney) and the kdb+ datatbase (The &#39;q&#39; language / kdb+ is free for non-commercial use). They are all proprietary products of Kx Systems and it is perhaps more widely known (if not the de facto) in the finance and investment banking industry more than any other industries. As such, it is aimed at time-series based data, large volumes and high transfer rates. Very complex applications can be written in the &#39;q&#39; language with an extremely small footprint. A large number of Altair&#39;s real time visualisation software, Panopticon, connect to kdb+ databases and utilises q.&lt;br /&gt;
&lt;br /&gt;
A recent exploration into the depths of the q language reveals a very sophisticated and expressive computational programming language. It is both like and unlike various programming languages. Perhaps the first point is the vector programming underlying its core, yet this language may not be known widely in the HPC community (or perhaps I have not looked wide enough while I was in HPC, it happens). Vector supercomputers once ruled the HPC world, but when they approached extinction, the vector processing capability were re-incarnated into commodity CPUs and is now powering our PCs (since the days of Intel MMX, SSE, etc...). And it appears that around that similar time shortly after the Millennium, &#39;q&#39; was born independently of Vector Supercomputers or vectorised CPU instructions, but rather tracing its origin back to the 60s from APL (A Programming Language), thus having both vector and functional programming influence.&lt;br /&gt;
&lt;br /&gt;
For reference, a free book is available at: https://code.kx.com/q4m3/0_Overview/&lt;br /&gt;
And a Tutorial series is at: https://www.youtube.com/playlist?list=PLypX5sYuDqvrwBD2EMWadIMiTqJZmVsqm&lt;br /&gt;
&lt;br /&gt;
For those coming from scientific, computational, HPC background, thinking in terms of vectors will ease our understanding to &#39;q&#39;. For the general programmers who are familiar with C, Java, Python, and the rest, the good advice from the YouTube link would be to throw away your understanding of control flow, loop, if-else, threads, shared globals, objects, inheritance. The syntax itself is short, succinct and raw, yet expresses beautifully the operations it performs. The following will describe some of the noteworthy things about &#39;q&#39; which are different than the current popular programming languages.&lt;br /&gt;
&lt;br /&gt;
&#39;q&#39; is similar to many scripting language, ie interpretative (no compilation), dynamically type (no pre-declaration of data type). The two fundamental data structures are lists and dictionary, again no surprises here. However it is the vector operations that are perhaps new to most modern day programmers. For example a vector 1 2 3 can be added directly to another vector 10 20 30. Yet these vector expressions should be reminiscent of those in Matlab and Fortran, but the similarities don&#39;t extend much further. The syntax is perhaps quite different (though perhaps not too dissimilar to other functional programming languages). The vector (list) items are delimited by spaces (not commas). The mathematical operators has equal precedence (no BODMAS rule) and the order is designed so that the operations are performed in the right-to-left order. For example: 2*3+4 is actually 2*7, which is 14. This right-to-left and single line way of writing code is perhaps the biggest change a programmer of other languages need to overcome.&lt;br /&gt;
&lt;br /&gt;
Control flow and loops goes out the window because an operation acts on all the items in the vector. There is no point in having an explicit index to loop over. As such, an operation over 10 or 10 million items can be written in one line. In fact, entire functions or methods are written in one line, as shown in examples later. In terms of data types, there are the familiar char, boolean, integer, float and so on. Strings are like in Fortran or old C, a string in q is actually a character of arrays. The really most interesting data type I found is the Date representation. Instead of some arbitrary representation having an initial value at 1970 or 1900; q&#39;s date are actually integers starting from 1 Jan 2000. This means date computations benefit from the speed of raw integer operations, as well as being able to perform fancy date arithmetic.&lt;br /&gt;
&lt;br /&gt;
List operations are powerful, since this is one of the core data structures of q. List, or vectors can be operated with another vector or scalar, not dissimilar at all to their mathematical counterparts. In addition to aggregate operations like &#39;max&#39;, &#39;min&#39;, &#39;sum&#39;, there are more interesting versions &#39;maxs&#39;, &#39;mins&#39;, &#39;sums&#39; which actually returns a cumulative vector of the aggregation process. The highlight of the &#39;q&#39; language of its expressiveness and power would be its function definitions. Instead of describing, ponder upon the following one-liner, and consider how such functions would need to be written in Python, Java, C, etc:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Algorithm for Newton Raphson with initial point as 1.0&lt;br /&gt;
{[xn]xn+(2-xn*xn)%2*xn}\[1.0]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Algorithm for Fibonacci Sequence, inital points 1 1 , for 10 iterations&lt;br /&gt;
{x, sum -2#x}[10;1 1]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Algorithm for Idealised Profit in Trading (sym is symbol column, px is price column of table t )&lt;br /&gt;
select max px - mins px from t where sym=`appl&lt;br /&gt;
&lt;br /&gt;
As for Data Analytics and complex data processing, there are tables, qSQL and a few more useful functions. Tables are collection of columns, like Fortran/Matlab but opposite to C-based languages. Columns in tables generally mean they are of the same data type that means they are easily stored as vectors. For q, this means performing operations on large datasets are extremely fast. Combining the single line functional syntax with vector based operations, very complex yet efficient programs can be written in a terse manner. The qSQL syntax enables very SQL-like expressions to be written. This may be a comfort for SQL programmers, but it still pays to understand the underlying concepts of q, since there are fundamental differences that can lead to incorrect expectations. Native functions like &#39;xbar&#39; that creates bucketing are extremely powerful when applied to time-series based analysis. In an example of 10million rows, a certain select operation took 150ms.&lt;br /&gt;
&lt;br /&gt;
Most programming languages have the capability of File I/O. q also has File I/O for both text and binary files (again there is the similarity with Fortran&#39;s binary files capability, rather than the streams based files I/O of other languages). Not surprisingly by now, q&#39;s way or reading and writing files are one-liners. There is no need to open or close a file or the many other lines of instructions needed by other languages. Besides File I/O, q is also capable of Interprocess Communications and Asynchronous processes. Together, these capabilities enable q to write client-server applications without using any other external tools.&lt;br /&gt;
&lt;br /&gt;
From this brief high level exploration, q seems to be an interesting, powerful and useful programmig language. It has the expressiveness of functional programming, the power of vector processing and the applicability to real high volume data computational needs. The fact that it is born within the Financial Trading sector by no means exclude it from being used in other industries. Whereever there is large numerical datasets that requires computation, q may be a good choice. These other industries that may benefit include: data science, scientific research,&amp;nbsp; defence, telecommunications, etc. In terms of providing real-time visualisations of the large and fast datasets, Altair&#39;s Panopticon with kdb+/q would make a formidable combination.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
google_ad_client = &quot;pub-0991060271110706&quot;;
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = &quot;180x60_as_rimg&quot;;
google_cpa_choice = &quot;CAAQmMekgwIaCLqrEPdAhOEYKMzD4IEBMAA&quot;;
google_ad_channel = &quot;3461688952&quot;;
//--&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xtechnotes.blogspot.com/feeds/4859741996956450824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/21773982/4859741996956450824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/4859741996956450824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21773982/posts/default/4859741996956450824'/><link rel='alternate' type='text/html' href='http://xtechnotes.blogspot.com/2020/04/notes-q.html' title='Notes q'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>