In order to make this a more concrete concept, I'll focus on my family and history. My maternal side is from Sicily and Italy. My paternal is Germany. Sicily is called out separate because it's culture is mostly distinct from Italy. My grandmother always made the distinction, so it sticks. The Italian traditions, beliefs, and attitudes are very much from when they left the country.
There's a huge difference in maternal vs paternal lineage in my case. My maternal side left in the early 1900s. My paternal side left in the 1650s to what was then, a UK colony. My paternal side is very much American, in fact so much given that literally every generation since arriving has joined and fought in the military--first for the UK, then the US from the Revolutionary War and since. After so many generations, the German attitudes, traditions, and beliefs seem subsume to American.
In talking to recent immigrants from various countries, they find (homeland)-Americans are odd compared to natives from the homeland. For example, current Italians find many curiosities in Italian-American culture. I'm not going to detail them, because that alone can spawn another discussion. It's odd, because it reminds me of impressions from when I was in Asia. Meeting American-Asians was like meeting a person who sort of time-traveled from the 1950s. It felt like talking to my grandparents in some ways, but clearly an asian version of them. I can't accurately put it into words.
I used an LLM to summarize all of the papers and readings. The overall tone is fairly negative, but so are the source papers. Here's the verbatim output from the summary.
When immigrants arrive in a new country, they bring with them a rich tapestry of cultural traditions, values, and practices from their homeland. These cultural elements serve as a vital lifeline, providing a sense of identity, community, and continuity for immigrant families as they navigate the challenges of building a new life in an unfamiliar place.
However, an interesting phenomenon can occur over time - while the culture in the origin country continues to evolve and change with the times, the immigrant culture can remain relatively static and stagnant. Cut off from the day-to-day developments happening back home, immigrant communities often cling tightly to the traditions and customs they arrived with, even as those same traditions are being reshaped or discarded in the origin country itself.
For example, gender roles and family dynamics among immigrants may reflect outdated patriarchal structures that have advanced in the homeland due to women's rights movements and shifting societal values[2]. Religious practices can also remain frozen in time, not incorporating the reforms and modernizations taking place in the origin country[2][7]. Even things like music, fashion, cuisine, and language can stagnate, not keeping pace with contemporary trends evolving back home.
There are a few key reasons this cultural stagnation tends to occur:
1. Isolation from the origin country and its cultural evolution: Immigrants, especially those who arrived decades ago, can become increasingly disconnected from the cultural changes happening in their homeland[4][8]. Without regular exposure to new ideas, trends, and societal shifts, their cultural frame of reference remains rooted in the past.
2. Desire to preserve cultural identity in a foreign land: Faced with the pressures of assimilation and the fear of losing their heritage, immigrant communities often double down on preserving traditional culture[3][6][9]. Clinging to familiar customs can provide a sense of comfort and belonging in a new and sometimes hostile environment.
3. Lack of exposure to new immigrants bringing current cultural knowledge: As time passes, the influx of new immigrants from the origin country may slow down or change in composition. Without a steady stream of newcomers bringing fresh cultural perspectives, the immigrant community's understanding of contemporary culture back home can become outdated[1][5].
4. Motivation to pass on traditional culture to younger generations born in the new country: First-generation immigrants often feel a strong responsibility to transmit their cultural heritage to their children and grandchildren born in the adopted country[11][17]. However, without a balanced understanding of how the culture has evolved, they may inadvertently pass on traditions that have become obsolete or irrelevant in the modern origin country.
While cultural preservation is undoubtedly important, the failure to evolve can create a growing disconnect between immigrant communities and their counterparts in the origin country. Outdated traditions around things like gender roles, religious doctrine, and social norms can lead to clashes between older immigrant generations and their more assimilated, contemporary-minded children[5][17].
This cultural dissonance can be particularly acute for second-generation immigrants, who often find themselves caught between the traditional expectations of their immigrant parents and the modern realities of their peers in the adopted country[15]. Navigating this complex landscape of competing cultural influences can be a significant source of stress and identity conflict.
So what's the solution? Immigrant communities must strive to balance the preservation of core cultural elements with an openness to change and evolution, just as the origin culture itself is doing. Maintaining connections and awareness of developments back home is key[7][14]. Community leaders can play a vital role in guiding this balance, thoughtfully introducing updates to cultural practices while still honoring cherished traditions[11][15].
Ultimately, culture is not a fixed monolith, but an ever-evolving reflection of a people in a certain time and place. For immigrants, holding too tightly to a culture that no longer exists back home benefits no one. With conscious effort and open dialogue, immigrant communities can carry forward the most meaningful aspects of their heritage while still keeping pace with the dynamic changes unfolding in their homelands.
By striking this delicate balance, immigrant cultures can remain vibrant, relevant, and connected to their roots, while also embracing the growth and evolution that is essential to the human experience, no matter where in the world we find ourselves.
Citations:
[1] https://www.semanticscholar.org/paper/104c8de955723f29edb1442793a172e2e6cf813b
[2] https://www.semanticscholar.org/paper/71b9c2c54582dae5c3a6ad9cae470c0af9c72ad5
[3] https://www.semanticscholar.org/paper/6911ae15c027cafaa33a67dd3d12b135d4c95c40
[4] https://www.semanticscholar.org/paper/500f3a285d8d2cc57f035d806ca2f30248e7eeae
[5] https://www.semanticscholar.org/paper/0529ab94528ae2dc404f0458af488734c9bb1176
[6] https://www.semanticscholar.org/paper/a303a64e60e2c036715cfac2b1328bbde499f5fb
[7] https://www.semanticscholar.org/paper/71358c38bb5a534f6ea4e5968c4f75ff533455d1
[8] https://www.semanticscholar.org/paper/a0db7a32c0e07c290bc0e2583265abe8655e6218
[9] https://www.semanticscholar.org/paper/8c2dcf71130b073f414bbc0a02e8c01954e4c920
[10] https://www.semanticscholar.org/paper/98008f69c38e1d4e8e53e5e5123cf5521a75237d
[11] https://www.semanticscholar.org/paper/d579c6ff12c89be5e818334fe39c92269cddf8ec
[12] https://www.semanticscholar.org/paper/f9c8751e741ad33a52ee01b18fc5b862be0f1219
[13] https://www.semanticscholar.org/paper/b094ecd579165f3f675774c666bc51816a738c82
[14] https://pubmed.ncbi.nlm.nih.gov/35938934/
[15] https://www.semanticscholar.org/paper/a82835bdf8c25c5f0c81f596237c04f74a252a69
[16] https://www.semanticscholar.org/paper/071b23ad240f4873a78b1d5ed72c9e8697b51553
[17] https://www.semanticscholar.org/paper/e56853e62f0744c574bf4bd77ca7165bc705a68b
[18] https://www.semanticscholar.org/paper/6136c448d4f882eb4bc62b26447e44c86ce95674
[19] https://www.semanticscholar.org/paper/ae954f800c285082adef05dac6edc16d987fbd86
[20] https://www.semanticscholar.org/paper/674e20b19b53c7d6867ed2a6704cb3df3fec6f82
Human trafficking is a pervasive global crime that exploits millions of people each year. Traffickers increasingly use digital platforms to recruit victims through online ads and social media. However, advances in technology are also providing powerful new tools to detect trafficking networks and support survivors. From artificial intelligence to blockchain analysis to mobile apps, innovations are helping combat this human rights abuse on multiple fronts.
One key area of innovation is applying artificial intelligence (AI) and machine learning to analyze online data and identify potential trafficking activity. AI models can process huge volumes of information to detect suspicious patterns that may otherwise go unnoticed.
For example, researchers have developed machine learning models to classify online ads and detect ones that are likely related to sex trafficking. By analyzing the text of ads, these models can flag suspicious posts with over 90% accuracy.[2][4][20] This enables more efficient review of the millions of online ads posted daily.
AI is also being used to uncover trafficking networks by analyzing connections between people involved in court cases. Software can reveal relationships between victims and exploiters based on features in legal databases, which helps identify organized rings.[3][5] Additionally, machine learning can detect anomalous patterns in location tracking data that may indicate trafficking or other illicit activities.[7][14]
While still an emerging field, AI has significant potential to uncover trafficking activity that may otherwise go undetected. As more training data becomes available and models are refined, performance will continue to improve. However, it's critical that AI tools are developed and deployed responsibly in collaboration with anti-trafficking experts, victim service providers and survivor leaders to avoid unintended harms.
Traffickers often use cryptocurrencies to launder profits from their crimes. But every transaction is recorded on the blockchain - a public, immutable ledger. This provides a trail of financial data that investigators can follow.
Researchers have applied machine learning to detect patterns associated with money laundering and other illicit transactions in Bitcoin, even with minimal labeled data.[12] Scaling up this analysis could help identify trafficking finances and disrupt criminal networks.
Blockchain analytics combined with other financial intelligence sharing can be a powerful tool for law enforcement to "follow the money" and prosecute traffickers. However, robust privacy and security safeguards are essential given the sensitive nature of financial data.
Mobile apps, websites, and hotlines are providing new channels for trafficking victims to access information and connect to support services. These tools aim to reach victims where they are, when they are able to seek help.
For example, apps can provide a secure, anonymous way for victims to learn about their rights and available resources. Location-based features can show services near them and provide directions. Hotlines can connect victims to an advocate anytime.
Importantly, these tools must be designed with input from survivors to truly understand victims' needs and reduce barriers to accessing help. User privacy and security must also be paramount to avoid putting victims at further risk.
While technology is providing valuable innovations to combat trafficking, challenges remain:
Achieving the full potential of anti-trafficking technology will require ongoing research, responsible development practices, and collaboration across sectors. A human rights-based approach is essential to ensure tools help rather than harm the vulnerable populations they aim to serve.
In conclusion, from AI analysis of online data to blockchain forensics to victim support platforms, technology is providing powerful new tools in the fight against human trafficking. Continuing to develop and scale these innovations, grounded in human rights principles, could have a major impact on both preventing this crime and supporting survivors. While technology is not a singular solution, it has an important role to play alongside other anti-trafficking efforts to ultimately reduce the number of lives exploited globally.
Citations:
[1] https://www.semanticscholar.org/paper/4848223ae379516472da5dde85f5f6ae7772e6f6
[2] https://www.semanticscholar.org/paper/b470773cd6feb8962f3de784d925685ab61133f6
[3] https://pubmed.ncbi.nlm.nih.gov/35238607/
[4] https://www.semanticscholar.org/paper/009187e2106a10559709b0645af303edcddafb6c
[5] https://www.semanticscholar.org/paper/bb968e3158136bb64ce774d8fc4355eaceba8b8b
[6] https://pubmed.ncbi.nlm.nih.gov/35876350/
[7] https://www.semanticscholar.org/paper/bd210dd862d5fad0e06a2c805745f86f2e3c3882
[8] https://arxiv.org/abs/1712.00846
[9] https://pubmed.ncbi.nlm.nih.gov/34569887/
[10] https://www.semanticscholar.org/paper/b4c1e2eb91ce4a04e60da4d41076f4eb35902738
[11] https://www.semanticscholar.org/paper/c41f71f80d08b2436b7f915a5984ca5529928162
[12] https://www.semanticscholar.org/paper/908ce70498193df2a7b4a04ef27eae19060829d4
[13] https://www.semanticscholar.org/paper/bc7c50b1a25562d99383b200b4ca7be2558426df
[14] https://www.semanticscholar.org/paper/b97c8de2a0fda5d77b5bc71f2f4f54196fe7eb58
[15] https://www.semanticscholar.org/paper/19110b1d3b410dd5605b7646febf65cc118ce2ef
[16] https://www.semanticscholar.org/paper/790229c0ded6a406392f37a0bf6f7a173cfba680
[17] https://www.semanticscholar.org/paper/4bea291fd6bbfcaa52d1fd259c24166f561d0aff
[18] https://www.semanticscholar.org/paper/627e481bbc84ee4a3cf2438f80290f464a779a17
[19] https://www.semanticscholar.org/paper/6bc808d6c30ee102e8b9e907d6a7465b5c2e0094
[20] https://www.ncbi.nlm.nih.gov/pmc/articles/PMC10722470/
My home network is mostly FreeBSD and IPv6-first. IPv6 first is actually what the specification mandates. I built a fully-functional IPv6-only network at first. Unfortunately, wide swaths of the Internet require IPv4. As much as I'd like to just not go there, others want access to this legacy space. I setup a 6-to-4 gateway which translates internal IPv6-only network to IPv4 on the outside. I also setup DNS64 for the internal server so that domains without a IPv6 address, could have one for the 6-to-4 gateway. However, I gave in and setup IPv4 DHCP on the home network and just use NAT to let the internal, private network clients talk to the rest of the world. Pretty standard setup that everyone does these days.
Every once in a while, I'd notice a request would take forever to continue. And by forever, I mean 30 second lags. I could never quite figure it out from packets captures. And it happened so infrequently, I just put in the pile of things to investigate when I had time. That is, until I setup a FreeBSD jail and tried to use lynx to browse sites. If you haven't heard of lynx, it looks like this:
It's a text browser without javascript. It is really, really nice to read the content without all the unrelated imagery associated with most sites today. And finally, the lag on request to some sites was really annoying. Why some sites and not others?
I would fire up curl and make a request to the laggy site in milliseconds. Hmm. I spent way too much time looking at logs on the firewall and at packet captures. Only to find everything but what I wanted to find. I saw my lynx requests for the target site, say https://brutalist.report. The DNS lookup, the response with the 64:ff IPv6 from the DNS server and the subsequent TCP connect request. The odd thing is the TCP connect just hung for like a minute. But curl request worked instantly, so....?
I did what any sane person would do, I fired up truss and watched every system call from lynx to see what was happening. Here's the start of the truss output:
What you're looking at is elapsed time on the left and then the actual system calls (syscalls) and their data. Here's the lookup and request for the default website, lynx.invisible-island.net:
0.032441984 write(1,"\^[[39;49m\^[[39;49m\^[[38;5;7m"...,41) = 41 (0x29)
Yes, that's 0.03 seconds since starting lynx. And here is lynx creating the socket to open the TCP connection to the website:
0.239560824 socket(PF_INET6,SOCK_STREAM,IPPROTO_TCP) = 3 (0x3)
Pretty straight forward so far. And here's the actual request for the TCP connect:
0.239756507 connect(3,{ AF_INET6 [64:ff9b::c07c:f99e]:443 },28) ERR#36 'Operation now in progress'
It's not actually an error, but it's just how the C library works. The point here is it's making an IPv6 connection to [64:ff9b::c07c:f99e]:443 which is IPv6 address "64:ff9b::c07c:f99e" on port 443. Ok, seems normal for a https request. Although, something in the back of my head said, "64:ff9b" seems familiar and odd. Even more odd, is it makes this request 736 more times over 75 seconds--75.25 seconds to be exact---well, 75.253190955 seconds to be accurate. Here's where it finally gives up:
75.253190955 connect(3,{ AF_INET6 [64:ff9b::c07c:f99e]:443 },28) ERR#61 'Connection refused'
So, it cannot connect to the IPv6 address and then makes an IPv4 request:
75.253931680 connect(3,{ AF_INET 192.124.249.158:443 },16) ERR#36 'Operation now in progress'2683
75.256503272 select(4,0x0,{ 3 },0x0,{ 0.100000 }) = 1 (0x1)2684
75.256723442 connect(3,{ AF_INET 192.124.249.158:443 },16) ERR#56 'Socket is already connected'
This IPv4 request and connection happens quickly, let's round up and call is 0.003 seconds (in reality it is 0.0027999999999934744 seconds elapsed).
Let's go back to that IPv6 address, "64:ff9b::c07c:f99e". Let's look it up only to find it doesn't resolve. Hmm. I did what anyone would do, search for it on the Internet, and I find https://www.rfc-editor.org/rfc/rfc8215.html. And in there is this in the literal first sentence of the RFC:
Well....duh. That's why 64:ff9b looked familiar to me, it's a non-routable address for internal use only.
Ok. Where did it come from? When I did a dns resolution for the AAAA record for brutalist.report or lynx.invisble-island.net, I get a response which we saw above. Why is my DNS server doing this? It should just return an empty result.
My 6th sentence in this blog post is why. DNS64 creates an address in the 64:99fb range when a domain doesn't have an IPv6 address. The simple fix is...just disable DNS64 in the DNS server.
Well, because by default curl uses IPv4, so it was never a fair comparison nor test of reachability.
And now everything is fast again. Someday every site will have IPv6-only, we can dream. I've been waiting for this since the 1990s.
While spelunking packet captures, I find many hosts on the network take 1-2 seconds to resolve a domain name to an IP address. This raised the question, why is DNS slow? Even if the answer is already in DNS cache, it would still take up to 0.5 seconds to resolve. This should be quicker. 0.5 seconds is just long enough to notice, nevermind 1-2 seconds, as you wait for the page to load, or connection to happen.
I dug into a few hosts on the network. They were all configured to use systemd-resolved for name resolution. I configured it to use DNSSEC and DNS over TLS from the host to the DNS server on the network. As a test, I removed system-resolved and let resolvconf handle configuring /etc/resolv.conf directly, Therefore, all DNS lookups went raw to the network DNS server. These name resolutions now complete in under 5 milliseconds, on average. From the user experience, the sites are instant. Given the average site asks for like 10 domains, before it even starts to display the web page, the drop in time from even 0.5 seconds to 0.005 seconds per domain is noticeable.
drill brutalist.report
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 46507
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;; brutalist.report. IN A
;; ANSWER SECTION:
brutalist.report. 192 IN A 45.32.206.215
;; AUTHORITY SECTION:
;; ADDITIONAL SECTION:
;; Query time: 3 msec
Even if I query with DNSSEC forced, it's still only 5 ms:
drill -D brutalist.report
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 34914
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;; brutalist.report. IN A
;; ANSWER SECTION:
brutalist.report. 110 IN A 45.32.206.215
;; AUTHORITY SECTION:
;; ADDITIONAL SECTION:
;; Query time: 5 msec
;; EDNS: version 0; flags: do ; udp: 1232
If I can't trust my own network, then I should give up. Every host is connected over wireuguard to the VPN server, over either Ethernet or WPA-3 Encrypted 802.3 wireless. I already have basic zerotrust in place with the wireguard connection...in case my wifi or network is compromised somehow.
And there we go, solved 2 issues with one set of debugging.
]]>
Arriving at midday to meet friends, I spotted multiple open chargers and plugged the Bolt straight in. After enjoying some fantastic sandwiches at The Butcher’s Son, I returned about an hour later to see the Bolt had charged from 70% to 85% battery for just $2.42 on the station’s payment screen.
It was amazing how simple it all can be when there are lots of nearby charging locations. There were literally 8 chargers in this garage, of which four were available. And they all work without a silly app, just tap the card and charge away.
It made me think that if SFMTA could put 8 chargers in each of their garages, it would dramatically expand charging access and EV usage in the city.
]]>I started writing a script in Julia to generate stats and pretty graphs, but then realized maybe some stochastic pigeon could help this post along with raw SQL queries. Four hours later, I have functional SQL queries that do what I want. In the four hours it took the pigeon to figure out functional SQL and SQLite specific SQL, I could've written everything myself. However, so be it. These stats are through 2023, which does not include this post.
There are 885 posts from 1998-12-04T22:42:00 through 2023-12-08T07:15:20.731. Yes, we're getting very precise down to the milliseconds a post is created. In normal speak, 1998 to 2023. The SQL for this table is:
SELECT
strftime('%Y', datetime((created_at/1000), 'unixepoch')) AS year,
COUNT(*) AS posts_per_year
FROM posts
GROUP BY year;
year posts_per_year
1998 1
1999 12
2000 19
2010 1
2011 45
2013 1
2014 48
2015 18
2016 200
2017 240
2018 99
2019 69
2020 47
2021 24
2022 34
2023 19
The first thing I notice is I'm missing 2001 through 2010. There's one post in 2010, but seems odd I only posted once in 9 years. I think these missing years are when I migrated to a different domain. Internet Archive Wayback Machine has them, I just have to figure out how to pull them out or find them in some archive. I'm sure an LLM/stochastic pigeon can figure it out pretty easily </sarcasm>. I do have the original posts in plaintext file format buried in archives. I'll figure out how to automate pulling apart the various tarballs and importing the content into Publii. It seems I switched domains, content systems, but kept my sanity in keeping everything in plaintext files throughout it all.
The SQL:
SELECT
strftime('%Y', datetime((created_at/1000), 'unixepoch')) AS year,
strftime('%m', datetime((created_at/1000), 'unixepoch')) AS month,
COUNT(*) AS posts_per_month
FROM posts
GROUP BY year, month;
year month posts_per_month
1998 12 1
1999 1 7
1999 2 3
1999 4 2
2000 3 1
2000 4 4
2000 5 1
2000 6 4
2000 9 8
2000 10 1
2010 3 1
2011 5 5
2011 6 6
2011 7 4
2011 8 6
2011 9 4
2011 10 5
2011 11 7
2011 12 8
2013 8 1
2014 1 5
2014 2 1
2014 3 7
2014 4 3
2014 5 4
2014 6 4
2014 7 3
2014 8 9
2014 9 4
2014 10 2
2014 11 5
2014 12 1
2015 1 3
2015 3 2
2015 4 4
2015 5 2
2015 6 3
2015 9 2
2015 11 1
2015 12 1
2016 1 1
2016 2 4
2016 3 1
2016 4 1
2016 5 28
2016 6 21
2016 7 18
2016 8 11
2016 9 22
2016 10 36
2016 11 29
2016 12 28
2017 1 21
2017 2 11
2017 3 17
2017 4 16
2017 5 40
2017 6 14
2017 7 35
2017 8 25
2017 9 15
2017 10 22
2017 11 10
2017 12 14
2018 1 13
2018 2 8
2018 3 4
2018 4 8
2018 5 5
2018 6 6
2018 7 6
2018 8 9
2018 9 8
2018 10 14
2018 11 8
2018 12 10
2019 1 6
2019 2 3
2019 3 5
2019 4 5
2019 5 6
2019 6 8
2019 7 6
2019 8 4
2019 9 9
2019 10 10
2019 11 2
2019 12 5
2020 1 6
2020 2 6
2020 3 6
2020 4 3
2020 5 4
2020 6 3
2020 7 4
2020 8 2
2020 9 2
2020 10 3
2020 11 3
2020 12 5
2021 1 3
2021 2 3
2021 3 1
2021 4 1
2021 6 2
2021 7 3
2021 8 2
2021 9 1
2021 10 4
2021 11 2
2021 12 2
2022 1 1
2022 2 1
2022 3 1
2022 4 3
2022 5 2
2022 6 5
2022 8 2
2022 9 6
2022 10 2
2022 11 5
2022 12 6
2023 1 1
2023 2 1
2023 3 2
2023 4 1
2023 5 1
2023 6 4
2023 7 2
2023 8 1
2023 9 2
2023 10 2
2023 12 2
Did I really post 40 times in a month in May of 2017? Turns out I did because those are from my trial of Google Plus. For those reading this and not knowing what was Google Plus, Wikipedia has you covered. This blog has outlived so many corporate "social networks", "blog rings", etc. It'll probably outlive Google, Twitter/X, Facebook, etc.
The SQL:
SELECT
strftime('%Y', datetime(created_at/1000, 'unixepoch')) AS year,
ROUND(AVG((LENGTH(text) - LENGTH(REPLACE(text, ' ', ''))) + 1)) AS avg_words_per_post
FROM posts
GROUP BY year;
year avg_words_per_post
1998 14.0
1999 419.0
2000 12673.0
2010 591.0
2011 250.0
2013 595.0
2014 407.0
2015 593.0
2016 162.0
2017 38.0
2018 165.0
2019 221.0
2020 525.0
2021 633.0
2022 972.0
2023 342.0
The year 2000 stands out as an outlier. Otherwise, it seems to ebb and flow with my free time. However, something stands out in the SQL to me. It's not really counting words, it's counting average length of text between spaces in the content. There are actual libraries to do this accurately, so I should re-work this to more accurately reflect what I wanted.
The SQL:
SELECT
strftime('%Y', datetime(created_at/1000, 'unixepoch')) AS year,
ROUND(AVG((LENGTH(text) - LENGTH(REPLACE(text, 'http', ''))) / LENGTH('http'))) AS avg_links_per_post
FROM posts
GROUP BY year;
year avg_links_per_post
1998 0.0
1999 7.0
2000 4.0
2010 11.0
2011 2.0
2013 6.0
2014 4.0
2015 6.0
2016 3.0
2017 2.0
2018 3.0
2019 3.0
2020 7.0
2021 9.0
2022 8.0
2023 4.0
The Google Plus years of short posting, which are generally 1 story or 1 image in a link drags down the average for those years.
I have a few more personal projects to work on, and then I can re-run these SQL queries (and fix them in some cases) to better reflect on the past 25 years of the blog.
]]>In the spirit of a red team, we started down the pathway of using Google and Apple as the access mechanism to track down activists. One of the things that came up was the new acquisition by Google of Firebase. A single service that every Android connects to is too juicy of a target for a government hunting down activists. A larger group of people was hanging out nearby, and one exclaims, "you're a crazy conspiracy theorist! Google defends activists the world over! They fight governments!"
Quite the passionate plea by an activist. Turns out, it wasn't that crazy. Just took ten years to prove it. It turns out "Apple and Google confirm governments spy on users through push notifications".
]]>The first step is to plan out charging and expected battery level for the trip from San Francisco to Yosemite. All my EV-loving friends suggested ABRP. Let's start. Most of the rental EVs around me start off between 25-40% battery level. I'm going to need to charge first, and then get on the road.
This is roughly what I saw when looking at rental EVs in the area. Let's go with quickest trip that leaves me at 100% battery on arrival.
Now, let's throw in our typical stopping point for dinner, Pea Soup Andersen's in Santa Nella. Here's the new starting plan:
Let ABRP calculate the route, charging, and estimated battery charge level at each stop.
Here's the plan:
All in all, not a bad plan from distance and time. The 90 minutes in Oakhurst is the exception to driving a petrol powered car, but I fill up the tank in Oakhurst anyway. It also turns a typically 5 hour trip into 7 hours. So be it.
Rather than go cold-turkey with an EV with a guest halfway across the state, I wanted to do some test runs. I rented the same kind of EV (Chevy Bolt EV) and did a few errands/day trips. The car is great and works like any other car, just electric. It's also small enough to park anywhere in the city.
I had to recharge the car. The car comes with EVgo charging card, but EVgo really, really wants you to install their app and create an account to find the nearest charging station. Since that wasn't happening, I just looked it up on ABRP in a browser. I found a charging station nearby in a parking lot. I drive over there at 22% battery charge. I figure I'll leave the car charging, walk home, come back in a few hours when it's fully charged and then return the car. If only it worked that well.
I get to the charging point to find one car charging already. In the second spot, is a homeless person sleeping. In the third spot is a tourist trying to figure out how to swipe their debit card to pay for the charging. Another person pulls up in a Kia EV6 and asks if they're going to charge or if they're just finished. So the EV6 pulls into the spot with the homeless person and gets out to help the tourist. The tourist is now on the phone with EVgo trying to figure out how to charge without joining EVgo and buying a subscription or something.
Meanwhile, Mr EV6 leaves his car where it is and walks away. He comes back 5 minutes later with a drink and some snacks. He proceeds to sit in his car and wait for...something. Based on the loud conversation the upset tourist is having on the phone, the credit card swipe isn't working, so EVgo is telling him to get the app, subscribe, and pay via rfid/app. It appears the app won't take his address since it's in the EU somewhere.
Is this getting tedious yet? I've already wasted 10 minutes just trying to charge. I walk up to Mr EV6 who is eating in his car with the windows down and music blasting. I ask if he's going to charge or if I could get in. He says he's waiting on one of the two other spots because this spot is broken. It turns out, it's not broken per se, just someone has wiped crap (literally) all over the front of the machine and charging handle. At this point, I wait 5 more minutes. The tourist is now charging somehow and Mr EV6 is still munching away to tunes. Welp, not getting a charge here. I have to return the car in 20 minutes, so I call in and explain the situation. They say just return it and they'll charge it for me. Sigh.
Not being deterred, I tried again a few days later. It didn't go well. I found a charging place, but 2 of 3 charges were broken. I found another place, but it was in a garage and I'd have to pull a ticket and pay for "parking" while I charged.
Given this experience, I swapped the EV for a petrol car. Taking the risk that we arrive at a charging location at 16% battery to find broken or occupied chargers was too much. I'd put up with it as an experience, but subjecting others, especially the first time visitor to California, isn't fair.
I'll try again.
I realize this is a bootstrap problem. Charging stations are still getting deployed, but apparently slower than EV cars are sold. Gas stations have a 80 year head start, so it's not really a fair comparison. If you have home charging, it probably all works great for daily trips. Longer trips still have the same problem of charging on the road.
This is just my experience with a sample size of 2.
]]>]]>
TL;DR, photo album is available. I used deep learning to increase my productivity in publishing the images from Fleet Week airshow.
Fleet Week is in town. This year the weather cooperated and we had clear skies, no fog, and great viewing of the airshow. I took a half day to shoot the airshow practice on Friday the 6th. I asked a stochastic pigeon for the best camera settings for my old Sony 6500. It suggested automatic mode or using 1/2000 shutter speed with ISO 1000. My lens is f/5.6, so no, those settings are incorrect. Unless I want all dark shots emulating an oddly dark and dreary environment. Instead, I read a bunch of writings by various airshow photographers. First, I had to discount their suggested settings because most of them are shooting with full-format cameras and $10-20k fixed telephoto lens (300mm, 400mm or higher). I don't have a $30k setup. I have a refurb Sony α6500 with a refurb 100-400 mm lens.
I finally arrived on 1/1000 shutter speed with floating ISO limited to 100-1000. I set the lens to prefer infinity and set the shutter to continuous mid range (roughly 5 shots per second). I then rode my bike down to the waterfront to find a good spot for shooting. It was a perfectly clear day with a nice breeze. I brought my monopod, but mostly just freehand shot everything. I need a multi-axis gimbal to properly handle the sweeps fast enough.
The good thing is that being on the waterfront puts me closest to the action, In fact, a few times the 100mm minimum was too zoomed in and I only got partial shots.
After 3 hours, I filled my sdcard and went through one and a half batteries. The good is that the camera settings and the location worked great. The challenge is I now have to sort through 2,576 images.
I started sorting with my usual process:
1. remove all out of focus, horrible exposure, and horrible composition images.
2. look through the bursts for the best composed, most in-focus shots.
3. repeat #2 until we're down to a few hundred images.
4. add tags, keywords, and metadata.
This process got old quick. I looked for automation to help me parse the images. I used photoprism to ingest the images and do some automatic object recognition. I then used digikam's new "image quality sort" feature to well, sort the image by quality. The deep learning model it uses is based upon this model. Lacking any better way to sort, I let the deep learning algorithm loose on my 2,576 photos. After burning through cpu for far too long (why doesn't opencl use the amdgpu? beyond me), the algorithm had 390 acceptable images, 1,212 barely acceptable, and 470 rejected images. I put the 390 acceptable images into a photo album.
I need to further pare it down, as 390 is still too many, and still too repetitive in it's selection. I need a "critics choice" deep learning model for extra refinement of the images. Another option is to re-run the algorithm on the 390 accepted images, and repeat until we're down to the last 25 or 50 or so "best images". However, as is, the 390 choice in an hour or so is vastly faster than I could do it manually.
I consider it a win. Previously, previously, previously, previously, and previously.
]]>