Tagsistant

Tagsistant

Tagsistant is a semantic file system for the Linux kernel, written in C and based on FUSE. Unlike traditional file systems that use hierarchies of directories to locate objects, Tagsistant introduces the concept of tags. == Design and differences with hierarchical file systems == In computing, a file system is a type of data store which could be used to store, retrieve and update files. Each file can be uniquely located by its path. The user must know the path in advance to access a file and the path does not necessarily include any information about the content of the file. Tagsistant uses a complementary approach based on tags. The user can create a set of tags and apply those tags to files, directories and other objects (devices, pipes, ...). The user can then search all the objects that match a subset of tags, called a query. This kind of approach is well suited for managing user contents like pictures, audio recordings, movies and text documents but is incompatible with system files (like libraries, commands and configurations) where the univocity of the path is a security requirement to prevent the access to a wrong content. == The tags/ directory == A Tagsistant file system features four main directories: archive/ relations/ stats/ tags/ Tags are created as sub directories of the tags/ directory and can be used in queries complying to this syntax: tags/subquery/[+/subquery/[+/subquery/]]/@/ where a subquery is an unlimited list of tags, concatenated as directories: tag1/tag2/tag3/.../tagN/ The portion of a path delimited by tags/ and @/ is the actual query. The +/ operator joins the results of different sub-queries in one single list. The @/ operator ends the query. To be returned as a result of the following query: tags/t1/t2/+/t1/t4/@/ an object must be tagged as both t1/ and t2/ or as both t1/ and t4/. Any object tagged as t2/ or t4/, but not as t1/ will not be retrieved. The query syntax deliberately violates the POSIX file system semantics by allowing a path token to be a descendant of itself, like in tags/t1/t2/+/t1/t4/@ where t1/ appears twice. As a consequence a recursive scan of a Tagsistant file system will exit with an error or endlessly loop, as done by Unix find: This drawback is balanced by the possibility to list the tags inside a query in any order. The query tags/t1/t2/@/ is completely equivalent to tags/t2/t1/@/ and tags/t1/+/t2/t3/@/ is equivalent to tags/t2/t3/+/t1/@/. The @/ element has the precise purpose of restoring the POSIX semantics: the path tags/t1/@/directory/ refers to a traditional directory and a recursive scan of this path will properly perform. == The reasoner and the relations/ directory == Tagsistant features a simple reasoner which expands the results of a query by including objects tagged with related tags. A relation between two tags can be established inside the relations/ directory following a three level pattern: relations/tag1/rel/tag2/ The rel element can be includes or is_equivalent. To include the rock tag in the music tag, the Unix command mkdir can be used: mkdir -p relations/music/includes/rock The reasoner can recursively resolve relations, allowing the creation of complex structures: mkdir -p relations/music/includes/rock mkdir -p relations/rock/includes/hard_rock mkdir -p relations/rock/includes/grunge mkdir -p relations/rock/includes/heavy_metal mkdir -p relations/heavy_metal/includes/speed_metal The web of relations created inside the relations/ directory constitutes a basic form of ontology. == Autotagging plugins == Tagsistant features an autotagging plugin stack which gets called when a file or a symlink is written. Each plugin is called if its declared MIME type matches The list of working plugins released with Tagsistant 0.6 is limited to: text/html: tags the file with each word in and <keywords> elements and with document, webpage and html too image/jpeg: tags the file with each Exif tag == The repository == Each Tagsistant file system has a corresponding repository containing an archive/ directory where the objects are actually saved and a tags.sql file holding tagging information as an SQLite database. If the MySQL database engine was specified with the --db argument, the tags.sql file will be empty. Another file named repository.ini is a GLib ini store with the repository configuration. Tagsistant 0.6 is compatible with the MySQL and Sqlite dialects of SQL for tag reasoning and tagging resolution. While porting its logic to other SQL dialects is possible, differences in basic constructs (especially the INTERSECT SQL keyword) must be considered. == The archive/ and stats/ directories == The archive/ directory has been introduced to provide a quick way to access objects without using tags. Objects are listed with their inode number prefixed. The stats/ directory features some read-only files containing usage statistics. A file configuration holds both compile time information and current repository configuration. == Main criticisms == It has been highlighted that relying on an external database to store tags and tagging information could cause the complete loss of metadata if the database gets corrupted. It has been highlighted that using a flat namespace tends to overcrowd the tags/ directory. This could be mitigated introducing triple tags.</p> <h2><a href="https://8325.aizhi.co/html/194b999796.html" title="Security of the Java software platform">Security of the Java software platform</a></h2> <p>The Java software platform provides a number of features designed for improving the security of Java applications. This includes enforcing runtime constraints through the use of the Java Virtual Machine (JVM), a security manager that sandboxes untrusted code from the rest of the operating system, and a suite of security APIs that Java developers can utilise. Despite this, criticism has been directed at the programming language, and Oracle, due to an increase in malicious programs that revealed security vulnerabilities in the JVM, which were subsequently not properly addressed by Oracle in a timely manner. == Security features == === The JVM === The binary form of programs running on the Java platform is not native machine code but an intermediate bytecode. The JVM performs verification on this bytecode before running it to prevent the program from performing unsafe operations such as branching to incorrect locations, which may contain data rather than instructions. It also allows the JVM to enforce runtime constraints such as array bounds checking. This means that Java programs are significantly less likely to suffer from memory safety flaws such as buffer overflow than programs written in languages such as C which do not provide such memory safety guarantees. The platform does not allow programs to perform certain potentially unsafe operations such as pointer arithmetic or unchecked type casts. It manages memory allocation and initialization and provides automatic garbage collection which in many cases (but not all) relieves the developer from manual memory management. This contributes to type safety and memory safety. === Security manager === The platform provides a security manager which allows users to run untrusted bytecode in a "sandboxed" environment designed to protect them from malicious or poorly written software by preventing the untrusted code from accessing certain platform features and APIs. For example, untrusted code might be prevented from reading or writing files on the local filesystem, running arbitrary commands with the current user's privileges, accessing communication networks, accessing the internal private state of objects using reflection, or causing the JVM to exit. The security manager also allows Java programs to be cryptographically signed; users can choose to allow code with a valid digital signature from a trusted entity to run with full privileges in circumstances where it would otherwise be untrusted. Users can also set fine-grained access control policies for programs from different sources. For example, a user may decide that only system classes should be fully trusted, that code from certain trusted entities may be allowed to read certain specific files, and that all other code should be fully sandboxed. === Security APIs === The Java Class Library provides a number of APIs related to security, such as standard cryptographic algorithms, authentication, and secure communication protocols. === The sun.misc.Unsafe class === sun.misc.Unsafe is an internal utility class in the Java programming language which is a collection of low-level unsafe operations. While it is not a part of the official Java Class Library, it is called internally by the Java libraries. It resides in an unofficial Java module named jdk.unsupported. Beginning in Java 11, it has been partially migrated to jdk.internal.misc.Unsafe (which resides in module java.base). Its primary feature is to allow direct memory management (similar to C memory management) and memory address manipulation, manipulating objects and fields, thread manipulation, and concurrency primitives. Its declaration is: public final class Unsafe;, and it is a singleton class with a private constructor. It contains the following methods, many of which are declared native (invoking Java Native Interface): static Unsafe getUnsafe(): retrieves the Unsafe instance. It uses sun.reflect.Reflection to do so. int getInt(Object o, long offset): fetches a value (a field or array element) in the object at the given offset. (There are corresponding getBoolean(), getByte(), getShort(), getChar(), getLong(), getFloat(), and getDouble() methods as well.) void putInt(Object o, long offset, int x): stores a value into an object at the given offset. (There are corresponding putBoolean(), putByte(), putShort(), putChar(), putLong(), putFloat(), and putDouble() methods as well.) Object getObject(Object o, long offset): fetches a reference value from an object at the given offset. void putObject(Object o, long offset, Object x): stores a reference value into an object at the given offset. int getInt(long address): fetches a value at the given address. (There are corresponding getBoolean(), getByte(), getShort(), getChar(), getLong(), getFloat(), and getDouble() methods as well.) void putInt(long address, int x): stores a value into the given address. (There are corresponding putBoolean(), putByte(), putShort(), putChar(), putLong(), putFloat(), and putDouble() methods as well.) long getAddress(long address): fetches a native pointer from a given address. void putAddress(long address, long x): stores a native pointer into a given address. long allocateMemory(long bytes): allocates a block of native memory of the given size (similar to malloc()). long reallocateMemory(long address, long bytes): resizes a block of native memory to the given size (similar to realloc()). void setMemory(Object o, long offset, long bytes, byte value), void setMemory(long address, long bytes, byte value): sets all bytes in a block of memory to a fixed value (similar to memset()). void copyMemory(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes), void copyMemory(long srcAddress, long destAddress, long bytes): sets all bytes in a given block of memory to a copy of another block (similar to memcpy()). void freeMemory(long address): deallocates a block of native memory obtained from allocateMemory() or reallocateMemory(), similar to free()). long staticFieldOffset(Field f): obtains the location of a given field in the storage allocation of its class. long objectFieldOffset(Field f): obtains the location of a given static field in conjunction with staticFieldBase(). Object staticFieldBase(Field f): obtains the location of a given static field in conjunction with staticFieldOffset(). void ensureClassInitialized(Class<?> c): ensures the given class has been initialized. int arrayBaseOffset(Class<?> arrayClass): obtains the offset of the first element in the storage allocation of a given array class. int arrayIndexScale(Class<?> arrayClass): obtains the scale factor for addressing elements in the storage allocation of a given array class. static int addressSize(): obtains the size (in bytes) of a native pointer. int pageSize(): obtains the size (in bytes) of a native memory page. Class<?> defineClass(String name, byte[] b, int off, int len, ClassLoader loader, ProtectionDomain protectionDomain): signals to the JVM to define a class without security checks. Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches): signals to the JVM to define a class but do not make it known to the class loader or system directory. Object allocateInstance(Class<?> cls) throws InstantiationException: allocates an instance of a class without running its constructor. void monitorEnter(Object o): locks an object. void monitorExit(Object o): unlocks an object. boolean tryMonitorEnter(Object o): tries to lock an object, returning whether the lock succeeded. void throwException(Throwable ee): throws an exception without telling the verifier. final boolean compareAndSwapInt(Object o, long offset, int expected, int x): updates a variable to x if it is holding expected, returning whether the operation succeeded. (There are corresponding compareAndSwapLong() and compareAndSwapObject() methods as well.) int getIntVolatile(Object o, long offset): volatile version of getInt(). (There are corresponding getBooleanVolatile(), getByteVolatile(), getShortVolatile(), getCharVolatile(), getLongVolatile(), getFloatVolatile(), getDoubleVolatile(), and getObjectVolatile() methods as well.) void putIntVolatile(Object o, long offset, int x): volatile version of putInt(). (There are corresponding putBooleanVolatile(), putByteVolatile(), putShortVolatile(), putCharVolatile(), putLongVolatile(), putFloatVolatile(), putDoubleVolatile(), and putObjectVolatile() methods as well.) void putOrderedInt(Object o, long offset, int x): version of putIntVolatile() not guaranteeing immediate visibility of storage to other threads. (There are corresponding putOrderedLong() and putOrderedObject() methods as well.) void unpark(Object thread): unblocks a thread. void park(boolean isAbsolute, long time): blocks the current thread. int getLoadAverage(double[] loadavg, int nelems): gets the load average in the system run queue assigned to available processors averaged over various periods of time. void invokeCleaner(ByteBuffe</p> <h2><a href="https://8325.aizhi.co/html/898d3299069.html" title="How to Choose an AI Marketing Tool">How to Choose an AI Marketing Tool</a></h2> <p>Curious about the best AI marketing tool? An AI marketing tool is software that uses machine learning to help you get more done — it combines speed, accuracy, and an interface that just works. Hands-on testing shows real-world results vary, so a short free trial is the smartest way to decide. Whether you are a beginner or a pro, the right AI marketing tool slots into your workflow and pays for itself fast. This guide breaks down the top picks, their pros and cons, and who each one is best for.</p> <h2><a href="https://8325.aizhi.co/html/332d3299635.html" title="Sasha Luccioni">Sasha Luccioni</a></h2> <p>Alexandra Sasha Luccioni (née Vorobyova; born 1990) is a computer scientist specializing in the intersection of artificial intelligence (AI) and climate change. Her work focuses on quantifying the environmental impact of AI technologies and promoting sustainable practices in machine learning development. == Early life and education == Alexandra Sasha Vorobyova was born in the Ukrainian Soviet Socialist Republic in 1990. When she was four years old, her family relocated to Ontario, Canada. Her interest in science is influenced by her family's history; her mother, grandmother, and great-grandmother all pursued careers in scientific fields. Luccioni earned a B.A. in language science from University of Paris III: Sorbonne Nouvelle in 2010. Subsequently, she completed a M.S. in cognitive science, with a minor in natural language processing, at École normale supérieure in Paris in 2012. Luccioni obtained her PhD in cognitive computing from Université du Québec à Montréal (UQAM) in 2018. == Career == Luccioni began her professional career at Nuance Communications in 2017, where she focused on natural language processing (NLP) and machine learning (ML) techniques to enhance conversational agents. She then joined Morgan Stanley’s AI/ML Center of Excellence in 2018, working on explainable artificial intelligence (AI) and decision-making systems. In 2019, she became a postdoctoral researcher at Université de Montréal and Mila, collaborating with computer scientist Yoshua Bengio on a project titled This Climate Does Not Exist. This initiative used generative adversarial networks to visualize the effects of climate change. During this time, she also contributed to integrating fairness and accountability into machine learning education at Mila. Luccioni briefly worked with the United Nations Global Pulse in 2021, developing tools to monitor COVID-19 misinformation. Later that year, she joined Hugging Face as a research scientist. Her role includes quantifying the carbon footprint of AI systems, co-chairing the carbon working group in the Big Science project, and advancing responsible machine learning practices. She helped create "CodeCarbon," an open-source software tool that estimates the carbon emissions produced during the training and operation of machine learning models. In addition to her research, she has developed tools to measure the environmental impact of AI models, communicated findings through media engagements, and presented at international conferences, including a TED Talk. In 2024, she was listed on BBC 100 Women and Time 100 AI.</p> <h2><a href="https://8325.aizhi.co/html/017e3299950.html" title="Best AI Writing Assistants in 2026">Best AI Writing Assistants in 2026</a></h2> <p>In search of the best AI writing assistant? An AI writing assistant is software that uses machine learning to help you get more done — it turns a rough idea into a polished result in seconds. When choosing one, weigh output quality, pricing, export formats, and how well it fits the tools you already use. Whether you are a beginner or a pro, the right AI writing assistant slots into your workflow and pays for itself fast. Below we compare features, pricing, and real output so you can choose with confidence.</p> <h2><a href="https://8325.aizhi.co/html/234d299763.html" title="Photometric stereo">Photometric stereo</a></h2> <p>Photometric stereo is a technique in computer vision for estimating the surface normals of objects by observing that object under different lighting conditions (photometry). It is based on the fact that the amount of light reflected by a surface is dependent on the orientation of the surface in relation to the light source and the observer. By measuring the amount of light reflected into a camera, the space of possible surface orientations is limited. Given enough light sources from different angles, the surface orientation may be constrained to a single orientation or even overconstrained. The technique was originally introduced by Woodham in 1980. The special case where the data is a single image is known as shape from shading, and was analyzed by B. K. P. Horn in 1989. Photometric stereo has since been generalized to many other situations, including extended light sources and non-Lambertian surface finishes. Current research aims to make the method work in the presence of projected shadows, highlights, and non-uniform lighting. Photometric stereo is widely used in various fields, including archaeology, cultural heritage conservation, and quality control. It is now integrated into widely used open-source software, such as Meshroom. == Basic method == Under Woodham's original assumptions — Lambertian reflectance, known point-like distant light sources, and uniform albedo — the problem can be solved by inverting the linear equation I = L ⋅ n {\displaystyle I=L\cdot n} , where I {\displaystyle I} is a (known) vector of m {\displaystyle m} observed intensities, n {\displaystyle n} is the (unknown) surface normal, and L {\displaystyle L} is a (known) 3 × m {\displaystyle 3\times m} matrix of normalized light directions. This model can easily be extended to surfaces with non-uniform albedo, while keeping the problem linear. Taking an albedo reflectivity of k {\displaystyle k} , the formula for the reflected light intensity becomes I = k ( L ⋅ n ) . {\displaystyle I=k(L\cdot n).} If L {\displaystyle L} is square (there are exactly 3 lights) and non-singular, it can be inverted, giving L − 1 I = k n . {\displaystyle L^{-1}I=kn.} Since the normal vector is known to have length 1, k {\displaystyle k} must be the length of the vector k n {\displaystyle kn} , and n {\displaystyle n} is the normalised direction of that vector. If L {\displaystyle L} is not square (there are more than 3 lights), a generalisation of the inverse can be obtained using the Moore–Penrose pseudoinverse, by simply multiplying both sides with L T {\displaystyle L^{T}} , giving L T I = L T k ( L ⋅ n ) , {\displaystyle L^{T}I=L^{T}k(L\cdot n),} ( L T L ) − 1 L T I = k n , {\displaystyle (L^{T}L)^{-1}L^{T}I=kn,} after which the normal vector and albedo can be solved as described above. == Non-Lambertian surfaces == The classical photometric stereo problem concerns itself only with Lambertian surfaces, with perfectly diffuse reflection. This is unrealistic for many types of materials, especially metals, glass and smooth plastics, and will lead to aberrations in the resulting normal vectors. Many methods have been developed to lift this assumption. In this section, a few of these are listed. === Specular reflections === Historically, in computer graphics, the commonly used model to render surfaces started with Lambertian surfaces and progressed first to include simple specular reflections. Computer vision followed a similar course with photometric stereo. Specular reflections were among the first deviations from the Lambertian model. These are a few adaptations that have been developed. Many techniques ultimately rely on modelling the reflectance function of the surface, that is, how much light is reflected in each direction. This reflectance function has to be invertible. The reflected light intensities towards the camera is measured, and the inverse reflectance function is fit onto the measured intensities, resulting in a unique solution for the normal vector. === General BRDFs and beyond === According to the Bidirectional reflectance distribution function (BRDF) model, a surface may distribute the amount of light it receives in any outward direction. This is the most general known model for opaque surfaces. Some techniques have been developed to model (almost) general BRDFs. In practice, all of these require many light sources to obtain reliable data. These are methods in which surfaces with general BRDFs can be measured. Determine the explicit BRDF prior to scanning. To do this, a different surface is required that has the same or a very similar BRDF, of which the actual geometry (or at least the normal vectors for many points on the surface) is already known. The lights are then individually shone upon the known surface, and the amount of reflection into the camera is measured. Using this information, a look-up table can be created that maps reflected intensities for each light source to a list of possible normal vectors. This puts constraints on the possible normal vectors the surface may have, and reduces the photometric stereo problem to an interpolation between measurements. Typical known surfaces to calibrate the look-up table with are spheres for their wide variety of surface orientations. Restricting the BRDF to be symmetrical. If the BRDF is symmetrical, the direction of the light can be restricted to a cone about the direction to the camera. Which cone this is depends on the BRDF itself, the normal vector of the surface, and the measured intensity. Given enough measured intensities and the resulting light directions, these cones can be approximated and therefore the normal vectors of the surface. Some progress has been made towards modelling an even more general surfaces, such as Spatially Varying Bidirectional Distribution Functions (SVBRDF), Bidirectional surface scattering reflectance distribution functions (BSSRDF), and accounting for interreflections. However, such methods are still fairly restrictive in photometric stereo. Better results have been achieved with structured light. == Uncalibrated photometric stereo == Uncalibrated Photometric Stereo is an approach in photometric stereo that aims to reconstruct the 3D shape of an object from images captured under unknown lighting conditions. Unlike classical methods, which often assume controlled or known lighting setups, this approach removes these constraints, making it adaptable to diverse and real-world environments. The advent of deep learning has revolutionized universal PS by replacing handcrafted assumptions with data-driven models. Recent approaches leverage Transformer-based architectures and multi-scale encoder–decoder networks to directly estimate surface normals from input images. Uncalibrated Photometric Stereo is inherently an ill-posed problem, as it attempts to recover 3D shape and lighting conditions simultaneously from images alone. This leads to fundamental ambiguities in the reconstruction process, which manifest as systematic errors in the recovered geometry, including global distortions in the object's overall shape, and misinterpretation of surface orientation, where concave regions may appear convex and vice versa. To address the challenges of uncalibrated photometric stereo, hybrid methods have emerged that combine multi-view stereo and photometric stereo. These approaches leverage the strengths of both techniques, including geometric reliability and resolution.</p> <h2><a href="https://8325.aizhi.co/html/902e3299065.html" title="Best AI Video Generators in 2026">Best AI Video Generators in 2026</a></h2> <p>Curious about the best AI video generator? An AI video generator is software that uses machine learning to help you get more done — it combines speed, accuracy, and an interface that just works. Hands-on testing shows real-world results vary, so a short free trial is the smartest way to decide. Whether you are a beginner or a pro, the right AI video generator slots into your workflow and pays for itself fast. Read on for hands-on impressions, pricing tiers, and the standout features that matter.</p> </div> <nav class="article-pagination" aria-label="More guides"> <div class="prev-article"> <span>← Previous</span> <a href="https://8325.aizhi.co/html/283a299714.html" title="Neural field">Neural field</a> </div> <div class="next-article"> <span>Next →</span> <a href="https://8325.aizhi.co/html/311d999679.html" title="Computers & Graphics">Computers & Graphics</a> </div> </nav> </article> <section class="related-articles" aria-label="Related articles"> <h2>Related Articles</h2> <ul> <li> <a href="https://8325.aizhi.co/html/031c199967.html" title="List of Haskell software and tools">List of Haskell software and tools</a> <time datetime="2026-06-03 10:54">2026-06-03 10:54</time> </li> <li> <a href="https://8325.aizhi.co/html/348f3299619.html" title="Yun Sing Koh">Yun Sing Koh</a> <time datetime="2026-06-03 10:18">2026-06-03 10:18</time> </li> <li> <a href="https://8325.aizhi.co/html/393a3299574.html" title="Katia Sycara">Katia Sycara</a> <time datetime="2026-06-03 10:05">2026-06-03 10:05</time> </li> <li> <a href="https://8325.aizhi.co/html/020c3299947.html" title="Human-readable medium and data">Human-readable medium and data</a> <time datetime="2026-06-03 09:55">2026-06-03 09:55</time> </li> <li> <a href="https://8325.aizhi.co/html/093b199905.html" title="Toad Data Modeler">Toad Data Modeler</a> <time datetime="2026-06-03 09:27">2026-06-03 09:27</time> </li> <li> <a href="https://8325.aizhi.co/html/925e3299042.html" title="Top 10 AI Text-to-image Tools Compared (2026)">Top 10 AI Text-to-image Tools Compared (2026)</a> <time datetime="2026-06-03 09:02">2026-06-03 09:02</time> </li> </ul> </section> </main> <aside class="sidebar"> <section class="sidebar-section"> <h2>Categories</h2> <ul> <li><a href="https://8325.aizhi.co/ainewsandguides/">AI News and Guides</a></li><li><a href="https://8325.aizhi.co/aiforbusiness/">AI for Business</a></li><li><a href="https://8325.aizhi.co/aiimagegenerators/">AI Image Generators</a></li><li><a href="https://8325.aizhi.co/aicodingtools/">AI Coding Tools</a></li><li><a href="https://8325.aizhi.co/aiwritingtools/">AI Writing Tools</a></li><li><a href="https://8325.aizhi.co/aivideotools/">AI Video Tools</a></li><li><a href="https://8325.aizhi.co/aichatbotsandassistants/">AI Chatbots and Assistants</a></li> </ul> </section> <section class="sidebar-section"> <h2>Latest Articles</h2> <ul> <li><a href="https://1.aizhi.co/html/229f299768.html" title="Scale space">Scale space</a></li><li><a href="https://mf.aizhi.co/html/65e3299902.html" title="Forrest N. Iandola">Forrest N. Iandola</a></li><li><a href="https://am4.aizhi.co/html/91a3299876.html" title="Ali Farhadi">Ali Farhadi</a></li><li><a href="https://16314.aizhi.co/html/351d3299616.html" title="Larry Heck">Larry Heck</a></li><li><a href="https://oif.aizhi.co/html/379c299618.html" title="Facial age estimation">Facial age estimation</a></li><li><a href="https://7r.aizhi.co/html/206e3299761.html" title="F-score">F-score</a></li><li><a href="https://8.aizhi.co/html/1f3299966.html" title="Google matrix">Google matrix</a></li><li><a href="https://xhe.aizhi.co/html/33b3299934.html" title="Markov chain central limit theorem">Markov chain central limit theorem</a></li><li><a href="https://srp2iv8.aizhi.co/html/102d299895.html" title="BERT (language model)">BERT (language model)</a></li><li><a href="https://77765.aizhi.co/html/259f3299708.html" title="Gato (DeepMind)">Gato (DeepMind)</a></li> </ul> </section> </aside> </div> </div> </div> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div class="footer-col footer-about"> <a class="brand" href="https://8325.aizhi.co/" aria-label="Aizhi"> <span class="brand-mark" aria-hidden="true">✦</span> <span class="brand-text">Aizhi</span> </a> <p class="footer-tagline">Hand-picked AI tools, generators and practical how-to guides — independent reviews, updated for 2026.</p> </div> <nav class="footer-col" aria-label="Categories"> <h2 class="footer-h">Categories</h2> <ul> <li><a href="https://8325.aizhi.co/aiwritingtools/">AI Writing Tools</a></li><li><a href="https://8325.aizhi.co/aichatbotsandassistants/">AI Chatbots and Assistants</a></li><li><a href="https://8325.aizhi.co/ainewsandguides/">AI News and Guides</a></li><li><a href="https://8325.aizhi.co/aiforbusiness/">AI for Business</a></li><li><a href="https://8325.aizhi.co/aivideotools/">AI Video Tools</a></li><li><a href="https://8325.aizhi.co/aicodingtools/">AI Coding Tools</a></li><li><a href="https://8325.aizhi.co/aiimagegenerators/">AI Image Generators</a></li> </ul> </nav> <nav class="footer-col" aria-label="Site"> <h2 class="footer-h">Site</h2> <ul> <li><a href="https://8325.aizhi.co/">Home</a></li> <li><a href="/sitemap.xml">XML Sitemap</a></li> </ul> </nav> </div> <div class="partner-links" aria-label="Network"> </div> <p class="footer-copy"> © Aizhi. All rights reserved. </p> </div> </footer> </body> </html>