To ensure security, you should disallow the use of common and easily guessable 4-digit PINs. Here’s a list of such PINs to block:
- Sequential Numbers:
- 1234
- 2345
- 3456
- 4567
- 5678
- 6789
- 7890
To ensure security, you should disallow the use of common and easily guessable 4-digit PINs. Here’s a list of such PINs to block:
With this solution, there is no CGI programming. One innefficency of CGI programming is that every request spawns another process which can be costly when there are many requests. Instead the work with this solution is done up front by generating the output from the JSON files to static files. Incoming requests are handled by rewrite rules supported by the web server which are handled in process and very quickly.
Changes can be made to the JSON files and re-run the generation script which will create output to a temporary directory and then rsync the changes to the directory used by the rewrite rules. This way removed profiles will also be removed from the web server.
(from ChatGPT)
On Bluesky and other ATProto-based platforms, users can associate their accounts with their own domain names instead of relying on service-owned subdomains. To do this, you need to prove that you control the domain by publishing a special file at a specific, “well-known” location or by adding a DNS record. Once verified, your account’s handle can become something like @username.example.com
instead of @username.bsky.social
.
For organizations that want to create multiple user accounts, using a separate hostname for each user makes management easier. By setting up a wildcard DNS record (e.g., *.example.com
), you can quickly create new hostnames for any user without having to run separate websites or add individual DNS entries. Each of these hostnames can return a unique DID (Decentralized Identifier) to ATProto services through a simple, automated process.
In the following example, DID values are stored as simple JSON files. A small CGI scri
From ChatGPT:
Below is a step-by-step guide and example setup showing how you might structure an ESP32-based Matter + Thread project using the Arduino framework within VS Code and PlatformIO. This is a conceptual walkthrough intended for beginners who are totally new to Matter and Thread. Please note that Matter and Thread support for Arduino on ESP32 is still quite limited and experimental. The code and steps below are for illustrative purposes, showing how you would approach organizing such a project. Actual implementation may require additional tooling, libraries, and following the evolving Matter ecosystem.
This code supports running a sequence of tasks with serial behavior or concurrently with max concurrent tasks. The tasks which are queued can even be constrained to a global actor like @MainActor
or a custom global actor.
This API mimics NSOperationQueue which was available prior to Dispatch. It supports max concurrent tasks and other features. One feature is barrier tasks. Normally tasks are allowed to run concurrently. When a task is a barrier it will be run serially. All pending tasks will be allowed to complete and then a the lone barrier task will be run. Then other tasks can run as before. This is a useful behavior to use when multiple tasks do work and a barrier task can run after them to gather the outputs before running another set of tasks to do more processing.
To get started with implementing your custom feed and moderation services using the ATProtoKit Swift package, follow these steps:
First, clone the ATProtoKit repository to review the examples and understand the package:
git clone https://github.com/MasterJ93/ATProtoKit.git
cd ATProtoKit
#!/bin/bash | |
usage() { | |
echo "Usage: $0 <folder_name>" | |
echo "Provide the name of an existing directory to be zipped." | |
} | |
run() { | |
local DIRECTORY_NAME="$1" |
private let lock = NSRecursiveLock() // Lock for thread-safe access | |
func sync<T>(@_implicitSelfCapture operation: @escaping @Sendable () throws -> T) rethrows -> T { | |
lock.lock() | |
defer { lock.unlock() } | |
return try operation() | |
} | |
func doWork() { | |
sync { |
extension ThrowingTaskGroup { | |
func reduceAll() async throws -> [Element] { | |
try await reduce(into: []) { $0.append($1) } | |
} | |
} |