diff --git a/1c-enterprise/daily/index.xml b/1c-enterprise/daily/index.xml
index bebc400ba38..1b094be58fc 100644
--- a/1c-enterprise/daily/index.xml
+++ b/1c-enterprise/daily/index.xml
@@ -1,7 +1,7 @@
GitHub 1C Enterprise Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:23:42Z
+ 2023-10-11T01:23:23Z
Daily Trending of 1C Enterprise in GitHub
\ No newline at end of file
diff --git a/2-dimensional-array/daily/index.xml b/2-dimensional-array/daily/index.xml
index 34f31b629d1..66a85cae577 100644
--- a/2-dimensional-array/daily/index.xml
+++ b/2-dimensional-array/daily/index.xml
@@ -1,7 +1,7 @@
GitHub 2-Dimensional Array Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:09Z
+ 2023-10-11T01:23:56Z
Daily Trending of 2-Dimensional Array in GitHub
\ No newline at end of file
diff --git a/4d/daily/index.xml b/4d/daily/index.xml
index 4752fa8f12c..fcf1aa530a5 100644
--- a/4d/daily/index.xml
+++ b/4d/daily/index.xml
@@ -1,7 +1,7 @@
GitHub 4D Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:10Z
+ 2023-10-11T01:23:55Z
Daily Trending of 4D in GitHub
\ No newline at end of file
diff --git a/abap-cds/daily/index.xml b/abap-cds/daily/index.xml
index 2b7d40ecb0c..2a04081e595 100644
--- a/abap-cds/daily/index.xml
+++ b/abap-cds/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ABAP CDS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:11Z
+ 2023-10-11T01:23:56Z
Daily Trending of ABAP CDS in GitHub
\ No newline at end of file
diff --git a/abap/daily/index.xml b/abap/daily/index.xml
index 4669e20faf6..ddbda0df340 100644
--- a/abap/daily/index.xml
+++ b/abap/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ABAP Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:12Z
+ 2023-10-11T01:23:58Z
Daily Trending of ABAP in GitHub
\ No newline at end of file
diff --git a/abnf/daily/index.xml b/abnf/daily/index.xml
index 2317996dfb9..e8b7b8d2836 100644
--- a/abnf/daily/index.xml
+++ b/abnf/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ABNF Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:13Z
+ 2023-10-11T01:24:02Z
Daily Trending of ABNF in GitHub
\ No newline at end of file
diff --git a/actionscript/daily/index.xml b/actionscript/daily/index.xml
index 714edc32a7e..0fea1abe293 100644
--- a/actionscript/daily/index.xml
+++ b/actionscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ActionScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:14Z
+ 2023-10-11T01:23:59Z
Daily Trending of ActionScript in GitHub
\ No newline at end of file
diff --git a/ada/daily/index.xml b/ada/daily/index.xml
index 2427db97699..4c7639187c1 100644
--- a/ada/daily/index.xml
+++ b/ada/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Ada Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:15Z
+ 2023-10-11T01:24:01Z
Daily Trending of Ada in GitHub
\ No newline at end of file
diff --git a/adobe-font-metrics/daily/index.xml b/adobe-font-metrics/daily/index.xml
index ad0461c56eb..705798c3b27 100644
--- a/adobe-font-metrics/daily/index.xml
+++ b/adobe-font-metrics/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Adobe Font Metrics Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:17Z
+ 2023-10-11T01:24:05Z
Daily Trending of Adobe Font Metrics in GitHub
\ No newline at end of file
diff --git a/agda/daily/index.xml b/agda/daily/index.xml
index aefc8ea37fe..56bd6ff7a74 100644
--- a/agda/daily/index.xml
+++ b/agda/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Agda Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:20Z
+ 2023-10-11T01:24:04Z
Daily Trending of Agda in GitHub
\ No newline at end of file
diff --git a/ags-script/daily/index.xml b/ags-script/daily/index.xml
index 60c6d2093d7..bc8b7e78518 100644
--- a/ags-script/daily/index.xml
+++ b/ags-script/daily/index.xml
@@ -1,7 +1,7 @@
GitHub AGS Script Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:18Z
+ 2023-10-11T01:24:06Z
Daily Trending of AGS Script in GitHub
\ No newline at end of file
diff --git a/aidl/daily/index.xml b/aidl/daily/index.xml
index 0db2bc87f55..2e484b0a983 100644
--- a/aidl/daily/index.xml
+++ b/aidl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub AIDL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:19Z
+ 2023-10-11T01:24:03Z
Daily Trending of AIDL in GitHub
\ No newline at end of file
diff --git a/al/daily/index.xml b/al/daily/index.xml
index 71da4cacbfa..238ac139750 100644
--- a/al/daily/index.xml
+++ b/al/daily/index.xml
@@ -1,7 +1,7 @@
GitHub AL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:24Z
+ 2023-10-11T01:24:09Z
Daily Trending of AL in GitHub
\ No newline at end of file
diff --git a/all/daily/index.xml b/all/daily/index.xml
index bd3635574ac..68bd0f95c96 100644
--- a/all/daily/index.xml
+++ b/all/daily/index.xml
@@ -1,28 +1,28 @@
GitHub All Languages Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:23:53Z
+ 2023-10-11T01:23:33Z
Daily Trending of All Languages in GitHub
- microsoft/promptflow
- 2023-10-10T01:23:53Z
- tag:github.com,2023-10-10:/microsoft/promptflow
-
- <p>Build high-quality LLM apps - from prototyping, testing to production deployment and monitoring.</p><hr><h1>Prompt flow</h1>
<p><a href="https://pypi.org/project/promptflow/"><img src="https://img.shields.io/pypi/v/promptflow" alt="Python package"></a> <a href="https://pypi.python.org/pypi/promptflow/"><img src="https://img.shields.io/pypi/pyversions/promptflow.svg?maxAge=2592000" alt="Python"></a> <a href="https://pypi.org/project/promptflow/"><img src="https://img.shields.io/pypi/dm/promptflow" alt="PyPI - Downloads"></a> <a href="https://microsoft.github.io/promptflow/reference/pf-command-reference.html"><img src="https://img.shields.io/badge/CLI-reference-blue" alt="CLI"></a> <a href="https://marketplace.visualstudio.com/items?itemName=prompt-flow.prompt-flow"><img src="https://img.shields.io/visual-studio-marketplace/i/prompt-flow.prompt-flow?logo=Visual%20Studio&label=Extension%20" alt="vsc extension"></a></p>
<p><a href="https://microsoft.github.io/promptflow/index.html"><img src="https://img.shields.io/badge/Doc-online-green" alt="Doc"></a> <a href="https://github.com/microsoft/promptflow/issues/new/choose"><img src="https://img.shields.io/github/issues/microsoft/promptflow" alt="Issue"></a> <a href="https://github.com/microsoft/promptflow/issues/new/choose"><img src="https://img.shields.io/github/discussions/microsoft/promptflow" alt="Discussions"></a> <a href="https://github.com/microsoft/promptflow/raw/main/CONTRIBUTING.md"><img src="https://img.shields.io/badge/Contributing-8A2BE2" alt="CONTRIBUTING"></a> <a href="https://github.com/microsoft/promptflow/raw/main/LICENSE"><img src="https://img.shields.io/github/license/microsoft/promptflow" alt="License: MIT"></a></p>
<blockquote>
<p>Welcome to join us to make Prompt flow better by participating <a href="https://github.com/microsoft/promptflow/discussions">discussions</a>, opening <a href="https://github.com/microsoft/promptflow/issues/new/choose">issues</a>, submitting <a href="https://github.com/microsoft/promptflow/pulls">PRs</a>.</p>
</blockquote>
<p><strong>Prompt flow</strong> is a suite of development tools designed to streamline the end-to-end development cycle of LLM-based AI applications, from ideation, prototyping, testing, evaluation to production deployment and monitoring. It makes prompt engineering much easier and enables you to build LLM apps with production quality.</p>
<p>With prompt flow, you will be able to:</p>
<ul>
<li><strong>Create and iteratively develop flow</strong>
<ul>
<li>Create executable <a href="https://microsoft.github.io/promptflow/concepts/concept-flows.html">flows</a> that link LLMs, prompts, Python code and other <a href="https://microsoft.github.io/promptflow/concepts/concept-tools.html">tools</a> together.</li>
<li>Debug and iterate your flows, especially the <a href="https://microsoft.github.io/promptflow/concepts/concept-connections.html">interaction with LLMs</a> with ease.</li>
</ul> </li>
<li><strong>Evaluate flow quality and performance</strong>
<ul>
<li>Evaluate your flow's quality and performance with larger datasets.</li>
<li>Integrate the testing and evaluation into your CI/CD system to ensure quality of your flow.</li>
</ul> </li>
<li><strong>Streamlined development cycle for production</strong>
<ul>
<li>Deploy your flow to the serving platform you choose or integrate into your app's code base easily.</li>
<li>(Optional but highly recommended) Collaborate with your team by leveraging the cloud version of <a href="https://learn.microsoft.com/en-us/azure/machine-learning/prompt-flow/overview-what-is-prompt-flow?view=azureml-api-2">Prompt flow in Azure AI</a>.</li>
</ul> </li>
</ul>
<hr>
<h2>Installation</h2>
<p>Ensure you have a python environment, <code>python=3.9</code> is recommended.</p>
<pre><code class="language-sh">pip install promptflow promptflow-tools
</code></pre>
<h2>Quick Start ⚡</h2>
<p><strong>Create a chatbot with prompt flow</strong></p>
<p>Run the command to initiate a prompt flow from a chat template, it creates folder named <code>my_chatbot</code> and generates required files within it:</p>
<pre><code class="language-sh">pf flow init --flow ./my_chatbot --type chat
</code></pre>
<p><strong>Setup a connection for your API key</strong></p>
<p>For OpenAI key, establish a connection by running the command, using the <code>openai.yaml</code> file in the <code>my_chatbot</code> folder, which stores your OpenAI key (override keys and name with --set to avoid yaml file changes):</p>
<pre><code class="language-sh">pf connection create --file ./my_chatbot/openai.yaml --set api_key=<your_api_key> --name open_ai_connection
</code></pre>
<p>For Azure OpenAI key, establish the connection by running the command, using the <code>azure_openai.yaml</code> file:</p>
<pre><code class="language-sh">pf connection create --file ./my_chatbot/azure_openai.yaml --set api_key=<your_api_key> api_base=<your_api_base> --name open_ai_connection
</code></pre>
<p><strong>Chat with your flow</strong></p>
<p>In the <code>my_chatbot</code> folder, there's a <code>flow.dag.yaml</code> file that outlines the flow, including inputs/outputs, nodes, connection, and the LLM model, etc</p>
<blockquote>
<p>Note that in the <code>chat</code> node, we're using a connection named <code>open_ai_connection</code> (specified in <code>connection</code> field) and the <code>gpt-35-turbo</code> model (specified in <code>deployment_name</code> field). The deployment_name filed is to specify the OpenAI model, or the Azure OpenAI deployment resource.</p>
</blockquote>
<p>Interact with your chatbot by running: (press <code>Ctrl + C</code> to end the session)</p>
<pre><code class="language-sh">pf flow test --flow ./my_chatbot --interactive
</code></pre>
<p>Next Step! Continue with the <strong>Tutorial</strong> 👇 section to delve deeper into Prompt flow.</p>
<h2>Tutorial 🏃♂️</h2>
<p>Prompt Flow is a tool designed to <strong>build high quality LLM apps</strong>, the development process in prompt flow follows these steps: develop a flow, improve the flow quality, deploy the flow to production.</p>
<h3>Develop your own LLM apps</h3>
<h4>VS Code Extension<img src="https://raw.githubusercontent.com/microsoft/promptflow/main/examples/tutorials/quick-start/media/logo_pf.png" alt="logo" width="25"></h4>
<p>We also offer a VS Code extension (a flow designer) for an interactive flow development experience with UI.</p>
<img src="https://raw.githubusercontent.com/microsoft/promptflow/main/examples/tutorials/quick-start/media/vsc.png" alt="vsc" width="1000">
<p>You can install it from the <a href="https://marketplace.visualstudio.com/items?itemName=prompt-flow.prompt-flow">visualstudio marketplace</a>.</p>
<h4>Deep dive into flow development</h4>
<p><a href="https://microsoft.github.io/promptflow/how-to-guides/quick-start.html">Getting Started with Prompt Flow</a>: A step by step guidance to invoke your first flow run.</p>
<h3>Learn from use cases</h3>
<p><a href="https://github.com/microsoft/promptflow/raw/main/examples/tutorials/e2e-development/chat-with-pdf.md">Tutorial: Chat with PDF</a>: An end-to-end tutorial on how to build a high quality chat application with prompt flow, including flow development and evaluation with metrics.</p>
<blockquote>
<p>More examples can be found <a href="https://microsoft.github.io/promptflow/tutorials/index.html#samples">here</a>. We welcome contributions of new use cases!</p>
</blockquote>
<h3>Setup for contributors</h3>
<p>If you're interested in contributing, please start with our dev setup guide: <a href="https://raw.githubusercontent.com/microsoft/promptflow/main/docs/dev/dev_setup.md">dev_setup.md</a>.</p>
<p>Next Step! Continue with the <strong>Contributing</strong> 👇 section to to contribute to Prompt flow.</p>
<h2>Contributing</h2>
<p>This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit <a href="https://cla.opensource.microsoft.com">https://cla.opensource.microsoft.com</a>.</p>
<p>When you submit a pull request, a CLA bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.</p>
<p>This project has adopted the <a href="https://opensource.microsoft.com/codeofconduct/">Microsoft Open Source Code of Conduct</a>. For more information see the <a href="https://opensource.microsoft.com/codeofconduct/faq/">Code of Conduct FAQ</a> or contact <a href="mailto:opencode@microsoft.com">opencode@microsoft.com</a> with any additional questions or comments.</p>
<h2>Trademarks</h2>
<p>This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow <a href="https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general">Microsoft's Trademark & Brand Guidelines</a>. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.</p>
<h2>Code of Conduct</h2>
<p>This project has adopted the <a href="https://opensource.microsoft.com/codeofconduct/">Microsoft Open Source Code of Conduct</a>. For more information see the <a href="https://opensource.microsoft.com/codeofconduct/faq/">Code of Conduct FAQ</a> or contact <a href="mailto:opencode@microsoft.com">opencode@microsoft.com</a> with any additional questions or comments.</p>
<h2>License</h2>
<p>Copyright (c) Microsoft Corporation. All rights reserved.</p>
<p>Licensed under the <a href="https://raw.githubusercontent.com/microsoft/promptflow/main/LICENSE">MIT</a> license.</p>
+ leap-ai/headshots-starter
+ 2023-10-11T01:23:33Z
+ tag:github.com,2023-10-11:/leap-ai/headshots-starter
+
+ <p></p><hr><h1>👨💼 <a href="https://headshots-starter.vercel.app/">Headshot AI</a> - Professional Headshots with AI</h1>
<p>Introducing Headshot AI, an open-source project from <a href="https://tryleap.ai/">Leap AI</a> that generates Professional AI Headshots in minutes.</p>
<p><a href="https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fleap-ai%2Fheadshots-starter%2Ftree%2Fmain&env=LEAP_API_KEY,LEAP_WEBHOOK_SECRET,RESEND_API_KEY,STRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET,STRIPE_PRICE_ID_ONE_CREDIT,STRIPE_PRICE_ID_THREE_CREDITS,STRIPE_PRICE_ID_FIVE_CREDITS,NEXT_PUBLIC_STRIPE_IS_ENABLED,SUPABASE_SERVICE_ROLE_KEY&envDescription=Set%20up%20environment%20variables%20from%20Leap%20AI%2C%20Supabase%2C%20Resend%2C%20and%20Stripe.%20See%20.env.local.example%20for%20details.&envLink=https%3A%2F%2Fgithub.com%2Fleap-ai%2Fheadshots-starter%2Fblob%2Fmain%2F.env.local.example&project-name=headshots-starter-clone&repository-name=headshots-starter-clone&demo-title=AI%20Headshot%20Generator&demo-description=A%20Professional%20AI%20headshot%20generator%20starter%20kit%20powered%20by%20Next.js%2C%20Leap%20AI%2C%20and%20Vercel&demo-url=https%3A%2F%2Fwww.getheadshots.ai%2F&demo-image=https%3A%2F%2Fimages.ctfassets.net%2Fe5382hct74si%2F1CEDfTwO5vPEiNMgN2Y1t6%2F245d1e0c11c4d8e734fbe345b9ecdc7c%2Fdemo.png&integration-ids=oac_VqOgBHqhEoFTPzGkPd7L0iH6&external-id=https%3A%2F%2Fgithub.com%2Fleap-ai%2Fheadshots-starter%2Ftree%2Fmain"><img src="https://vercel.com/button" alt="Deploy with Vercel"></a></p>
<p><a href="https://headshots-starter.vercel.app/"><img src="https://raw.githubusercontent.com/leap-ai/headshots-starter/main/public/demo.png" alt="Headshot AI Demo"></a></p>
<h2>How It Works</h2>
<p>Live demo <strong><a href="https://getheadshots.ai">here</a></strong>.</p>
<p>The app is powered by:</p>
<ul>
<li>🚀 <a href="https://tryleap.ai/">Leap AI</a> for AI model training</li>
<li>🚀 <a href="https://tryleap.ai/">Leap AI</a> to generate headshots</li>
<li>▲ <a href="https://nextjs.org/">Next.js</a> for app and landing page</li>
<li>🔋 <a href="https://supabase.com/">Supabase</a> for DB & Auth</li>
<li>📩 <a href="https://resend.com/">Resend</a> (optional) to email user when headshots are ready</li>
<li>⭐️ <a href="https://ui.shadcn.com/">Shadcn</a> with <a href="https://tailwindcss.com/">Tailwind CSS</a> for styles</li>
<li>▲ <a href="https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fleap-ai%2Fheadshots-starter%2Ftree%2Fmain&env=LEAP_API_KEY,LEAP_WEBHOOK_SECRET,RESEND_API_KEY,STRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET,STRIPE_PRICE_ID_ONE_CREDIT,STRIPE_PRICE_ID_THREE_CREDITS,STRIPE_PRICE_ID_FIVE_CREDITS,NEXT_PUBLIC_STRIPE_IS_ENABLED,SUPABASE_SERVICE_ROLE_KEY&envDescription=Set%20up%20environment%20variables%20from%20Leap%20AI%2C%20Supabase%2C%20Resend%2C%20and%20Stripe.%20See%20.env.local.example%20for%20details.&envLink=https%3A%2F%2Fgithub.com%2Fleap-ai%2Fheadshots-starter%2Fblob%2Fmain%2F.env.local.example&project-name=headshots-starter-clone&repository-name=headshots-starter-clone&demo-title=AI%20Headshot%20Generator&demo-description=A%20Professional%20AI%20headshot%20generator%20starter%20kit%20powered%20by%20Next.js%2C%20Leap%20AI%2C%20and%20Vercel&demo-url=https%3A%2F%2Fwww.getheadshots.ai%2F&demo-image=https%3A%2F%2Fimages.ctfassets.net%2Fe5382hct74si%2F1CEDfTwO5vPEiNMgN2Y1t6%2F245d1e0c11c4d8e734fbe345b9ecdc7c%2Fdemo.png&integration-ids=oac_VqOgBHqhEoFTPzGkPd7L0iH6&external-id=https%3A%2F%2Fgithub.com%2Fleap-ai%2Fheadshots-starter%2Ftree%2Fmain">Vercel</a> for deployments</li>
<li>💳 <a href="https://stripe.com/">Stripe</a> for billing</li>
</ul>
<p>Just clone, configure, deploy and you have a Headshot AI SaaS in a box.</p>
<p><a href="https://tryleap.ai/"><img src="https://raw.githubusercontent.com/leap-ai/headshots-starter/main/public/explainer.png" alt="Headshot AI Explainer"></a></p>
<h2>Running Locally</h2>
<p>To create your own Headshot AI app, follow these steps:</p>
<ol>
<li> <p>To setup Supabase/Vercel and your github repo, click on the Vercel Deploy Button and follow the steps.</p> <p>IMPORTANT: In the Supabase integration step: Make sure you leave the Create sample tables option checked. This might take a few minutes to complete.</p> </li>
</ol>
<p><a href="https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fleap-ai%2Fheadshots-starter%2Ftree%2Fmain&env=LEAP_API_KEY,LEAP_WEBHOOK_SECRET,RESEND_API_KEY,STRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET,STRIPE_PRICE_ID_ONE_CREDIT,STRIPE_PRICE_ID_THREE_CREDITS,STRIPE_PRICE_ID_FIVE_CREDITS,NEXT_PUBLIC_STRIPE_IS_ENABLED,SUPABASE_SERVICE_ROLE_KEY&envDescription=Set%20up%20environment%20variables%20from%20Leap%20AI%2C%20Supabase%2C%20Resend%2C%20and%20Stripe.%20See%20.env.local.example%20for%20details.&envLink=https%3A%2F%2Fgithub.com%2Fleap-ai%2Fheadshots-starter%2Fblob%2Fmain%2F.env.local.example&project-name=headshots-starter-clone&repository-name=headshots-starter-clone&demo-title=AI%20Headshot%20Generator&demo-description=A%20Professional%20AI%20headshot%20generator%20starter%20kit%20powered%20by%20Next.js%2C%20Leap%20AI%2C%20and%20Vercel&demo-url=https%3A%2F%2Fwww.getheadshots.ai%2F&demo-image=https%3A%2F%2Fimages.ctfassets.net%2Fe5382hct74si%2F1CEDfTwO5vPEiNMgN2Y1t6%2F245d1e0c11c4d8e734fbe345b9ecdc7c%2Fdemo.png&integration-ids=oac_VqOgBHqhEoFTPzGkPd7L0iH6&external-id=https%3A%2F%2Fgithub.com%2Fleap-ai%2Fheadshots-starter%2Ftree%2Fmain"><img src="https://vercel.com/button" alt="Deploy with Vercel"></a></p>
<p>The Vercel Deployment will create a new repository with this template on your GitHub account and guide your through a new Supabase project creation. The Supabase Vercel Deploy Integration will set up the necessary Supabase environment variables and run the SQL migrations to set up the Database schema on your account. You can inspect the created tables in your project's Table editor.</p>
<p>This will create the tables with their respective columns and RLS policies:</p>
<ul>
<li>credits</li>
<li>images</li>
<li>models</li>
<li>samples</li>
</ul>
<ol start="2">
<li>Clone your newly created repo:</li>
</ol>
<pre><code>git clone {{your-repo-name}}
</code></pre>
<ol start="3">
<li>Enter your newly created repo's directory:</li>
</ol>
<pre><code>cd {{your-repo-name}}
</code></pre>
<ol start="4">
<li> <p>Install dependencies:</p> <p>For npm:</p> <pre><code class="language-bash">npm install
</code></pre> <p>For yarn:</p> <pre><code class="language-bash">yarn
</code></pre> </li>
<li> <p>Magic Link Auth (Supabase)</p> </li>
</ol>
<p>In your supabase <a href="https://supabase.com/dashboard/project/%7BprojectId%7D/auth/templates">dashboard</a>, make sure to update the email template for magic link correctly. You can use the following template:</p>
<p>Make sure to setup your site URL and redirect urls in the supabase dashboard under Authentication -> URL Configuration. For example: Site URL: <a href="https://headshots-starter.vercel.app">https://headshots-starter.vercel.app</a> Redirect URL: <a href="https://headshots-starter.vercel.app/">https://headshots-starter.vercel.app/</a>**</p>
<pre><code><h2>Magic Link</h2>
<p>Follow this link to login:</p>
<p><a href="{{ .SiteURL }}/auth/confirm?token_hash={{ .TokenHash }}&type=email">Log In</a></p>
</code></pre>
<ol start="6">
<li> <p>Create a <a href="https://tryleap.ai/">Leap AI</a> account</p> <p>In your <code>.env.local</code> file:</p>
<ul>
<li>Fill in <code>your_api_key</code> with your <a href="https://docs.tryleap.ai/authentication">Leap API key</a></li>
<li>Fill in <code>your-hosted-url/leap/train-webhook</code> with https://{your-hosted-url}/leap/train-webhook</li>
<li>Fill in <code>your-hosted-url/leap/image-webhook</code> with https://{your-hosted-url}/leap/image-webhook</li>
<li>Fill in <code>your-webhook-secret</code> with any arbitrary URL friendly string eg.<code>shadf892yr398hq23h</code></li>
</ul> </li>
<li> <p>Create a <a href="https://resend.com/">Resend</a> account (Optional)</p>
<ul>
<li>Fill in <code>your-resend-api-key</code> with your Resend API Key if you wish to use Resend to email users when their model has finished training.</li>
</ul> </li>
<li> <p>Configure <a href="https://stripe.com">Stripe</a> to bill users on a credit basis. (Optional)</p> <p>The current setup is for a credit based system. 1 credit = 1 model train.</p> <p>To enable Stripe billing, you will need to fill out the following fields in your <code>.env.local</code> file:</p>
<ul>
<li>STRIPE_SECRET_KEY=your-stripe-secret-key</li>
<li>STRIPE_WEBHOOK_SECRET=your-stripe-webhook-secret</li>
<li>STRIPE_PRICE_ID_ONE_CREDIT=your-stripe-price-id-one-credit</li>
<li>STRIPE_PRICE_ID_THREE_CREDITS=your-stripe-price-id-three-credit</li>
<li>STRIPE_PRICE_ID_FIVE_CREDITS=your-stripe-price-id-five-credit</li>
<li>NEXT_PUBLIC_STRIPE_IS_ENABLED=false # set to true to enable Stripe payments</li>
</ul> <p>You need to do multiple things to get Stripe working:</p>
<ul>
<li>Get your Stripe API secret key from the <a href="https://dashboard.stripe.com/test/apikeys">Stripe Dashboard</a></li>
<li>Create a <a href="https://dashboard.stripe.com/test/webhooks">Stripe Webhook</a> that will point to your hosted URL. The webhook should be listening for the <code>checkout.session.completed</code> event. The webhook should point to <code>your-hosted-url/stripe/subscription-webhook</code>.</li>
<li>Create a <a href="https://dashboard.stripe.com/test/products">Stripe Price</a> for each credit package you want to offer.</li>
<li>Create a <a href="https://dashboard.stripe.com/test/pricing-tables">Stripe Pricing Table</a> and replace the script @/components/stripe/StripeTable.tsx with your own values. It should look like this:</li>
</ul> <pre><code class="language-js"><stripe-pricing-table
pricing-table-id="your-stripe-pricing-table-id"
publishable-key="your-stripe-publishable-key"
client-reference-id={user.id}
customer-email={user.email}
></stripe-pricing-table>
</code></pre> <p>Here are the products you need to create to get Stripe working with our example, checkout the images <a href="https://raw.githubusercontent.com/leap-ai/headshots-starter/main/public/Stripe/">Here</a></p> <p>To create them go on the Stripe dashboard, search for Product Catalog and then click on the add product button on the top right of the screen. You will need to create 3 products, one for each credit package as shown in the images before. We set them to One time payments, but you can change that if you want to and you can set the price too. After creating the products make sure to update the variables in the .env.local [your-stripe-price-id-one-credit, your-stripe-price-id-three-credit, your-stripe-price-id-five-credit] with their respective price ids, each price id is found in the product page at the bottom.</p> </li>
<li> <p>Start the development server:</p> <p>For npm:</p> <pre><code class="language-bash">npm run dev
</code></pre> <p>For yarn:</p> <pre><code class="language-bash">yarn dev
</code></pre> </li>
<li> <p>Visit <code>http://localhost:3000</code> in your browser to see the running app.</p> </li>
</ol>
<h2>One-Click Deploy</h2>
<p>Default deploy using Vercel:</p>
<p><a href="https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fleap-ai%2Fheadshots-starter%2Ftree%2Fmain&env=LEAP_API_KEY,LEAP_WEBHOOK_SECRET,RESEND_API_KEY,STRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET,STRIPE_PRICE_ID_ONE_CREDIT,STRIPE_PRICE_ID_THREE_CREDITS,STRIPE_PRICE_ID_FIVE_CREDITS,NEXT_PUBLIC_STRIPE_IS_ENABLED,SUPABASE_SERVICE_ROLE_KEY&envDescription=Set%20up%20environment%20variables%20from%20Leap%20AI%2C%20Supabase%2C%20Resend%2C%20and%20Stripe.%20See%20.env.local.example%20for%20details.&envLink=https%3A%2F%2Fgithub.com%2Fleap-ai%2Fheadshots-starter%2Fblob%2Fmain%2F.env.local.example&project-name=headshots-starter-clone&repository-name=headshots-starter-clone&demo-title=AI%20Headshot%20Generator&demo-description=A%20Professional%20AI%20headshot%20generator%20starter%20kit%20powered%20by%20Next.js%2C%20Leap%20AI%2C%20and%20Vercel&demo-url=https%3A%2F%2Fwww.getheadshots.ai%2F&demo-image=https%3A%2F%2Fimages.ctfassets.net%2Fe5382hct74si%2F1CEDfTwO5vPEiNMgN2Y1t6%2F245d1e0c11c4d8e734fbe345b9ecdc7c%2Fdemo.png&integration-ids=oac_VqOgBHqhEoFTPzGkPd7L0iH6&external-id=https%3A%2F%2Fgithub.com%2Fleap-ai%2Fheadshots-starter%2Ftree%2Fmain"><img src="https://vercel.com/button" alt="Deploy with Vercel"></a></p>
<p>Deployment also supported on <a href="https://replit.com/@leap-ai/Headshot-AI-Professional-Headshots-with-Leap-AI">Replit</a>.</p>
<h2>How To Get Good Results</h2>
<p><a href="https://blog.tryleap.ai/create-an-ai-headshot-generator-fine-tune-stable-diffusion-with-leap-api/#step-1-gather-your-image-samples-%F0%9F%93%B8"><img src="https://raw.githubusercontent.com/leap-ai/headshots-starter/main/public/good_results.png" alt="Good results Demo"></a></p>
<p>The image samples used to teach the model what your face looks like are critical. Garbage in = garbage out.</p>
<ul>
<li>Enforce close-ups of faces and consider cropping so that the face is centered.</li>
<li>Enforce images with only one person in the frame.</li>
<li>Avoid accessories in samples like sunglasses and hats.</li>
<li>Ensure the face is clearly visible. (For face detection, consider using tools like <a href="https://cloudinary.com/documentation/face_detection_based_transformations?ref=blog.tryleap.ai">Cloudinary API</a>).</li>
</ul>
<p><a href="https://blog.tryleap.ai/create-an-ai-headshot-generator-fine-tune-stable-diffusion-with-leap-api/#how-to-avoid-multiple-faces-in-results-%E2%9D%8C"><img src="https://raw.githubusercontent.com/leap-ai/headshots-starter/main/public/multiple_faces.png" alt="Avoid multiple faces"></a></p>
<p>If you get distorted results with multiple faces, repeated subjects, multiple limbs, etc, make sure to follow these steps and minimize the chance of this happening:</p>
<ul>
<li>Make sure any samples uploaded are the same 1:1 height / width aspect ratio, for example 512x512, 1024x1024, etc.</li>
<li>Avoid multiple people in the samples uploaded.</li>
<li>Add "double torso, totem pole" to the negative prompt when generating.</li>
<li>Make sure your dimensions when generating are also 1:1 with the same height / width ratios of the samples.</li>
</ul>
<p>For more information on how to improve quality, read the blog <a href="https://blog.tryleap.ai/create-an-ai-headshot-generator-fine-tune-stable-diffusion-with-leap-api/#step-1-gather-your-image-samples-%F0%9F%93%B8">here</a>.</p>
<h2>Additional Use-Cases</h2>
<p>Headshot AI can be easily adapted to support many other use-cases on <a href="https://tryleap.ai/">Leap AI</a> including:</p>
<ul>
<li>AI Avatars
<ul>
<li><a href="https://blog.tryleap.ai/transforming-images-into-anime-with-leap-ai/">Anime</a></li>
<li><a href="https://blog.tryleap.ai/ai-time-machine-images-a-glimpse-into-the-future-with-leap-ai/">Portraits</a></li>
<li><a href="https://blog.tryleap.ai/novel-ai-image-generator-using-leap-ai-a-comprehensive-guide/">Story Illustrations</a></li>
</ul> </li>
</ul>
<p><a href="https://tryleap.ai/"><img src="https://raw.githubusercontent.com/leap-ai/headshots-starter/main/public/anime.png" alt="Anime AI Demo"></a></p>
<ul>
<li>Pet Portraits</li>
</ul>
<p><a href="https://tryleap.ai/"><img src="https://raw.githubusercontent.com/leap-ai/headshots-starter/main/public/pet.png" alt="Pet AI Demo"></a></p>
<ul>
<li>Product Shots</li>
<li>Food Photography</li>
</ul>
<p><a href="https://tryleap.ai/"><img src="https://raw.githubusercontent.com/leap-ai/headshots-starter/main/public/products.png" alt="Product AI Demo"></a></p>
<ul>
<li>Icons</li>
<li><a href="https://blog.tryleap.ai/how-to-generate-style-consistent-assets-finetuning-on-leap/">Style-Consistent Assets</a></li>
</ul>
<p><a href="https://tryleap.ai/"><img src="https://raw.githubusercontent.com/leap-ai/headshots-starter/main/public/icons.png" alt="Icons AI Demo"></a></p>
<p>& more!</p>
<h2>Contributing</h2>
<p>We welcome collaboration and appreciate your contribution to Headshot AI. If you have suggestions for improvement or significant changes in mind, feel free to open an issue!</p>
<p>If you want to contribute to the codebase make sure you create a new branch and open a pull request that points to <code>dev</code>.</p>
<h2>Resources and Support</h2>
<ul>
<li>Discord Community: <a href="https://discord.gg/NCAKTUayPK">Leap Discord</a></li>
<li>Help Email: <a href="mailto:help@tryleap.ai">help@tryleap.ai</a></li>
</ul>
<h2>License</h2>
<p>Headshot AI is released under the <a href="https://choosealicense.com/licenses/mit/">MIT License</a>.</p>
- microsoft/ToRA
- 2023-10-10T01:23:53Z
- tag:github.com,2023-10-10:/microsoft/ToRA
-
- <p>ToRA is a series of Tool-integrated Reasoning LLM Agents designed to solve challenging mathematical reasoning problems by interacting with tools.</p><hr><h1 align="center"> <img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="100" alt="ToRA"> <br> ToRA: A Tool-Integrated Reasoning Agent </h1>
<div align="center">
<p><img src="https://img.shields.io/badge/Task-Mathematical%20Reasoning-orange" alt=""> <img src="https://img.shields.io/badge/Model-Released-blue" alt=""> <img src="https://img.shields.io/badge/Code%20License-MIT-green" alt=""></p>
</div>
<p align="center"> <a href="https://microsoft.github.io/ToRA/"><b>[🌐 Website]</b></a> • <a href="https://arxiv.org/abs/2309.17452"><b>[📜 Paper]</b></a> • <a href="https://huggingface.co/llm-agents"><b>[🤗 HF Models]</b></a> • <a href="https://github.com/microsoft/ToRA"><b>[🐱 GitHub]</b></a> <br> <a href="https://twitter.com/zhs05232838/status/1708860992631763092"><b>[🐦 Twitter]</b></a> • <a href="https://www.reddit.com/r/LocalLLaMA/comments/1703k6d/tora_a_toolintegrated_reasoning_agent_for/"><b>[💬 Reddit]</b></a> • <a href="https://notes.aimodels.fyi/researchers-announce-tora-training-language-models-to-better-understand-math-using-external-tools/">[🍀 Unofficial Blog]</a>
<!-- <a href="#-quick-start">Quick Start</a> • -->
<!-- <a href="#%EF%B8%8F-citation">Citation</a> --> </p>
<p align="center"> Repo for "<a href="https://arxiv.org/abs/2309.17452" target="_blank">ToRA: A Tool-Integrated Reasoning Agent for Mathematical Problem Solving</a>" </p>
<p align="center"> <img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/math_gsm_hist.png" width="1000"> <br> <em>Figure 1: Comparing ToRA with baselines on LLaMA-2 base models from 7B to 70B.</em> </p>
<h2>🔥 News</h2>
<ul>
<li>[2023/10/08] 🔥🔥🔥 All ToRA models released at <a href="https://huggingface.co/llm-agents">🤗 HuggingFace</a>!!!</li>
<li>[2023/09/29] ToRA paper, repo, and website released.</li>
</ul>
<h2>💡 Introduction</h2>
<p>ToRA is a series of Tool-integrated Reasoning Agents designed to solve challenging mathematical reasoning problems by interacting with tools, e.g., computation libraries and symbolic solvers. ToRA series seamlessly integrate natural language reasoning with the utilization of external tools, thereby amalgamating the analytical prowess of language and the computational efficiency of external tools.</p>
<table>
<thead>
<tr>
<th>Model</th>
<th>Size</th>
<th>GSM8k</th>
<th>MATH</th>
<th>AVG@10 math tasks<sup>†</sup></th>
</tr>
</thead>
<tbody>
<tr>
<td>GPT-4</td>
<td>-</td>
<td>92.0</td>
<td>42.5</td>
<td>78.3</td>
</tr>
<tr>
<td>GPT-4 (PAL)</td>
<td>-</td>
<td>94.2</td>
<td>51.8</td>
<td>86.4</td>
</tr>
<tr>
<td><a href="https://huggingface.co/llm-agents/tora-7b-v1.0"><img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="16" alt="ToRA"> ToRA-7B</a></td>
<td>7B</td>
<td>68.8</td>
<td>40.1</td>
<td>62.4</td>
</tr>
<tr>
<td><a href="https://huggingface.co/llm-agents/tora-code-7b-v1.0"><img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="16" alt="ToRA"> ToRA-Code-7B</a></td>
<td>7B</td>
<td>72.6</td>
<td>44.6</td>
<td>66.5</td>
</tr>
<tr>
<td><a href="https://huggingface.co/llm-agents/tora-13b-v1.0"><img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="16" alt="ToRA"> ToRA-13B</a></td>
<td>13B</td>
<td>72.7</td>
<td>43.0</td>
<td>65.9</td>
</tr>
<tr>
<td><a href="https://huggingface.co/llm-agents/tora-code-13b-v1.0"><img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="16" alt="ToRA"> ToRA-Code-13B</a></td>
<td>13B</td>
<td>75.8</td>
<td>48.1</td>
<td>71.3</td>
</tr>
<tr>
<td><a href="https://huggingface.co/llm-agents/tora-code-34b-v1.0"><img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="16" alt="ToRA"> ToRA-Code-34B<sup>*</sup></a></td>
<td>34B</td>
<td>80.7</td>
<td><strong>51.0</strong></td>
<td>74.8</td>
</tr>
<tr>
<td><a href="https://huggingface.co/llm-agents/tora-70b-v1.0"><img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="16" alt="ToRA"> ToRA-70B</a></td>
<td>70B</td>
<td><strong>84.3</strong></td>
<td>49.7</td>
<td><strong>76.9</strong></td>
</tr>
</tbody>
</table>
<ul>
<li> <p><sup>*</sup>ToRA-Code-34B is currently the first and only open-source model to achieve over 50% accuracy (pass@1) on the MATH dataset, which significantly outperforms GPT-4’s CoT result (51.0 vs. 42.5), and is competitive with GPT-4 solving problems with programs. By open-sourcing our codes and models, we hope more breakthroughs will come!</p> </li>
<li> <p><sup>†</sup>10 math tasks include GSM8k, MATH, GSM-Hard, SVAMP, TabMWP, ASDiv, SingleEQ, SingleOP, AddSub, and MultiArith.</p> </li>
</ul>
<h3>Tool-Integrated Reasoning</h3>
<p align="center"> <img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/example.png" width="800"> <br> <em>Figure 2: A basic example of single-round tool interaction, which interleaves rationales with program-based tool use.</em> </p>
<h3>ToRA Training Pipeline</h3>
<p align="center"> <img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/pipeline.png" width="800"> <br> <em>Figure 3: Training ToRA contains ① Imitation Learning, and ② output space shaping.</em> </p>
<h2>🚀 Quick Start</h2>
<h3>⚙️ Setup</h3>
<p>We recommend using <a href="https://docs.conda.io/projects/miniconda">Conda</a> to manage your environment. We use <a href="https://github.com/vllm-project/vllm">vLLM</a> (0.1.4) to accelerate inference. Run the following commands to setup your environment:</p>
<pre><code class="language-sh">git clone https://github.com/microsoft/ToRA.git && cd ToRA/src
conda create -n tora python=3.10
conda activate tora
pip install torch==2.0.1 --index-url https://download.pytorch.org/whl/cu118 # CUDA 11.8 for example
pip install -r requirements.txt
</code></pre>
<h3>🪁 Inference</h3>
<p>We provide a script for inference, simply config the <code>MODEL_NAME_OR_PATH</code> and <code>DATA</code> in <a href="https://raw.githubusercontent.com/microsoft/ToRA/main/src/scripts/infer.sh">src/scripts/infer.sh</a> and run the following command:</p>
<pre><code class="language-sh">bash scritps/infer.sh
</code></pre>
<p>We also open-source the <a href="https://raw.githubusercontent.com/microsoft/ToRA/main/src/outputs/llm-agents/">model outputs</a> from our best models (ToRA-Code-34B and ToRA-70B) in the <code>src/outputs/</code> folder.</p>
<h3>⚖️ Evaluation</h3>
<p>The <a href="https://raw.githubusercontent.com/microsoft/ToRA/main/src/eval/">src/eval/grader.py</a> file contains the grading logic that assesses the accuracy of the predicted answer by comparing it to the ground truth. This logic is developed based on the Hendrycks' MATH grading system, which we have manually verified on the MATH dataset to minimize false positives and false negatives.</p>
<p>To evaluate the predicted answer, run the following command:</p>
<pre><code class="language-sh">python -m eval.evaluate \
--data_name "math" \
--prompt_type "tora" \
--file_path "outputs/llm-agents/tora-code-34b-v1.0/math/test_tora_-1_seed0_t0.0_s0_e5000.jsonl" \
--execute
</code></pre>
<p>then you will get:</p>
<pre><code>Num samples: 5000
Num scores: 5000
Timeout samples: 0
Empty samples: 2
Mean score: [51.0]
Type scores: {'Algebra': 67.3, 'Counting & Probability': 42.2, 'Geometry': 26.1, 'Intermediate Algebra': 40.0, 'Number Theory': 59.3, 'Prealgebra': 63.8, 'Precalculus': 34.2}
</code></pre>
<h3>⚡️ Training</h3>
<p>Due to some restrictions, ToRA-Corpus 16k is under review and cannot be released immediately. However, we open-source our complete training scripts as well as <em>output space shaping</em> pipelines for the community, and you may construct your own dataset for training.</p>
<p>To train a model, run the following command:</p>
<pre><code class="language-sh">bash scritps/train.sh codellama 7b
</code></pre>
<h2>☕️ Citation</h2>
<p>If you find this repository helpful, please consider citing our paper:</p>
<pre><code>@misc{gou2023tora,
title={ToRA: A Tool-Integrated Reasoning Agent for Mathematical Problem Solving},
author={Zhibin Gou and Zhihong Shao and Yeyun Gong and yelong shen and Yujiu Yang and Minlie Huang and Nan Duan and Weizhu Chen},
year={2023},
eprint={2309.17452},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
</code></pre>
<h2>🍀 Contributing</h2>
<p>This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit <a href="https://cla.opensource.microsoft.com">https://cla.opensource.microsoft.com</a>.</p>
<p>This project has adopted the <a href="https://opensource.microsoft.com/codeofconduct/">Microsoft Open Source Code of Conduct</a>. For more information see the <a href="https://opensource.microsoft.com/codeofconduct/faq/">Code of Conduct FAQ</a> or contact <a href="mailto:opencode@microsoft.com">opencode@microsoft.com</a> with any additional questions or comments.</p>
<h2>🌟 Star History</h2>
<p><a href="https://star-history.com/#microsoft/ToRA&Date"><img src="https://api.star-history.com/svg?repos=microsoft/ToRA&type=Date" alt="Star History Chart"></a></p>
+ zbezj/HEU_KMS_Activator
+ 2023-10-11T01:23:33Z
+ tag:github.com,2023-10-11:/zbezj/HEU_KMS_Activator
+
+ <p></p><hr><h1>HEU_KMS_Activator</h1>
- chatchat-space/Langchain-Chatchat
- 2023-10-10T01:23:53Z
- tag:github.com,2023-10-10:/chatchat-space/Langchain-Chatchat
-
- <p>Langchain-Chatchat(原Langchain-ChatGLM)基于 Langchain 与 ChatGLM 等语言模型的本地知识库问答 | Langchain-Chatchat (formerly langchain-ChatGLM), local knowledge based LLM (like ChatGLM) QA app with langchain</p><hr><p><img src="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/img/logo-long-chatchat-trans-v2.png" alt=""></p>
<p><a href="https://t.me/+RjliQ3jnJ1YyN2E9"><img src="https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white" alt="Telegram" title="langchain-chatglm"></a></p>
<p>🌍 <a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README_en.md">READ THIS IN ENGLISH</a></p>
<p>📃 <strong>LangChain-Chatchat</strong> (原 Langchain-ChatGLM): 基于 Langchain 与 ChatGLM 等大语言模型的本地知识库问答应用实现。</p>
<h2>目录</h2>
<ul>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#%E4%BB%8B%E7%BB%8D">介绍</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97">变更日志</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#%E6%A8%A1%E5%9E%8B%E6%94%AF%E6%8C%81">模型支持</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#Docker-%E9%83%A8%E7%BD%B2">Docker 部署</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#%E5%BC%80%E5%8F%91%E9%83%A8%E7%BD%B2">开发部署</a>
<ul>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#%E8%BD%AF%E4%BB%B6%E9%9C%80%E6%B1%82">软件需求</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#1-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87">1. 开发环境准备</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#2-%E4%B8%8B%E8%BD%BD%E6%A8%A1%E5%9E%8B%E8%87%B3%E6%9C%AC%E5%9C%B0">2. 下载模型至本地</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#3-%E8%AE%BE%E7%BD%AE%E9%85%8D%E7%BD%AE%E9%A1%B9">3. 设置配置项</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#4-%E7%9F%A5%E8%AF%86%E5%BA%93%E5%88%9D%E5%A7%8B%E5%8C%96%E4%B8%8E%E8%BF%81%E7%A7%BB">4. 知识库初始化与迁移</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#5-%E4%B8%80%E9%94%AE%E5%90%AF%E5%8A%A8-API-%E6%9C%8D%E5%8A%A1%E6%88%96-Web-UI">5. 一键启动 API 服务或 Web UI</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98">常见问题</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#%E8%B7%AF%E7%BA%BF%E5%9B%BE">路线图</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#%E9%A1%B9%E7%9B%AE%E4%BA%A4%E6%B5%81%E7%BE%A4">项目交流群</a></li>
</ul>
<hr>
<h2>介绍</h2>
<p>🤖️ 一种利用 <a href="https://github.com/hwchase17/langchain">langchain</a> 思想实现的基于本地知识库的问答应用,目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。</p>
<p>💡 受 <a href="https://github.com/GanymedeNil">GanymedeNil</a> 的项目 <a href="https://github.com/GanymedeNil/document.ai">document.ai</a> 和 <a href="https://github.com/AlexZhangji">AlexZhangji</a> 创建的 <a href="https://github.com/THUDM/ChatGLM-6B/pull/216">ChatGLM-6B Pull Request</a> 启发,建立了全流程可使用开源模型实现的本地知识库问答应用。本项目的最新版本中通过使用 <a href="https://github.com/lm-sys/FastChat">FastChat</a> 接入 Vicuna, Alpaca, LLaMA, Koala, RWKV 等模型,依托于 <a href="https://github.com/langchain-ai/langchain">langchain</a> 框架支持通过基于 <a href="https://github.com/tiangolo/fastapi">FastAPI</a> 提供的 API 调用服务,或使用基于 <a href="https://github.com/streamlit/streamlit">Streamlit</a> 的 WebUI 进行操作。</p>
<p>✅ 依托于本项目支持的开源 LLM 与 Embedding 模型,本项目可实现全部使用<strong>开源</strong>模型<strong>离线私有部署</strong>。与此同时,本项目也支持 OpenAI GPT API 的调用,并将在后续持续扩充对各类模型及模型 API 的接入。</p>
<p>⛓️ 本项目实现原理如下图所示,过程包括加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的 <code>top k</code>个 -> 匹配出的文本作为上下文和问题一起添加到 <code>prompt</code>中 -> 提交给 <code>LLM</code>生成回答。</p>
<p>📺 <a href="https://www.bilibili.com/video/BV13M4y1e7cN/?share_source=copy_web&vd_source=e6c5aafe684f30fbe41925d61ca6d514">原理介绍视频</a></p>
<p><img src="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/img/langchain+chatglm.png" alt="实现原理图"></p>
<p>从文档处理角度来看,实现流程如下:</p>
<p><img src="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/img/langchain+chatglm2.png" alt="实现原理图2"></p>
<p>🚩 本项目未涉及微调、训练过程,但可利用微调或训练对本项目效果进行优化。</p>
<p>🌐 <a href="https://www.codewithgpu.com/i/chatchat-space/Langchain-Chatchat/Langchain-Chatchat">AutoDL 镜像</a> 中 <code>v9</code> 版本所使用代码已更新至本项目 <code>v0.2.5</code> 版本。 🐳 <a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/registry.cn-beijing.aliyuncs.com/chatchat/chatchat:0.2.5">Docker 镜像</a></p>
<p>💻 一行命令运行 Docker 🌲:</p>
<pre><code class="language-shell">docker run -d --gpus all -p 80:8501 registry.cn-beijing.aliyuncs.com/chatchat/chatchat:0.2.5
</code></pre>
<hr>
<h2>环境最低要求</h2>
<p>想顺利运行本代码,请按照以下的最低要求进行配置:</p>
<ul>
<li>Python版本: >= 3.8.5, < 3.11</li>
<li>Cuda版本: >= 11.7</li>
<li>强烈推荐使用Python3.10,部分Agent功能可能没有完全支持Python3.10以下版本。</li>
</ul>
<p>如果想要顺利在GPU运行本地模型(int4版本),你至少需要以下的硬件配置:</p>
<ul>
<li>chatglm2-6b & LLaMA-7B 最低显存要求: 7GB 推荐显卡: RTX 3060, RTX 2060</li>
<li>LLaMA-13B 最低显存要求: 11GB 推荐显卡: RTX 2060 12GB, RTX3060 12GB, RTX3080, RTXA2000</li>
<li>Qwen-14B-Chat 最低显存要求: 13GB 推荐显卡: RTX 3090</li>
<li>LLaMA-30B 最低显存要求: 22GB 推荐显卡:RTX A5000,RTX 3090,RTX 4090,RTX 6000,Tesla V100,RTX Tesla P40</li>
<li>LLaMA-65B 最低显存要求: 40GB 推荐显卡:A100,A40,A6000</li>
</ul>
<p>如果是int8 则显存x1.5 fp16 x2.5的要求 如:使用fp16 推理Qwen-7B-Chat 模型 则需要使用16GB显存。</p>
<p>以上仅为估算,实际情况以nvidia-smi占用为准。</p>
<h2>变更日志</h2>
<p>参见 <a href="https://github.com/imClumsyPanda/langchain-ChatGLM/releases">版本更新日志</a>。</p>
<p>从 <code>0.1.x</code> 升级过来的用户请注意,需要按照<a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/README.md#3-%E5%BC%80%E5%8F%91%E9%83%A8%E7%BD%B2">开发部署</a>过程操作,将现有知识库迁移到新格式,具体见<a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/docs/INSTALL.md#%E7%9F%A5%E8%AF%86%E5%BA%93%E5%88%9D%E5%A7%8B%E5%8C%96%E4%B8%8E%E8%BF%81%E7%A7%BB">知识库初始化与迁移</a>。</p>
<h3><code>0.2.0</code> 版本与 <code>0.1.x</code> 版本区别</h3>
<ol>
<li>使用 <a href="https://github.com/lm-sys/FastChat">FastChat</a> 提供开源 LLM 模型的 API,以 OpenAI API 接口形式接入,提升 LLM 模型加载效果;</li>
<li>使用 <a href="https://github.com/langchain-ai/langchain">langchain</a> 中已有 Chain 的实现,便于后续接入不同类型 Chain,并将对 Agent 接入开展测试;</li>
<li>使用 <a href="https://github.com/tiangolo/fastapi">FastAPI</a> 提供 API 服务,全部接口可在 FastAPI 自动生成的 docs 中开展测试,且所有对话接口支持通过参数设置流式或非流式输出;</li>
<li>使用 <a href="https://github.com/streamlit/streamlit">Streamlit</a> 提供 WebUI 服务,可选是否基于 API 服务启动 WebUI,增加会话管理,可以自定义会话主题并切换,且后续可支持不同形式输出内容的显示;</li>
<li>项目中默认 LLM 模型改为 <a href="https://huggingface.co/THUDM/chatglm2-6b">THUDM/chatglm2-6b</a>,默认 Embedding 模型改为 <a href="https://huggingface.co/moka-ai/m3e-base">moka-ai/m3e-base</a>,文件加载方式与文段划分方式也有调整,后续将重新实现上下文扩充,并增加可选设置;</li>
<li>项目中扩充了对不同类型向量库的支持,除支持 <a href="https://github.com/facebookresearch/faiss">FAISS</a> 向量库外,还提供 <a href="https://github.com/milvus-io/milvus">Milvus</a>, <a href="https://github.com/pgvector/pgvector">PGVector</a> 向量库的接入;</li>
<li>项目中搜索引擎对话,除 Bing 搜索外,增加 DuckDuckGo 搜索选项,DuckDuckGo 搜索无需配置 API Key,在可访问国外服务环境下可直接使用。</li>
</ol>
<hr>
<h2>模型支持</h2>
<p>本项目中默认使用的 LLM 模型为 <a href="https://huggingface.co/THUDM/chatglm2-6b">THUDM/chatglm2-6b</a>,默认使用的 Embedding 模型为 <a href="https://huggingface.co/moka-ai/m3e-base">moka-ai/m3e-base</a> 为例。</p>
<h3>LLM 模型支持</h3>
<p>本项目最新版本中支持接入<strong>本地模型</strong>与<strong>在线 LLM API</strong>。</p>
<p>本地 LLM 模型接入基于 <a href="https://github.com/lm-sys/FastChat">FastChat</a> 实现,支持模型如下:</p>
<ul>
<li><a href="https://huggingface.co/meta-llama/Llama-2-7b-chat-hf">meta-llama/Llama-2-7b-chat-hf</a></li>
<li>Vicuna, Alpaca, LLaMA, Koala</li>
<li><a href="https://huggingface.co/BlinkDL/rwkv-4-raven">BlinkDL/RWKV-4-Raven</a></li>
<li><a href="https://huggingface.co/camel-ai/CAMEL-13B-Combined-Data">camel-ai/CAMEL-13B-Combined-Data</a></li>
<li><a href="https://huggingface.co/databricks/dolly-v2-12b">databricks/dolly-v2-12b</a></li>
<li><a href="https://huggingface.co/FreedomIntelligence/phoenix-inst-chat-7b">FreedomIntelligence/phoenix-inst-chat-7b</a></li>
<li><a href="https://huggingface.co/h2oai/h2ogpt-gm-oasst1-en-2048-open-llama-7b">h2oai/h2ogpt-gm-oasst1-en-2048-open-llama-7b</a></li>
<li><a href="https://huggingface.co/lcw99/polyglot-ko-12.8b-chang-instruct-chat">lcw99/polyglot-ko-12.8b-chang-instruct-chat</a></li>
<li><a href="https://huggingface.co/lmsys/fastchat-t5">lmsys/fastchat-t5-3b-v1.0</a></li>
<li><a href="https://huggingface.co/mosaicml/mpt-7b-chat">mosaicml/mpt-7b-chat</a></li>
<li><a href="https://huggingface.co/Neutralzz/BiLLa-7B-SFT">Neutralzz/BiLLa-7B-SFT</a></li>
<li><a href="https://huggingface.co/nomic-ai/gpt4all-13b-snoozy">nomic-ai/gpt4all-13b-snoozy</a></li>
<li><a href="https://huggingface.co/NousResearch/Nous-Hermes-13b">NousResearch/Nous-Hermes-13b</a></li>
<li><a href="https://huggingface.co/openaccess-ai-collective/manticore-13b-chat-pyg">openaccess-ai-collective/manticore-13b-chat-pyg</a></li>
<li><a href="https://huggingface.co/OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5">OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5</a></li>
<li><a href="https://huggingface.co/project-baize/baize-v2-7b">project-baize/baize-v2-7b</a></li>
<li><a href="https://huggingface.co/Salesforce/codet5p-6b">Salesforce/codet5p-6b</a></li>
<li><a href="https://huggingface.co/stabilityai/stablelm-tuned-alpha-7b">StabilityAI/stablelm-tuned-alpha-7b</a></li>
<li><a href="https://huggingface.co/THUDM/chatglm-6b">THUDM/chatglm-6b</a></li>
<li><a href="https://huggingface.co/THUDM/chatglm2-6b">THUDM/chatglm2-6b</a></li>
<li><a href="https://huggingface.co/tiiuae/falcon-40b">tiiuae/falcon-40b</a></li>
<li><a href="https://huggingface.co/timdettmers/guanaco-33b-merged">timdettmers/guanaco-33b-merged</a></li>
<li><a href="https://huggingface.co/togethercomputer/RedPajama-INCITE-7B-Chat">togethercomputer/RedPajama-INCITE-7B-Chat</a></li>
<li><a href="https://huggingface.co/WizardLM/WizardLM-13B-V1.0">WizardLM/WizardLM-13B-V1.0</a></li>
<li><a href="https://huggingface.co/WizardLM/WizardCoder-15B-V1.0">WizardLM/WizardCoder-15B-V1.0</a></li>
<li><a href="https://huggingface.co/baichuan-inc/baichuan-7B">baichuan-inc/baichuan-7B</a></li>
<li><a href="https://huggingface.co/internlm/internlm-chat-7b">internlm/internlm-chat-7b</a></li>
<li><a href="https://huggingface.co/Qwen/">Qwen/Qwen-7B-Chat/Qwen-14B-Chat</a></li>
<li><a href="https://huggingface.co/HuggingFaceH4/starchat-beta">HuggingFaceH4/starchat-beta</a></li>
<li><a href="https://huggingface.co/FlagAlpha/Llama2-Chinese-13b-Chat">FlagAlpha/Llama2-Chinese-13b-Chat</a> and others</li>
<li><a href="https://huggingface.co/BAAI/AquilaChat-7B">BAAI/AquilaChat-7B</a></li>
<li><a href="https://huggingface.co/Open-Orca">all models of OpenOrca</a></li>
<li><a href="https://huggingface.co/jondurbin/spicyboros-7b-2.2?not-for-all-audiences=true">Spicyboros</a> + <a href="https://huggingface.co/jondurbin/airoboros-l2-13b-2.2">airoboros 2.2</a></li>
<li><a href="https://huggingface.co/VMware/open-llama-7b-open-instruct">VMware's OpenLLaMa OpenInstruct</a></li>
<li><a href="https://huggingface.co/baichuan-inc">baichuan2-7b/baichuan2-13b</a></li>
<li>任何 <a href="https://huggingface.co/EleutherAI">EleutherAI</a> 的 pythia 模型,如 <a href="https://huggingface.co/EleutherAI/pythia-6.9b">pythia-6.9b</a></li>
<li>在以上模型基础上训练的任何 <a href="https://github.com/huggingface/peft">Peft</a> 适配器。为了激活,模型路径中必须有 <code>peft</code> 。注意:如果加载多个peft模型,你可以通过在任何模型工作器中设置环境变量 <code>PEFT_SHARE_BASE_WEIGHTS=true</code> 来使它们共享基础模型的权重。</li>
</ul>
<p>以上模型支持列表可能随 <a href="https://github.com/lm-sys/FastChat">FastChat</a> 更新而持续更新,可参考 <a href="https://github.com/lm-sys/FastChat/raw/main/docs/model_support.md">FastChat 已支持模型列表</a>。</p>
<p>除本地模型外,本项目也支持直接接入 OpenAI API、智谱AI等在线模型,具体设置可参考 <code>configs/model_configs.py.example</code> 中的 <code>llm_model_dict</code> 的配置信息。</p>
<p>在线 LLM 模型目前已支持:</p>
<ul>
<li><a href="https://api.openai.com">ChatGPT</a></li>
<li><a href="http://open.bigmodel.cn">智谱AI</a></li>
<li><a href="https://api.minimax.chat">MiniMax</a></li>
<li><a href="https://xinghuo.xfyun.cn">讯飞星火</a></li>
<li><a href="https://cloud.baidu.com/product/wenxinworkshop?track=dingbutonglan">百度千帆</a></li>
<li><a href="https://dashscope.aliyun.com/">阿里云通义千问</a></li>
</ul>
<p>项目中默认使用的 LLM 类型为 <code>THUDM/chatglm2-6b</code>,如需使用其他 LLM 类型,请在 [configs/model_config.py] 中对 <code>llm_model_dict</code> 和 <code>LLM_MODEL</code> 进行修改。</p>
<h3>Embedding 模型支持</h3>
<p>本项目支持调用 <a href="https://huggingface.co/models?pipeline_tag=sentence-similarity">HuggingFace</a> 中的 Embedding 模型,已支持的 Embedding 模型如下:</p>
<ul>
<li><a href="https://huggingface.co/moka-ai/m3e-small">moka-ai/m3e-small</a></li>
<li><a href="https://huggingface.co/moka-ai/m3e-base">moka-ai/m3e-base</a></li>
<li><a href="https://huggingface.co/moka-ai/m3e-large">moka-ai/m3e-large</a></li>
<li><a href="https://huggingface.co/BAAI/bge-small-zh">BAAI/bge-small-zh</a></li>
<li><a href="https://huggingface.co/BAAI/bge-base-zh">BAAI/bge-base-zh</a></li>
<li><a href="https://huggingface.co/BAAI/bge-large-zh">BAAI/bge-large-zh</a></li>
<li><a href="https://huggingface.co/BAAI/bge-base-zh-v1.5">BAAI/bge-base-zh-v1.5</a></li>
<li><a href="https://huggingface.co/BAAI/bge-large-zh-v1.5">BAAI/bge-large-zh-v1.5</a>- <a href="https://huggingface.co/BAAI/bge-base-zh-v1.5">BAAI/bge-base-zh-v1.5</a></li>
<li><a href="https://huggingface.co/BAAI/bge-large-zh-v1.5">BAAI/bge-large-zh-v1.5</a></li>
<li><a href="https://huggingface.co/BAAI/bge-large-zh-noinstruct">BAAI/bge-large-zh-noinstruct</a></li>
<li><a href="https://huggingface.co/sensenova/piccolo-base-zh">sensenova/piccolo-base-zh</a></li>
<li><a href="https://huggingface.co/sensenova/piccolo-large-zh">sensenova/piccolo-large-zh</a></li>
<li><a href="https://huggingface.co/shibing624/text2vec-base-chinese-sentence">shibing624/text2vec-base-chinese-sentence</a></li>
<li><a href="https://huggingface.co/shibing624/text2vec-base-chinese-paraphrase">shibing624/text2vec-base-chinese-paraphrase</a></li>
<li><a href="https://huggingface.co/shibing624/text2vec-base-multilingual">shibing624/text2vec-base-multilingual</a></li>
<li><a href="https://huggingface.co/shibing624/text2vec-base-chinese">shibing624/text2vec-base-chinese</a></li>
<li><a href="https://huggingface.co/shibing624/text2vec-bge-large-chinese">shibing624/text2vec-bge-large-chinese</a></li>
<li><a href="https://huggingface.co/GanymedeNil/text2vec-large-chinese">GanymedeNil/text2vec-large-chinese</a></li>
<li><a href="https://huggingface.co/nghuyong/ernie-3.0-nano-zh">nghuyong/ernie-3.0-nano-zh</a></li>
<li><a href="https://huggingface.co/nghuyong/ernie-3.0-base-zh">nghuyong/ernie-3.0-base-zh</a></li>
<li><a href="https://huggingface.co/sensenova/piccolo-base-zh">sensenova/piccolo-base-zh</a></li>
<li><a href="https://huggingface.co/sensenova/piccolo-large-zh">sensenova/piccolo-base-zh</a></li>
<li><a href="https://platform.openai.com/docs/guides/embeddings">OpenAI/text-embedding-ada-002</a></li>
</ul>
<p>项目中默认使用的 Embedding 类型为 <code>sensenova/piccolo-base-zh</code>,如需使用其他 Embedding 类型,请在 [configs/model_config.py] 中对 <code>embedding_model_dict</code> 和 <code>EMBEDDING_MODEL</code> 进行修改。</p>
<hr>
<h3>Text Splitter 个性化支持</h3>
<p>本项目支持调用 <a href="https://api.python.langchain.com/en/latest/api_reference.html#module-langchain.text_splitter">Langchain</a> 的 Text Splitter 分词器以及基于此改进的自定义分词器,已支持的 Text Splitter 类型如下:</p>
<ul>
<li>CharacterTextSplitter</li>
<li>LatexTextSplitter</li>
<li>MarkdownHeaderTextSplitter</li>
<li>MarkdownTextSplitter</li>
<li>NLTKTextSplitter</li>
<li>PythonCodeTextSplitter</li>
<li>RecursiveCharacterTextSplitter</li>
<li>SentenceTransformersTokenTextSplitter</li>
<li>SpacyTextSplitter</li>
</ul>
<p>已经支持的定制分词器如下:</p>
<ul>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/text_splitter/ali_text_splitter.py">AliTextSplitter</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/text_splitter/chinese_recursive_text_splitter.py">ChineseRecursiveTextSplitter</a></li>
<li><a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/text_splitter/chinese_text_splitter.py">ChineseTextSplitter</a></li>
</ul>
<p>项目中默认使用的 Text Splitter 类型为 <code>ChineseRecursiveTextSplitter</code>,如需使用其他 Text Splitter 类型,请在 [configs/model_config.py] 中对 <code>text_splitter_dict</code> 和 <code>TEXT_SPLITTER</code> 进行修改。</p>
<p>关于如何使用自定义分词器和贡献自己的分词器,可以参考<a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/docs/splitter.md">Text Splitter 贡献说明</a>。</p>
<h2>Agent生态</h2>
<h3>基础的Agent</h3>
<p>在本版本中,我们实现了一个简单的基于OpenAI的React的Agent模型,目前,经过我们测试,仅有以下两个模型支持:</p>
<ul>
<li>OpenAI GPT4</li>
<li>ChatGLM2-130B</li>
</ul>
<p>目前版本的Agent仍然需要对提示词进行大量调试,调试位置</p>
<h3>构建自己的Agent工具</h3>
<p>详见 <a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/docs/%E8%87%AA%E5%AE%9A%E4%B9%89Agent.md">自定义Agent说明</a></p>
<h2>Docker 部署</h2>
<p>🐳 Docker 镜像地址: <code>registry.cn-beijing.aliyuncs.com/chatchat/chatchat:0.2.5)</code></p>
<pre><code class="language-shell">docker run -d --gpus all -p 80:8501 registry.cn-beijing.aliyuncs.com/chatchat/chatchat:0.2.5
</code></pre>
<ul>
<li>该版本镜像大小 <code>35.3GB</code>,使用 <code>v0.2.5</code>,以 <code>nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04</code> 为基础镜像</li>
<li>该版本内置两个 <code>embedding</code> 模型:<code>m3e-large</code>,<code>text2vec-bge-large-chinese</code>,默认启用后者,内置 <code>chatglm2-6b-32k</code></li>
<li>该版本目标为方便一键部署使用,请确保您已经在Linux发行版上安装了NVIDIA驱动程序</li>
<li>请注意,您不需要在主机系统上安装CUDA工具包,但需要安装 <code>NVIDIA Driver</code> 以及 <code>NVIDIA Container Toolkit</code>,请参考<a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html">安装指南</a></li>
<li>首次拉取和启动均需要一定时间,首次启动时请参照下图使用 <code>docker logs -f <container id></code> 查看日志</li>
<li>如遇到启动过程卡在 <code>Waiting..</code> 步骤,建议使用 <code>docker exec -it <container id> bash</code> 进入 <code>/logs/</code> 目录查看对应阶段日志</li>
</ul>
<hr>
<h2>开发部署</h2>
<h3>软件需求</h3>
<p>本项目已在 Python 3.8.1 - 3.10,CUDA 11.7 环境下完成测试。已在 Windows、ARM 架构的 macOS、Linux 系统中完成测试。</p>
<h3>1. 开发环境准备</h3>
<p>参见 <a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/docs/INSTALL.md">开发环境准备</a>。</p>
<p><strong>请注意:</strong> <code>0.2.5</code> 及更新版本的依赖包与 <code>0.1.x</code> 版本依赖包可能发生冲突,强烈建议新建环境后重新安装依赖包。</p>
<h3>2. 下载模型至本地</h3>
<p>如需在本地或离线环境下运行本项目,需要首先将项目所需的模型下载至本地,通常开源 LLM 与 Embedding 模型可以从 <a href="https://huggingface.co/models">HuggingFace</a> 下载。</p>
<p>以本项目中默认使用的 LLM 模型 <a href="https://huggingface.co/THUDM/chatglm2-6b">THUDM/chatglm2-6b</a> 与 Embedding 模型 <a href="https://huggingface.co/moka-ai/m3e-base">moka-ai/m3e-base</a> 为例:</p>
<p>下载模型需要先<a href="https://docs.github.com/zh/repositories/working-with-files/managing-large-files/installing-git-large-file-storage">安装Git LFS</a>,然后运行</p>
<pre><code class="language-Shell">$ git clone https://huggingface.co/THUDM/chatglm2-6b
$ git clone https://huggingface.co/moka-ai/m3e-base
</code></pre>
<h3>3. 设置配置项</h3>
<p>复制模型相关参数配置模板文件 <a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/configs/model_config.py.example">configs/model_config.py.example</a> 存储至项目路径下 <code>./configs</code> 路径下,并重命名为 <code>model_config.py</code>。</p>
<p>复制服务相关参数配置模板文件 <a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/configs/server_config.py.example">configs/server_config.py.example</a> 存储至项目路径下 <code>./configs</code> 路径下,并重命名为 <code>server_config.py</code>。</p>
<p>在开始执行 Web UI 或命令行交互前,请先检查 <a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/configs/model_config.py">configs/model_config.py</a> 和 <a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/configs/server_config.py">configs/server_config.py</a> 中的各项模型参数设计是否符合需求:</p>
<ul>
<li>请确认已下载至本地的 LLM 模型本地存储路径写在 <code>llm_model_dict</code> 对应模型的 <code>local_model_path</code> 属性中,如:</li>
</ul>
<pre><code>"chatglm2-6b": "/Users/xxx/Downloads/chatglm2-6b",
</code></pre>
<ul>
<li>请确认已下载至本地的 Embedding 模型本地存储路径写在 <code>embedding_model_dict</code> 对应模型位置,如:</li>
</ul>
<pre><code>"m3e-base": "/Users/xxx/Downloads/m3e-base",
</code></pre>
<ul>
<li>请确认本地分词器路径是否已经填写,如:</li>
</ul>
<pre><code>text_splitter_dict = {
"ChineseRecursiveTextSplitter": {
"source": "huggingface", ## 选择tiktoken则使用openai的方法,不填写则默认为字符长度切割方法。
"tokenizer_name_or_path": "", ## 空格不填则默认使用大模型的分词器。
}
}
</code></pre>
<p>如果你选择使用OpenAI的Embedding模型,请将模型的 <code>key</code>写入 <code>embedding_model_dict</code>中。使用该模型,你需要能够访问OpenAI官的API,或设置代理。</p>
<h3>4. 知识库初始化与迁移</h3>
<p>当前项目的知识库信息存储在数据库中,在正式运行项目之前请先初始化数据库(我们强烈建议您在执行操作前备份您的知识文件)。</p>
<ul>
<li> <p>如果您是从 <code>0.1.x</code> 版本升级过来的用户,针对已建立的知识库,请确认知识库的向量库类型、Embedding 模型与 <code>configs/model_config.py</code> 中默认设置一致,如无变化只需以下命令将现有知识库信息添加到数据库即可:</p> <pre><code class="language-shell">$ python init_database.py
</code></pre> </li>
<li> <p>如果您是第一次运行本项目,知识库尚未建立,或者配置文件中的知识库类型、嵌入模型发生变化,或者之前的向量库没有开启 <code>normalize_L2</code>,需要以下命令初始化或重建知识库:</p> <pre><code class="language-shell">$ python init_database.py --recreate-vs
</code></pre> </li>
</ul>
<h3>5. 一键启动 API 服务或 Web UI</h3>
<h4>5.1 启动命令</h4>
<p>一键启动脚本 startup.py,一键启动所有 Fastchat 服务、API 服务、WebUI 服务,示例代码:</p>
<pre><code class="language-shell">$ python startup.py -a
</code></pre>
<p>并可使用 <code>Ctrl + C</code> 直接关闭所有运行服务。如果一次结束不了,可以多按几次。</p>
<p>可选参数包括 <code>-a (或--all-webui)</code>, <code>--all-api</code>, <code>--llm-api</code>, <code>-c (或--controller)</code>, <code>--openai-api</code>, <code>-m (或--model-worker)</code>, <code>--api</code>, <code>--webui</code>,其中:</p>
<ul>
<li><code>--all-webui</code> 为一键启动 WebUI 所有依赖服务;</li>
<li><code>--all-api</code> 为一键启动 API 所有依赖服务;</li>
<li><code>--llm-api</code> 为一键启动 Fastchat 所有依赖的 LLM 服务;</li>
<li><code>--openai-api</code> 为仅启动 FastChat 的 controller 和 openai-api-server 服务;</li>
<li>其他为单独服务启动选项。</li>
</ul>
<h4>5.2 启动非默认模型</h4>
<p>若想指定非默认模型,需要用 <code>--model-name</code> 选项,示例:</p>
<pre><code class="language-shell">$ python startup.py --all-webui --model-name Qwen-7B-Chat
</code></pre>
<p>更多信息可通过 <code>python startup.py -h</code>查看。</p>
<h4>5.3 多卡加载</h4>
<p>项目支持多卡加载,需在 startup.py 中的 create_model_worker_app 函数中,修改如下三个参数:</p>
<pre><code class="language-python">gpus=None,
num_gpus= 1,
max_gpu_memory="20GiB"
</code></pre>
<p>其中,<code>gpus</code> 控制使用的显卡的ID,例如 "0,1";</p>
<p><code>num_gpus</code> 控制使用的卡数;</p>
<p><code>max_gpu_memory</code> 控制每个卡使用的显存容量。</p>
<p>注1:server_config.py的FSCHAT_MODEL_WORKERS字典中也增加了相关配置,如有需要也可通过修改FSCHAT_MODEL_WORKERS字典中对应参数实现多卡加载。</p>
<p>注2:少数情况下,gpus参数会不生效,此时需要通过设置环境变量CUDA_VISIBLE_DEVICES来指定torch可见的gpu,示例代码:</p>
<pre><code class="language-shell">CUDA_VISIBLE_DEVICES=0,1 python startup.py -a
</code></pre>
<h4>5.4 PEFT 加载(包括lora,p-tuning,prefix tuning, prompt tuning,ia3等)</h4>
<p>本项目基于 FastChat 加载 LLM 服务,故需以 FastChat 加载 PEFT 路径,即保证路径名称里必须有 peft 这个词,配置文件的名字为 adapter_config.json,peft 路径下包含.bin 格式的 PEFT 权重,peft路径在startup.py中create_model_worker_app函数的args.model_names中指定,并开启环境变量PEFT_SHARE_BASE_WEIGHTS=true参数。</p>
<p>注:如果上述方式启动失败,则需要以标准的fastchat服务启动方式分步启动,分步启动步骤参考第六节,PEFT加载详细步骤参考<a href="https://github.com/chatchat-space/Langchain-Chatchat/issues/1130#issuecomment-1685291822">加载lora微调后模型失效</a>,</p>
<h4><strong>5.5 注意事项:</strong></h4>
<p><strong>1. startup 脚本用多进程方式启动各模块的服务,可能会导致打印顺序问题,请等待全部服务发起后再调用,并根据默认或指定端口调用服务(默认 LLM API 服务端口:<code>127.0.0.1:8888</code>,默认 API 服务端口:<code>127.0.0.1:7861</code>,默认 WebUI 服务端口:<code>本机IP:8501</code>)</strong></p>
<p><strong>2.服务启动时间示设备不同而不同,约 3-10 分钟,如长时间没有启动请前往 <code>./logs</code>目录下监控日志,定位问题。</strong></p>
<p><strong>3. 在Linux上使用ctrl+C退出可能会由于linux的多进程机制导致multiprocessing遗留孤儿进程,可通过shutdown_all.sh进行退出</strong></p>
<h4>5.6 启动界面示例:</h4>
<ol>
<li>FastAPI docs 界面</li>
</ol>
<p><img src="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/img/fastapi_docs_020_0.png" alt=""></p>
<ol start="2">
<li>webui启动界面示例:</li>
</ol>
<ul>
<li>Web UI 对话界面:</li>
</ul>
<p><img src="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/img/webui_0915_0.png" alt="img"></p>
<ul>
<li>Web UI 知识库管理页面:</li>
</ul>
<p><img src="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/img/webui_0915_1.png" alt=""></p>
<hr>
<h2>常见问题</h2>
<p>参见 <a href="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/docs/FAQ.md">常见问题</a>。</p>
<hr>
<h2>路线图</h2>
<ul>
<li><input type="checkbox" checked disabled> Langchain 应用
<ul>
<li><input type="checkbox" checked disabled> 本地数据接入
<ul>
<li><input type="checkbox" checked disabled> 接入非结构化文档
<ul>
<li><input type="checkbox" checked disabled> .md</li>
<li><input type="checkbox" checked disabled> .txt</li>
<li><input type="checkbox" checked disabled> .docx</li>
</ul> </li>
<li><input type="checkbox" disabled> 结构化数据接入
<ul>
<li><input type="checkbox" checked disabled> .csv</li>
<li><input type="checkbox" disabled> .xlsx</li>
</ul> </li>
<li><input type="checkbox" disabled> 分词及召回
<ul>
<li><input type="checkbox" checked disabled> 接入不同类型 TextSplitter</li>
<li><input type="checkbox" checked disabled> 优化依据中文标点符号设计的 ChineseTextSplitter</li>
<li><input type="checkbox" disabled> 重新实现上下文拼接召回</li>
</ul> </li>
<li><input type="checkbox" disabled> 本地网页接入</li>
<li><input type="checkbox" disabled> SQL 接入</li>
<li><input type="checkbox" disabled> 知识图谱/图数据库接入</li>
</ul> </li>
<li><input type="checkbox" checked disabled> 搜索引擎接入
<ul>
<li><input type="checkbox" checked disabled> Bing 搜索</li>
<li><input type="checkbox" checked disabled> DuckDuckGo 搜索</li>
</ul> </li>
<li><input type="checkbox" checked disabled> Agent 实现
<ul>
<li><input type="checkbox" checked disabled> 基础React形式的Agent实现,包括调用计算器等</li>
<li><input type="checkbox" checked disabled> Langchain 自带的Agent实现和调用</li>
<li><input type="checkbox" disabled> 更多模型的Agent支持</li>
<li><input type="checkbox" disabled> 更多工具</li>
</ul> </li>
</ul> </li>
<li><input type="checkbox" checked disabled> LLM 模型接入
<ul>
<li><input type="checkbox" checked disabled> 支持通过调用 <a href="https://github.com/lm-sys/fastchat">FastChat</a> api 调用 llm</li>
<li><input type="checkbox" checked disabled> 支持 ChatGLM API 等 LLM API 的接入</li>
</ul> </li>
<li><input type="checkbox" checked disabled> Embedding 模型接入
<ul>
<li><input type="checkbox" checked disabled> 支持调用 HuggingFace 中各开源 Emebdding 模型</li>
<li><input type="checkbox" checked disabled> 支持 OpenAI Embedding API 等 Embedding API 的接入</li>
</ul> </li>
<li><input type="checkbox" checked disabled> 基于 FastAPI 的 API 方式调用</li>
<li><input type="checkbox" checked disabled> Web UI
<ul>
<li><input type="checkbox" checked disabled> 基于 Streamlit 的 Web UI</li>
</ul> </li>
</ul>
<hr>
<h2>项目交流群</h2>
<img src="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/img/qr_65.png" alt="二维码" width="300" height="300">
<p>🎉 langchain-Chatchat 项目微信交流群,如果你也对本项目感兴趣,欢迎加入群聊参与讨论交流。</p>
<h2>关注我们</h2>
<img src="https://raw.githubusercontent.com/chatchat-space/Langchain-Chatchat/master/img/official_account.png" alt="图片" width="900" height="300"> 🎉 langchain-Chatchat 项目官方公众号,欢迎扫码关注。
+ MetaGLM/FinGLM
+ 2023-10-11T01:23:33Z
+ tag:github.com,2023-10-11:/MetaGLM/FinGLM
+
+ <p></p><hr><h1 align="center">🌐 FinGLM</h1>
<!-- <h3 align="center">SMP 2023 ChatGLM 金融大模型挑战赛</h3>
<p align="center">
<img src="./img/" alt="FinGLM Logo"> --->
<p></p>
<p align="center"> <a href="https://tianchi.aliyun.com/competition/entrance/532126">赛题链接</a> | <a href="https://tianchi.aliyun.com/specials/promotion/SMP2023ChatGLMChallenge">赛题宣传页</a> </p>
<p>📃 <strong>FinGLM</strong>: 致力于构建一个开放的、公益的、持久的金融大模型项目,利用开源开放来促进「AI+金融」。</p>
<hr>
<h2>🚀 目录</h2>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D">项目介绍</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%A1%B9%E7%9B%AE%E6%A1%86%E6%9E%B6">项目框架</a>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E6%95%B0%E6%8D%AE%E5%87%86%E5%A4%87%E6%B5%81%E7%A8%8B">1. 数据准备流程</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E6%A8%A1%E5%9E%8B%E5%87%86%E5%A4%87%E6%B5%81%E7%A8%8B">2. 模型准备流程</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%97%AE%E7%AD%94%E6%B5%81%E7%A8%8B">3. 问答流程</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E5%BC%80%E6%BA%90%E8%B7%AF%E7%BA%BF%E5%9B%BE">开源路线图</a>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E5%BC%80%E6%BA%90%E7%AD%96%E7%95%A5">1. 开源策略</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E5%BC%80%E6%BA%90%E8%BF%9B%E5%BA%A6">2. 开源进度</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E6%AF%94%E8%B5%9B%E9%A1%B9%E7%9B%AE">比赛项目</a>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#FinGLM_all">0. FinGLM_all</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%A6%92%E5%A4%B4%E7%A7%91%E6%8A%80">1. 馒头科技</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E5%8D%97%E5%93%AA%E9%83%BD%E9%98%9F">2. 南哪都队</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#Chatglm%E5%8F%8D%E5%8D%B7%E6%80%BB%E5%B1%80">3. Chatglm反卷总局</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#nsddd">4. nsddd</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%BE%99%E7%9B%88%E6%88%98%E9%98%9F">5. 龙盈战队</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E7%BB%93%E5%A9%9A%E4%B9%B0%E6%88%BF%E4%BB%A3%E4%BB%A3%E9%9F%AD%E8%8F%9C">6. 结婚买房代代韭菜</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#TabIsabaopilong">7. TabIsabaopilong</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%A5%BA%E5%AD%90%E7%A0%94%E7%A9%B6%E9%99%A2">8. 饺子研究院</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E6%B5%81%E5%AE%9D%E7%9C%9F%E4%BA%BA">9. 流宝真人</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E6%95%B0%E6%8D%AE%E9%9B%86%E6%8F%8F%E8%BF%B0">数据集描述</a>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E5%B9%B4%E6%8A%A5%E6%95%B0%E6%8D%AE%E9%9B%86">1. 年报数据集</a>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#PDF%E4%B8%8B%E8%BD%BD">PDF下载</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#TXT%E4%B8%8B%E8%BD%BD">TXT下载</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#HTML%E4%B8%8B%E8%BD%BD">HTML下载</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E4%BD%BF%E7%94%A8%E5%BB%BA%E8%AE%AE">使用建议</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E6%A0%87%E6%B3%A8%E6%95%B0%E6%8D%AE">2. 标注数据</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%A1%B9%E7%9B%AE%E9%97%AE%E7%AD%94%E6%BC%94%E7%A4%BA">项目问答演示</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E8%B4%A1%E7%8C%AE%E8%80%85">贡献者</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E5%85%8D%E8%B4%A3%E5%A3%B0%E6%98%8E">免责声明</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%A1%B9%E7%9B%AE%E8%81%94%E7%B3%BB">项目联系</a></li>
</ul>
<hr>
<h2>📖 项目介绍</h2>
<p>📈 一个旨在深度解析上市公司年报的对话交互智能系统。面对金融文本中的专业术语与暗含信息,我们致力于用AI实现专家级别的金融分析。</p>
<p>🚀 在AI领域,虽然已在文本对话取得进展,但真正的金融交互场景仍然是一个巨大挑战。多方机构联手举办此次竞赛,探索金融领域AI的边界。</p>
<p>📘 上市公司年报为投资者呈现了公司的经营状况、财务状况和未来规划。专业知识是解读的关键,而我们的目标是通过AI技术让这一过程变得更简单、更准确。</p>
<hr>
<h2>🛠 项目框架</h2>
<h3>1. 数据准备流程</h3>
<ul>
<li> <p><strong><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/tools/pdf_to_txt">PDF 转 TXT</a></strong>:</p>
<ul>
<li>转换为 TXT 格式。</li>
<li>保留表格并合并单元格。</li>
</ul> </li>
<li> <p><strong>数据切分</strong>:</p>
<ul>
<li>基础信息:例如公司名称等。</li>
<li>财务数据:例如资产负债表等。</li>
<li>综合信息:例如财务指标等。</li>
</ul> </li>
<li> <p><strong>数据处理</strong>:</p>
<ul>
<li>计算基础公式:如营业成本率等。</li>
<li>计算增长率。</li>
<li>计算行业均值和排名。</li>
</ul> </li>
<li> <p><strong>存入数据库</strong>:</p>
<ul>
<li>存入 SQL、Mongo 和 ES 中。</li>
<li>包括建表及存储。</li>
</ul> </li>
</ul>
<h3>2. 模型微调流程</h3>
<ul>
<li> <p><strong>数据分类</strong>:如 SQL 数据、ES 数据等。</p> </li>
<li> <p><strong>选择微调策略</strong>:例如 ptuningv2、lora等。</p> </li>
<li> <p><strong>执行微调</strong>:根据选定策略。</p> </li>
</ul>
<h3>3. 问答流程</h3>
<ul>
<li><strong>输入问题</strong>:用户输入问题。</li>
<li><strong>Prompt 准备</strong>:根据问题生成 prompt。</li>
<li><strong>生成查询语句</strong>:基于 GPU 使用率选择生成方法。</li>
<li><strong>查询数据库</strong>:并返回结果。</li>
<li><strong>答案生成</strong>:结合问题和查询结果生成答案。</li>
</ul>
<hr>
<h2>🌱 开源路线图</h2>
<h3>1. 开源策略</h3>
<p><strong>1) 赛事转型</strong></p>
<ul>
<li>比赛转型为<a href="https://tianchi.aliyun.com/competition/entrance/532126">学习赛</a>,允许任何人学习使用。</li>
</ul>
<p><strong>2) 数据开源</strong></p>
<ul>
<li>目前开源数据有 <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/reports">70G/1w+份年报数据</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/">10000条人工标注评测数据</a>等。</li>
<li>后续我们也将根据项目需求,持续迭代更新数据。</li>
</ul>
<p><strong>3) 方案/代码/模型开源</strong></p>
<ul>
<li>经同意,<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E7%BB%93%E5%A9%9A%E4%B9%B0%E6%88%BF%E4%BB%A3%E4%BB%A3%E9%9F%AD%E8%8F%9C">结婚买房代代韭菜</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/Chatglm%E5%8F%8D%E5%8D%B7%E6%80%BB%E5%B1%80">Chatglm反卷总局</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/nsddd">nsddd</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E9%A6%92%E5%A4%B4%E7%A7%91%E6%8A%80">馒头科技</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E5%8D%97%E5%93%AA%E9%83%BD%E9%98%9F">南哪都队</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E9%BE%99%E7%9B%88%E6%88%98%E9%98%9F">龙盈战队</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/(./code/finglm_all)">安硕硕眼探企</a>等团队的方案、代码、模型完全开源,纳入FinGLM项目。</li>
<li>我们将长期维护优化 <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/finglm_all">FinGLM 项目</a>,提供便捷解决方案。</li>
</ul>
<p><strong>4) 开放交流</strong></p>
<ul>
<li>以上团队成员将共同维护 FinGLM项目,确保项目持续迭代。我们也欢迎更多团队来共同贡献问题和方案。</li>
<li>我们将不定期组织线上、线下交流,将更优秀的技术推广给每个项目成员。</li>
<li>FinGLM 开源项目出于完全公益目的,欢迎所有开发者<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/#%E8%B4%A1%E7%8C%AE%E8%80%85">申请加入</a>,当然我们会进行严格审核。</li>
</ul>
<p><strong>5) 学习教程</strong></p>
<ul>
<li>基于FinGLM项目的开发,我们将整合并制作以下(包含且不限于)学习教程.
<ul>
<li>数据预处理教程</li>
<li>数据库使用教程</li>
<li>GLM的使用教程</li>
<li>Prompt编写教程</li>
<li>模型微调数据准备</li>
<li>模型微调技巧和步骤</li>
<li>全流程落地</li>
</ul> </li>
</ul>
<p><strong>6) 项目资源池</strong></p>
<ul>
<li>为了维持项目的健康发展,部分项目组织者(个人和企业)提供 10 万元作为开源项目资金池,以及提供项目算力、数据和模型支持。</li>
<li>我们欢迎所有受益于本项目的个人或单位来赞助本项目,包括且不限于以上内容,欢迎<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/#%E5%BC%80%E6%BA%90%E8%B5%9E%E5%8A%A9">联系我们</a>。</li>
</ul>
<h3>2. 开源进度</h3>
<p><strong>第一期:</strong></p>
<ul>
<li><input type="checkbox" checked disabled> <a href="https://tianchi.aliyun.com/competition/entrance/532126">组织 SMP 2023 ChatGLM 金融大模型挑战赛</a></li>
<li><input type="checkbox" disabled> <strong>比赛数据集开源</strong>
<ul>
<li>年报数据集
<ul>
<li><input type="checkbox" checked disabled> <a href="https://modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset/summary">PDF 文件</a>。包含 11588 份 2019 年至 2021 年期间的部分上市公司年度报告。</li>
<li><input type="checkbox" checked disabled> <a href="https://modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset/summary">TXT 文件</a>。利用 <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/tool/pdf_to_txt"><code>pdf2txt.py</code></a> 对 PDF 文件解析而来。</li>
<li><input type="checkbox" checked disabled> <a href="https://modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset/summary">HTML 文件</a>。</li>
</ul> </li>
<li>数据库接入
<ul>
<li><input type="checkbox" disabled> sqlite</li>
<li><input type="checkbox" disabled> mongodb</li>
</ul> </li>
</ul> </li>
<li><input type="checkbox" checked disabled> 决赛项目开源:
<ul>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E9%A6%92%E5%A4%B4%E7%A7%91%E6%8A%80">馒头科技</a></li>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E5%8D%97%E5%93%AA%E9%83%BD%E9%98%9F">南哪都队</a></li>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/Chatglm%E5%8F%8D%E5%8D%B7%E6%80%BB%E5%B1%80">Chatglm反卷总局</a></li>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/nsddd">nsddd</a></li>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E9%BE%99%E7%9B%88%E6%88%98%E9%98%9F">龙盈战队</a></li>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E7%BB%93%E5%A9%9A%E4%B9%B0%E6%88%BF%E4%BB%A3%E4%BB%A3%E9%9F%AD%E8%8F%9C">结婚买房代代韭菜</a></li>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/.code/finglm_all">安硕硕眼探企</a></li>
</ul> </li>
</ul>
<p><strong>第二期:</strong></p>
<ul>
<li><input type="checkbox" disabled> 微调Fintune</li>
<li><input type="checkbox" disabled> 完善nl2sql</li>
<li><input type="checkbox" disabled> 增加学习教程
<ul>
<li><input type="checkbox" disabled> 数据预处理教程</li>
<li><input type="checkbox" disabled> 数据库使用教程</li>
<li><input type="checkbox" disabled> GLM的使用教程</li>
<li><input type="checkbox" disabled> Prompt编写教程</li>
<li><input type="checkbox" disabled> 模型微调数据准备</li>
<li><input type="checkbox" disabled> 模型微调技巧和步骤</li>
<li><input type="checkbox" disabled> 全流程落地</li>
</ul> </li>
<li><input type="checkbox" disabled> 问答系统异常处理</li>
<li><input type="checkbox" disabled> 提供详细使用手册</li>
<li><input type="checkbox" disabled> 文档注释完善</li>
</ul>
<hr>
<h2>🏆 开源项目</h2>
<h3>0. FinGLM_all</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/.slides/%E5%AE%89%E7%A1%95%E7%A1%95%E7%9C%BC%E6%8E%A2%E4%BC%81%E5%88%86%E4%BA%AB%E5%8F%8AFinGLM%E5%BC%80%E6%BA%90%E5%8F%91%E5%B8%83.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1ip4y1F7Gw/">[视频]</a><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/finglm_all">[代码]</a></p>
<p>本项目为安硕硕眼探企团队,根据自己的项目以及其他几队的项目整合而成。后续我们也将围绕此项目进行持续迭代升级。</p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/finglm_all.jpg" alt=""></p>
<h3>1. 馒头科技</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/%E9%A6%92%E5%A4%B4%E7%A7%91%E6%8A%80.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV18h4y187UU/">[视频]</a> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E9%A6%92%E5%A4%B4%E7%A7%91%E6%8A%80">[代码]</a> <img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/mantou.jpg" alt="mantou"></p>
<h3>2. 南哪都队</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/%E5%8D%97%E5%93%AA%E9%83%BD%E9%98%9F.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1Gm4y1V7LD/">[视频]</a> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E5%8D%97%E5%93%AA%E9%83%BD%E9%98%9F">[代码]</a></p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/nanna.jpg" alt="nanna"></p>
<h3>3. Chatglm反卷总局</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/ChatGLM%E5%8F%8D%E5%8D%B7%E6%80%BB%E5%B1%80.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1hu4y147EW/">[视频]</a> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/Chatglm%E5%8F%8D%E5%8D%B7%E6%80%BB%E5%B1%80">[代码]</a></p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/chatglmfanjuan.jpg" alt="chatglmfanjuan"></p>
<h3>4. nsddd</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/nsddd.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV15u4y147Xx">[视频]</a> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/nsddd">[代码]</a></p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/nsddd.jpg" alt="nsddd"></p>
<h3>5. 龙盈战队</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/%E9%BE%99%E7%9B%88%E6%88%98%E9%98%9F.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1Ju4y167ew">[视频]</a> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E9%BE%99%E7%9B%88%E6%88%98%E9%98%9F">[代码]</a></p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/longying.jpg" alt="longying"></p>
<h3>6. 结婚买房代代韭菜</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/%E7%BB%93%E5%A9%9A%E4%B9%B0%E6%88%BF%E4%BB%A3%E4%BB%A3%E9%9F%AD%E8%8F%9C.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1rm4y1G7uj">[视频]</a> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E7%BB%93%E5%A9%9A%E4%B9%B0%E6%88%BF%E4%BB%A3%E4%BB%A3%E9%9F%AD%E8%8F%9C">[代码]</a></p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/jiehun1.jpg" alt="jiehun"> <img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/jiehun2.jpg" alt="jiehun2"></p>
<h3>7. TabIsabaopilong</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/TabIsabaopilong.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1894y1a7NJ/">[视频]</a> [代码]</p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/tab1.jpg" alt="tab1"> <img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/tab2.jpg" alt="tab2"></p>
<h3>8. 饺子研究院</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/%E5%90%83%E8%BE%A3%E5%AD%90.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV12z4y1V7S3/?spm_id_from=333.999.0.0&vd_source=df16438efe36af5724526b8869fb54c1">[视频]</a> [代码]</p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/jiaozi.jpg" alt="jiaozi"></p>
<h3>9. 流宝真人</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/%E6%B5%81%E5%AE%9D%E7%9C%9F%E4%BA%BA.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1QF411m7ap">[视频]</a> [代码]</p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/liubao.jpg" alt="liubao"></p>
<hr>
<h2>📚 数据集</h2>
<h3>1. 年报数据集</h3>
<p>我们开源的数据集涵盖了2019-2021年期间部分上市公司的年度报告。该数据集共包含 11588 个详尽的 PDF 文件(<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/reports/reports_list.csv">list</a>)。您可以利用这些PDF文件的内容来构建您需要的数据库或者向量库。为了避免计算资源浪费,我们也将相应的文件转换成 TXT文件和 HTML文件,供大家使用。</p>
<h4><a href="https://modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset/summary">PDF下载</a></h4>
<blockquote>
<p>大小:69GB 文件格式:pdf文件 文件数量:11588</p>
</blockquote>
<p>git加载</p>
<pre><code># 要求安装 git lfs
git clone http://www.modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset.git
</code></pre>
<p>sdk加载</p>
<pre><code># Note:
# 1. 【重要】请将modelscope sdk升级到v1.7.2rc0,执行: pip3 install "modelscope==1.7.2rc0" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
# 2. 【重要】datasets版本限制为 >=2.8.0, <=2.13.0,可执行: pip3 install datasets==2.13.0
from modelscope.msdatasets import MsDataset
# 使用流式方式加载「推荐」
# 无需全量加载到cache,随下随处理
# 其中,通过设置 stream_batch_size 可以使用batch的方式加载
ds = MsDataset.load('chatglm_llm_fintech_raw_dataset', split='train', use_streaming=True, stream_batch_size=1)
for item in ds:
print(item)
# 加载结果示例(单条,pdf:FILE字段值为该pdf文件本地缓存路径,文件名做了SHA转码,可以直接打开)
{'name': ['2020-03-24__北京鼎汉技术集团股份有限公司__300011__鼎汉技术__2019年__年度报告.pdf'], 'pdf:FILE': ['~/.cache/modelscope/hub/datasets/modelscope/chatglm_llm_fintech_raw_dataset/master/data_files/430da7c46fb80d4d095a57b4fb223258ffa1afe8bf53d0484e3f2650f5904b5c']}
# 备注:
1. 自定义缓存路径,可以自行设置cache_dir参数,即 MsDataset.load(..., cache_dir='/to/your/path')
2. 补充数据加载(从9493条增加到11588条),sdk加载注意事项
a) 删除缓存中的csv映射文件(默认路径为): ~/.cache/modelscope/hub/datasets/modelscope/chatglm_llm_fintech_raw_dataset/master/data_files/732dc4f3b18fc52380371636931af4c8
b) 使用MsDataset.load(...) 加载,默认会reuse已下载过的文件,不会重复下载。
</code></pre>
<h4><a href="https://modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset/summary">TXT下载</a></h4>
<p>Note: pdf转txt格式文件,方便大家复用(有个文件损坏了,所以总数比pdf少1个,共11587 个)</p>
<pre><code># Linux
wget https://sail-moe.oss-cn-hangzhou.aliyuncs.com/open_data/hackathon_chatglm_fintech/alltxt.zip
# Windows示例
Invoke-WebRequest -Uri https://sail-moe.oss-cn-hangzhou.aliyuncs.com/open_data/hackathon_chatglm_fintech/alltxt.zip -OutFile D:\\alltxt.zip
</code></pre>
<h4>HTML下载</h4>
<p>Note: pdf转html格式文件,方便大家复用(有个文件损坏了,所以总数比pdf少,共11582 个)</p>
<pre><code># Linux
wget https://sail-moe.oss-cn-hangzhou.aliyuncs.com/open_data/hackathon_chatglm_fintech/allhtml.zip
# Windows示例
Invoke-WebRequest -Uri https://sail-moe.oss-cn-hangzhou.aliyuncs.com/open_data/hackathon_chatglm_fintech/allhtml.zip -OutFile D:\\allhtml.zip
</code></pre>
<h4>使用建议</h4>
<p>以下是我们推荐的处理步骤:</p>
<p>1、PDF文本和表格提取:您可以使用如pdfplumber、pdfminer等工具包提取PDF文件中的文本和表格数据。</p>
<p>2、数据切分:根据PDF文件的目录、子目录和章节信息,对内容进行精确的切块处理。</p>
<p>3、构建基础金融数据库:依据金融知识和PDF内容,设计专业的金融数据库字段和格式。例如,定义资产负债表、现金流量表和利润表等。</p>
<p>4、信息提取:使用大模型的信息提取能力和NLP技术来抽取对应的金融字段信息。例如,请使用json方式输出目录的内容,其中章节的名称作为key,页码作为value。同时,请详细地抽取表格内的数据,以JSON格式输出。</p>
<p>5、构建金融知识问答库:结合构建的金融数据库,应用大模型构建基础的金融问答库。例如,</p>
<pre><code>{"question":"某公司2021年的财务费用为多少元?", "answer": "某公司2021年的财务费用为XXXX元。"}
prompt:用多种句式修改question及answer的内容。
{"question":"为什么财务费用可以是负的?", "answer": ""}
prompt:请模仿上面的question给出100个类似的问题与对应的答案,用json输出。
</code></pre>
<p>6、构建向量库:借助于如Word2Vec、Text2Vec等技术,从原始文本数据中提取出语义向量。使用pgvector这种基于PostgreSQL的扩展来存储和索引这些向量,从而建立起一个可供高效查询的大规模向量库。</p>
<p>7、应用:结合向量库、大模型、langchain等工具,提升应用效果。</p>
<h3>2. 标注数据</h3>
<p>在 <a href="https://tianchi.aliyun.com/competition/entrance/532126">SMP 2023 ChatGLM 金融大模型挑战赛</a> 中我们分别进行了初赛、复赛A、复赛B、复赛C。针对这几轮比赛,我们分别人工标注了相关数据,累计总共有 10000 条。</p>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/pre-data">[初赛数据]</a> :5000 条</li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/A-data">[复赛 A 数据]</a> :2000 条</li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/B-data">[复赛 B 数据]</a> :2000 条</li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/C-data">[复赛 C 数据]</a> :1000 条</li>
</ul>
<p>数据示例:</p>
<pre><code class="language-python">{"ID": 1,
"question": "2019年中国工商银行财务费用是多少元?",
"answer":"2019年中国工商银行财务费用是12345678.9元。"}
{"ID": 2,
"question": "工商银行2019年营业外支出和营业外收入分别是多少元?",
"answer": "工商银行2019年营业外支出为12345678.9元,营业外收入为2345678.9元。"}
{"ID":3,
"question": "中国工商银行2021年净利润增长率是多少?保留2位小数。",
"answer": "中国工商银行2020年净利润为12345678.90元,2021年净利润为22345678.90元,根据公式,净利润增长率=(净利润-上年净利润)/上年净利润,得出结果中国工商银行2021年净利润增长率81.00%。" }
</code></pre>
<p>与此同时,我们也针对比赛撰写了<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/evaluate.py">评测代码</a>。我们依据:</p>
<pre><code class="language-math">
\begin{array}{ll}
max_{similar}(sentence1,sentence2,sentence3), & 无基础信息及关键词\\
0.25+0.25+max_{similar}(sentence1,sentence2,sentence3)*0.5, & 基础信息正确,关键词正确 \\
0.25 + 0 + max_{similar}(sentence1,sentence2,sentence3)*0.5, & 基础信息正确,关键词错误\\
0, & 基础信息错误
\end{array}
</code></pre>
<p>评测示例:</p>
<pre><code class="language-python">{"question": "2019年中国工商银行财务费用是多少元?",
"prompt": {"财务费用": "12345678.9元", "key_word":"财务费用、2019", "prom_answer": "12345678.9元"},
"answer": [
"2019年中国工商银行财务费用是12345678.9元。",
"2019年工商银行财务费用是12345678.9元。",
"中国工商银行2019年的财务费用是12345678.9元。" ]
}
</code></pre>
<p>评测计算示例:</p>
<p><strong>答案一:工商银行2019年财务费用是12345678.9元。</strong></p>
<p>most similar sentences:</p>
<p>2019年工商银行财务费用是12345678.9元。 (Score: 0.9915)</p>
<p>中国工商银行2019年的财务费用是12345678.9元。 (Score: 0.9820)</p>
<p>2019年中国工商银行财务费用是12345678.9元。 (Score: 0.9720)</p>
<p>评分:0.25+0.25+0.9915*0.5=0.9958分。</p>
<blockquote>
<p>评分解释:prom_answer正确、包含所有key_word、相似度最高0.9915。</p>
</blockquote>
<p><strong>答案二:2019年中国工商银行财务费用是335768.91元。</strong></p>
<p>评分:0分。</p>
<blockquote>
<p>评分解释:prom_answer错误不得分。</p>
</blockquote>
<p><strong>答案三:12345678.9元。</strong></p>
<p>most similar sentences:</p>
<p>2019年工商银行财务费用是12345678.9元。 (Score: 0.6488)</p>
<p>2019年中国工商银行财务费用是12345678.9元。 (Score: 0.6409)</p>
<p>中国工商银行2019年的财务费用是12345678.9元。 (Score: 0.6191)</p>
<p>评分:0.25+0+0.6488*0.5=0.5744分。</p>
<blockquote>
<p>评分解释:prom_answer正确、未包含所有key_word、相似度最高0.6488。</p>
</blockquote>
<h2>📊 项目问答演示</h2>
<pre><code class="language-python">{"id": 0, "question": "2021年其他流动资产第12高的是哪家上市公司?", "answer": "2021年其他流动资产第12高的公司是苏美达股份有限公司。"}
{"id": 1, "question": "注册地址在重庆的上市公司中,2021年营业收入大于5亿的有多少家?", "answer": "2021年注册在重庆,营业收入大于5亿的公司一共有4家。"}
{"id": 2, "question": "广东华特气体股份有限公司2021年的职工总人数为?", "answer": "2021年广东华特气体股份有限公司职工总人数是1044人。"}
{"id": 3, "question": "在保留两位小数的情况下,请计算出金钼股份2019年的流动负债比率", "answer": "2019金钼股份流动负债比率是61.10%。其中流动负债是1068418275.97元;总负债是1748627619.69元;"}
{"id": 4, "question": "2019年负债总金额最高的上市公司为?", "answer": "2019年负债合计最高的是上海汽车集团股份有限公司。"}
{"id": 5, "question": "2019年总资产最高的前五家上市公司是哪些家?", "answer": "2019年资产总计最高前五家是上海汽车集团股份有限公司、中远海运控股股份有限公司、国投电力控股股份有限公司、华域汽车系统股份有限公司、广州汽车集团股份有限公司。"}
{"id": 6, "question": "2020年营业收入最高的3家并且曾经在宁波注册的上市公司是?金额是?", "answer": "注册在宁波,2020年营业收入最高的3家是宁波均胜电子股份有限公司营业收入47889837616.15元;宁波建工股份有限公司营业收入19796854240.57元;宁波继峰汽车零部件股份有限公司营业收入15732749552.37元。"}
{"id": 7, "question": "注册地址在苏州的上市公司中,2020年利润总额大于5亿的有多少家?", "answer": "2020年注册在苏州,利润总额大于5亿的公司一共有2家。"}
{"id": 8, "question": "浙江运达风电股份有限公司在2019年的时候应收款项融资是多少元?", "answer": "2019年浙江运达风电股份有限公司应收款项融资是51086824.07元。"}
{"id": 9, "question": "神驰机电股份有限公司2020年的注册地址为?", "answer": "2020年神驰机电股份有限公司注册地址是重庆市北碚区童家溪镇同兴北路200号。"}
{"id": 10, "question": "2019年山东惠发食品股份有限公司营业外支出和营业外收入分别是多少元?", "answer": "2019年山东惠发食品股份有限公司营业外收入是1018122.97元;营业外支出是2513885.46元。"}
{"id": 11, "question": "福建广生堂药业股份有限公司2020年年报中提及的财务费用增长率具体是什么?", "answer": "2020福建广生堂药业股份有限公司财务费用增长率是34.33%。其中,财务费用是7766850.48元;上年财务费用是5781839.51元。"}
{"id": 12, "question": "华灿光电股份有限公司2021年的法定代表人与上年相比相同吗?", "answer": "不相同,华灿光电股份有限公司2020年法定代表人是俞信华,2021年法定代表人是郭瑾。"}
{"id": 13, "question": "请具体描述一下2020年仲景食品控股股东是否发生变更。", "answer": "2020年,仲景食品控股股东没有发生变更。"}
{"id": 14, "question": "什么是其他债权投资?", "answer": "其他债权投资是指企业或机构投资者通过购买债券、贷款、定期存款等金融产品获得的固定收益。这些金融产品通常由政府、公司或其他机构发行,具有一定的信用等级和风险。\n\n其他债权投资是企业或机构投资组合中的一部分,通常用于稳定收益和分散风险。与股票投资相比,其他债权投资的风险较低,但收益也相对较低。\n\n其他债权投资的管理和投资策略与其他资产类别类似,包括分散投资、风险控制、收益最大化等。然而,由于其他债权投资的种类繁多,其投资和管理也存在一定的特殊性。"}
</code></pre>
<h2>🤝 贡献者</h2>
<p>以下是为本项目做出贡献的团队和个人:</p>
<ul>
<li>🌟 安硕硕眼探企</li>
<li>🌟 馒头科技</li>
<li>🌟 南哪都队</li>
<li>🌟 Chatglm反卷总局</li>
<li>🌟 nsddd</li>
<li>🌟 龙盈战队</li>
<li>🌟 结婚买房代代韭菜</li>
<li>🌟 小打小闹</li>
<li>🌟 东北大土豆</li>
<li>🌟 ... 更多贡献者</li>
</ul>
<p>FinGLM 开源项目出于完全公益目的,欢迎所有开发者申请加入,当然我们会进行严格审核。如有意向,请填写 <a href="https://lslfd0slxc.feishu.cn/share/base/form/shrcncipvYdAVitiTqNqxwIjglc">表单</a> 。</p>
<h2>免责声明</h2>
<p>本项目相关资源仅供研究、交流使用,一般不建议用于商业用途;如用于商业用途,由此所带来的法律风险,请自行承担。</p>
<p>涉及到模型商业使用问题,请务必遵循相关模型的协议,例如 <a href="https://github.com/THUDM/ChatGLM-6B">ChatGLM-6B</a>。</p>
<h2>🔍 项目联系</h2>
<h3>项目交流群</h3>
<img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/qun.png" alt="项目答疑群" width="200" height="200" title="项目答疑群">
<h3>开源赞助</h3>
<img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/jw.jpg" alt="开源赞助联系人" width="200" height="200" title="开源赞助联系人">
<h3>开源贡献</h3>
<img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/jl.png" alt="开源贡献联系人" width="200" height="200" title="开源贡献联系人">
\ No newline at end of file
diff --git a/alloy/daily/index.xml b/alloy/daily/index.xml
index bdb6c4f11db..f929c87acee 100644
--- a/alloy/daily/index.xml
+++ b/alloy/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Alloy Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:23Z
+ 2023-10-11T01:24:10Z
Daily Trending of Alloy in GitHub
\ No newline at end of file
diff --git a/alpine-abuild/daily/index.xml b/alpine-abuild/daily/index.xml
index 983543ea975..36a6b0a724c 100644
--- a/alpine-abuild/daily/index.xml
+++ b/alpine-abuild/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Alpine Abuild Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:21Z
+ 2023-10-11T01:24:07Z
Daily Trending of Alpine Abuild in GitHub
\ No newline at end of file
diff --git a/altium-designer/daily/index.xml b/altium-designer/daily/index.xml
index e75b88fa7af..1a5df8b6b54 100644
--- a/altium-designer/daily/index.xml
+++ b/altium-designer/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Altium Designer Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:22Z
+ 2023-10-11T01:24:08Z
Daily Trending of Altium Designer in GitHub
\ No newline at end of file
diff --git a/ampl/daily/index.xml b/ampl/daily/index.xml
index 3b5dd037377..28efd0916d0 100644
--- a/ampl/daily/index.xml
+++ b/ampl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub AMPL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:25Z
+ 2023-10-11T01:24:14Z
Daily Trending of AMPL in GitHub
\ No newline at end of file
diff --git a/angelscript/daily/index.xml b/angelscript/daily/index.xml
index af96330706d..737fa955a01 100644
--- a/angelscript/daily/index.xml
+++ b/angelscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub AngelScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:26Z
+ 2023-10-11T01:24:12Z
Daily Trending of AngelScript in GitHub
\ No newline at end of file
diff --git a/ant-build-system/daily/index.xml b/ant-build-system/daily/index.xml
index 0cde0aba619..83f1dd10977 100644
--- a/ant-build-system/daily/index.xml
+++ b/ant-build-system/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Ant Build System Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:27Z
+ 2023-10-11T01:24:11Z
Daily Trending of Ant Build System in GitHub
\ No newline at end of file
diff --git a/antlr/daily/index.xml b/antlr/daily/index.xml
index b401b64abc2..fb87499cc88 100644
--- a/antlr/daily/index.xml
+++ b/antlr/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ANTLR Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:31Z
+ 2023-10-11T01:24:18Z
Daily Trending of ANTLR in GitHub
\ No newline at end of file
diff --git a/apacheconf/daily/index.xml b/apacheconf/daily/index.xml
index 1ec02d16d92..6535bcc4b52 100644
--- a/apacheconf/daily/index.xml
+++ b/apacheconf/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ApacheConf Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:30Z
+ 2023-10-11T01:24:15Z
Daily Trending of ApacheConf in GitHub
\ No newline at end of file
diff --git a/apex/daily/index.xml b/apex/daily/index.xml
index ca90832aa36..fdf17036ff1 100644
--- a/apex/daily/index.xml
+++ b/apex/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Apex Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:29Z
+ 2023-10-11T01:24:17Z
Daily Trending of Apex in GitHub
\ No newline at end of file
diff --git a/api-blueprint/daily/index.xml b/api-blueprint/daily/index.xml
index e1f5803faba..96d7fbb1c6f 100644
--- a/api-blueprint/daily/index.xml
+++ b/api-blueprint/daily/index.xml
@@ -1,7 +1,7 @@
GitHub API Blueprint Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:30Z
+ 2023-10-11T01:24:16Z
Daily Trending of API Blueprint in GitHub
\ No newline at end of file
diff --git a/apl/daily/index.xml b/apl/daily/index.xml
index 5c5902c83ac..22e2b89788e 100644
--- a/apl/daily/index.xml
+++ b/apl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub APL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:34Z
+ 2023-10-11T01:24:20Z
Daily Trending of APL in GitHub
\ No newline at end of file
diff --git a/apollo-guidance-computer/daily/index.xml b/apollo-guidance-computer/daily/index.xml
index 7b089be3e1f..8286cf49188 100644
--- a/apollo-guidance-computer/daily/index.xml
+++ b/apollo-guidance-computer/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Apollo Guidance Computer Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:33Z
+ 2023-10-11T01:24:22Z
Daily Trending of Apollo Guidance Computer in GitHub
\ No newline at end of file
diff --git a/applescript/daily/index.xml b/applescript/daily/index.xml
index 7df8cb10a36..6721b6cc92e 100644
--- a/applescript/daily/index.xml
+++ b/applescript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub AppleScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:35Z
+ 2023-10-11T01:24:21Z
Daily Trending of AppleScript in GitHub
\ No newline at end of file
diff --git a/arc/daily/index.xml b/arc/daily/index.xml
index fdb33f54aa0..f67bbc6702a 100644
--- a/arc/daily/index.xml
+++ b/arc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Arc Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:33Z
+ 2023-10-11T01:24:19Z
Daily Trending of Arc in GitHub
\ No newline at end of file
diff --git a/asciidoc/daily/index.xml b/asciidoc/daily/index.xml
index 55744eb563d..447a36edb23 100644
--- a/asciidoc/daily/index.xml
+++ b/asciidoc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub AsciiDoc Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:39Z
+ 2023-10-11T01:24:26Z
Daily Trending of AsciiDoc in GitHub
\ No newline at end of file
diff --git a/asl/daily/index.xml b/asl/daily/index.xml
index 31f9b38bec0..ffd89d76678 100644
--- a/asl/daily/index.xml
+++ b/asl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ASL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:40Z
+ 2023-10-11T01:24:24Z
Daily Trending of ASL in GitHub
\ No newline at end of file
diff --git a/asn.1/daily/index.xml b/asn.1/daily/index.xml
index 7413033d256..6b7b7bb5435 100644
--- a/asn.1/daily/index.xml
+++ b/asn.1/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ASN.1 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:38Z
+ 2023-10-11T01:24:23Z
Daily Trending of ASN.1 in GitHub
\ No newline at end of file
diff --git a/asp.net/daily/index.xml b/asp.net/daily/index.xml
index b935b416569..c46b0ac21dc 100644
--- a/asp.net/daily/index.xml
+++ b/asp.net/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ASP.NET Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:41Z
+ 2023-10-11T01:24:28Z
Daily Trending of ASP.NET in GitHub
\ No newline at end of file
diff --git a/aspectj/daily/index.xml b/aspectj/daily/index.xml
index 7459f70d6ba..368eb60537a 100644
--- a/aspectj/daily/index.xml
+++ b/aspectj/daily/index.xml
@@ -1,7 +1,7 @@
GitHub AspectJ Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:42Z
+ 2023-10-11T01:24:27Z
Daily Trending of AspectJ in GitHub
\ No newline at end of file
diff --git a/assembly/daily/index.xml b/assembly/daily/index.xml
index e8a64a5a13a..cf5fe34167d 100644
--- a/assembly/daily/index.xml
+++ b/assembly/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Assembly Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:45Z
+ 2023-10-11T01:24:33Z
Daily Trending of Assembly in GitHub
\ No newline at end of file
diff --git a/astro/daily/index.xml b/astro/daily/index.xml
index 97ee3f1fee1..372f5a9fb1c 100644
--- a/astro/daily/index.xml
+++ b/astro/daily/index.xml
@@ -1,14 +1,14 @@
GitHub Astro Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:47Z
+ 2023-10-11T01:24:30Z
Daily Trending of Astro in GitHub
- deaaprizal/unofficial-trust
- 2023-10-10T01:24:47Z
- tag:github.com,2023-10-10:/deaaprizal/unofficial-trust
-
- <p>video: https://youtu.be/_pFe43G_jV4</p><hr>
+ Playform/AstroStarterTemplate
+ 2023-10-11T01:24:30Z
+ tag:github.com,2023-10-11:/Playform/AstroStarterTemplate
+
+ <p>📄 Starter template for AstroJS.</p><hr>
\ No newline at end of file
diff --git a/asymptote/daily/index.xml b/asymptote/daily/index.xml
index 5be8efd15d9..af991cb3c7f 100644
--- a/asymptote/daily/index.xml
+++ b/asymptote/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Asymptote Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:52Z
+ 2023-10-11T01:24:34Z
Daily Trending of Asymptote in GitHub
\ No newline at end of file
diff --git a/ats/daily/index.xml b/ats/daily/index.xml
index 161817aa288..f508cfcc014 100644
--- a/ats/daily/index.xml
+++ b/ats/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ATS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:49Z
+ 2023-10-11T01:24:36Z
Daily Trending of ATS in GitHub
\ No newline at end of file
diff --git a/augeas/daily/index.xml b/augeas/daily/index.xml
index e9223e911a8..ae867dd4c6c 100644
--- a/augeas/daily/index.xml
+++ b/augeas/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Augeas Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:48Z
+ 2023-10-11T01:24:35Z
Daily Trending of Augeas in GitHub
\ No newline at end of file
diff --git a/autohotkey/daily/index.xml b/autohotkey/daily/index.xml
index b87ea3325b3..3a1e86cee25 100644
--- a/autohotkey/daily/index.xml
+++ b/autohotkey/daily/index.xml
@@ -1,14 +1,7 @@
GitHub AutoHotkey Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:51Z
+ 2023-10-11T01:24:37Z
Daily Trending of AutoHotkey in GitHub
-
- segiqt/cs2-ahk-hack
- 2023-10-10T01:24:51Z
- tag:github.com,2023-10-10:/segiqt/cs2-ahk-hack
-
- <p>A working in progress internal cheat for CS2 written in ahk :p</p><hr>
-
\ No newline at end of file
diff --git a/autoit/daily/index.xml b/autoit/daily/index.xml
index 6b839df8235..a32ca78145f 100644
--- a/autoit/daily/index.xml
+++ b/autoit/daily/index.xml
@@ -1,7 +1,14 @@
GitHub AutoIt Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:56Z
+ 2023-10-11T01:24:39Z
Daily Trending of AutoIt in GitHub
+
+ xwxbug/autoit-cn
+ 2023-10-11T01:24:39Z
+ tag:github.com,2023-10-11:/xwxbug/autoit-cn
+
+ <p>AutoIt script software translate and enhancement.(EN2CHS)</p><hr>
+
\ No newline at end of file
diff --git a/avro-idl/daily/index.xml b/avro-idl/daily/index.xml
index f28b15a54fb..fe603f5dacb 100644
--- a/avro-idl/daily/index.xml
+++ b/avro-idl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Avro IDL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:53Z
+ 2023-10-11T01:24:40Z
Daily Trending of Avro IDL in GitHub
\ No newline at end of file
diff --git a/awk/daily/index.xml b/awk/daily/index.xml
index 13e5bb6a42f..095ee49b171 100644
--- a/awk/daily/index.xml
+++ b/awk/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Awk Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:54Z
+ 2023-10-11T01:24:38Z
Daily Trending of Awk in GitHub
\ No newline at end of file
diff --git a/ballerina/daily/index.xml b/ballerina/daily/index.xml
index 4148f4c1e8e..848169c8677 100644
--- a/ballerina/daily/index.xml
+++ b/ballerina/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Ballerina Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:54Z
+ 2023-10-11T01:24:41Z
Daily Trending of Ballerina in GitHub
\ No newline at end of file
diff --git a/basic/daily/index.xml b/basic/daily/index.xml
index a396b660dab..c10dbd7abe8 100644
--- a/basic/daily/index.xml
+++ b/basic/daily/index.xml
@@ -1,7 +1,7 @@
GitHub BASIC Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:57Z
+ 2023-10-11T01:24:43Z
Daily Trending of BASIC in GitHub
\ No newline at end of file
diff --git a/batchfile/daily/index.xml b/batchfile/daily/index.xml
index 4b64a38063c..9a6cf629d46 100644
--- a/batchfile/daily/index.xml
+++ b/batchfile/daily/index.xml
@@ -1,14 +1,7 @@
GitHub Batchfile Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:01Z
+ 2023-10-11T01:24:46Z
Daily Trending of Batchfile in GitHub
-
- shuhongfan/NavicatCracker
- 2023-10-10T01:25:01Z
- tag:github.com,2023-10-10:/shuhongfan/NavicatCracker
-
- <p>navicat 激活 Navicat所有版本破解 A keygen for Navicat 16 Navicat16破解 Navicat Keygen Navicat 16 Keygen注册机(NavicatCracker) Navicat 16 破解 Navicat Premium 16 破解 Navicat破解 绿色版 MySQL</p><hr>
-
\ No newline at end of file
diff --git a/beef/daily/index.xml b/beef/daily/index.xml
index 8aacc3438a0..f540c02c1a3 100644
--- a/beef/daily/index.xml
+++ b/beef/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Beef Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:58Z
+ 2023-10-11T01:24:42Z
Daily Trending of Beef in GitHub
\ No newline at end of file
diff --git a/befunge/daily/index.xml b/befunge/daily/index.xml
index 5300525da2e..a58d9884a3a 100644
--- a/befunge/daily/index.xml
+++ b/befunge/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Befunge Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:24:59Z
+ 2023-10-11T01:24:44Z
Daily Trending of Befunge in GitHub
\ No newline at end of file
diff --git a/berry/daily/index.xml b/berry/daily/index.xml
index 86c2dbf9dc1..859762229c8 100644
--- a/berry/daily/index.xml
+++ b/berry/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Berry Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:03Z
+ 2023-10-11T01:24:49Z
Daily Trending of Berry in GitHub
\ No newline at end of file
diff --git a/bibtex/daily/index.xml b/bibtex/daily/index.xml
index 58312c69c88..ec7d00f82a4 100644
--- a/bibtex/daily/index.xml
+++ b/bibtex/daily/index.xml
@@ -1,7 +1,7 @@
GitHub BibTeX Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:04Z
+ 2023-10-11T01:24:48Z
Daily Trending of BibTeX in GitHub
\ No newline at end of file
diff --git a/bicep/daily/index.xml b/bicep/daily/index.xml
index b31706fa8b7..8e482fb8bb0 100644
--- a/bicep/daily/index.xml
+++ b/bicep/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Bicep Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:05Z
+ 2023-10-11T01:24:51Z
Daily Trending of Bicep in GitHub
\ No newline at end of file
diff --git a/bison/daily/index.xml b/bison/daily/index.xml
index f26ebc723cf..ae84bde5e17 100644
--- a/bison/daily/index.xml
+++ b/bison/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Bison Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:08Z
+ 2023-10-11T01:24:54Z
Daily Trending of Bison in GitHub
\ No newline at end of file
diff --git a/bitbake/daily/index.xml b/bitbake/daily/index.xml
index e5105e6642c..e03f8733b29 100644
--- a/bitbake/daily/index.xml
+++ b/bitbake/daily/index.xml
@@ -1,7 +1,7 @@
GitHub BitBake Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:11Z
+ 2023-10-11T01:24:56Z
Daily Trending of BitBake in GitHub
\ No newline at end of file
diff --git a/blade/daily/index.xml b/blade/daily/index.xml
index 15b74daa20d..f83d255dc38 100644
--- a/blade/daily/index.xml
+++ b/blade/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Blade Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:09Z
+ 2023-10-11T01:24:54Z
Daily Trending of Blade in GitHub
\ No newline at end of file
diff --git a/blitzbasic/daily/index.xml b/blitzbasic/daily/index.xml
index 107ab4ccea5..9827aa406d1 100644
--- a/blitzbasic/daily/index.xml
+++ b/blitzbasic/daily/index.xml
@@ -1,7 +1,7 @@
GitHub BlitzBasic Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:07Z
+ 2023-10-11T01:24:52Z
Daily Trending of BlitzBasic in GitHub
\ No newline at end of file
diff --git a/blitzmax/daily/index.xml b/blitzmax/daily/index.xml
index 8156dcdec6c..2672ceef606 100644
--- a/blitzmax/daily/index.xml
+++ b/blitzmax/daily/index.xml
@@ -1,7 +1,7 @@
GitHub BlitzMax Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:14Z
+ 2023-10-11T01:24:58Z
Daily Trending of BlitzMax in GitHub
\ No newline at end of file
diff --git a/bluespec/daily/index.xml b/bluespec/daily/index.xml
index b4e258f9535..ef2a4faac00 100644
--- a/bluespec/daily/index.xml
+++ b/bluespec/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Bluespec Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:12Z
+ 2023-10-11T01:25:00Z
Daily Trending of Bluespec in GitHub
\ No newline at end of file
diff --git a/boo/daily/index.xml b/boo/daily/index.xml
index b640b45c075..0282c18a0a2 100644
--- a/boo/daily/index.xml
+++ b/boo/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Boo Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:13Z
+ 2023-10-11T01:25:01Z
Daily Trending of Boo in GitHub
\ No newline at end of file
diff --git a/boogie/daily/index.xml b/boogie/daily/index.xml
index 9dc48bb446c..819825b05e8 100644
--- a/boogie/daily/index.xml
+++ b/boogie/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Boogie Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:17Z
+ 2023-10-11T01:25:04Z
Daily Trending of Boogie in GitHub
\ No newline at end of file
diff --git a/brainfuck/daily/index.xml b/brainfuck/daily/index.xml
index 49102e559af..3bdbfbd2841 100644
--- a/brainfuck/daily/index.xml
+++ b/brainfuck/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Brainfuck Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:16Z
+ 2023-10-11T01:25:03Z
Daily Trending of Brainfuck in GitHub
\ No newline at end of file
diff --git a/brightscript/daily/index.xml b/brightscript/daily/index.xml
index d2145ce9edf..06805f669ee 100644
--- a/brightscript/daily/index.xml
+++ b/brightscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Brightscript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:18Z
+ 2023-10-11T01:25:05Z
Daily Trending of Brightscript in GitHub
\ No newline at end of file
diff --git a/browserslist/daily/index.xml b/browserslist/daily/index.xml
index 899a943c5b1..deb70f97a43 100644
--- a/browserslist/daily/index.xml
+++ b/browserslist/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Browserslist Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:20Z
+ 2023-10-11T01:25:07Z
Daily Trending of Browserslist in GitHub
\ No newline at end of file
diff --git a/c%23/daily/index.xml b/c%23/daily/index.xml
index 265944aaed0..7069f1cafbd 100644
--- a/c%23/daily/index.xml
+++ b/c%23/daily/index.xml
@@ -1,28 +1,7 @@
GitHub C# Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:35Z
+ 2023-10-11T01:25:13Z
Daily Trending of C# in GitHub
-
- XuanchenLin/NanUI
- 2023-10-10T01:25:35Z
- tag:github.com,2023-10-10:/XuanchenLin/NanUI
-
- <p>NanUI is an open source .NET project for .NET developers who want to create desktop applications with HTML, CSS and JavaScript.</p><hr><p align="center"> <img src="https://raw.githubusercontent.com/XuanchenLin/NanUI/master/artworks/WinFormiumLogo.png" width="144"> </p>
<h1 align="center">The WinFormium Project<br>(A.K.A. NanUI)</h1>
<p align="center"><strong>Easily buid powerful WinForm applications with HTML, CSS and JavaScript.</strong></p>
<h1>WinFormium</h1>
<p>点击<a href="https://gitee.com/dotNetChina/NanUI/">[此处]</a>切换到<strong>简体中文</strong>仓库首页。</p>
<p><img src="https://img.shields.io/github/license/XuanchenLin/WinFormium" alt="GitHub"> <img src="https://img.shields.io/nuget/v/NetDimension.NanUI" alt="Nuget"> <img src="https://img.shields.io/nuget/dt/NetDimension.NanUI" alt="Nuget"></p>
<p>NanUI has always been in the testing stage. After 9 years, it is time to release the official v1.0 version of NanUI! When version 1.0 is released, the new name of the project will be officially launched - <strong>WinFormium</strong></p>
<h2>⭐ About</h2>
<p>WinFormium is a open source framework on .NET platform for creating user interface of WinForm Applicaitons using HTML5, CSS3, and JavaScript. It is based on the <a href="https://bitbucket.org/xilium/xilium.cefglue/wiki/Home">Xilium.CefGlue</a> project, which is a .NET wrapper around the <a href="https://bitbucket.org/chromiumembedded/cef">Chromium Embedded Framework</a>.</p>
<p>If you are looking for a framework for creating a WinForm application with a modern user interface, WinFormium is a good choice. you can use HTML, CSS, and JavaScript to create a user interface, and use C# to write the business logic of the application.</p>
<p><strong>Please give WinFormium project a star⭐ if you like it.</strong></p>
<p>If this project helps, please consider funding it.</p>
<p><a href="https://paypal.me/mrjson?country.x=C2&locale.x=zh_XC"><img src="https://img.shields.io/badge/Donate-PayPal-green.svg?sanitize=true" alt="Donate"></a></p>
<h2>🖥️ Requirements</h2>
<p><strong>For Development</strong></p>
<ul>
<li>.NET Framework 4.6.2 or higher / .NET 6.0 or higher</li>
<li>Visual Studio 2019 or higher (VS2022 is recommended)</li>
</ul>
<p><strong>For Deployment</strong></p>
<ul>
<li>Microsoft Windows 7 Service Pack 1 or higher</li>
<li>.Net Framework 4.6.2 or higher</li>
<li>.NET 6.0 for Windows 7 and higher.</li>
<li>.NET 7.0/8.0 for Windows 10 and higher.</li>
</ul>
<p>This is a <strong>Windows Only</strong> framework, it can not run on Linux or Mac OS.</p>
<p>The minimum supported Windows is Windows 7 Service Pack 1, and some features (such as DirectComposition Offscreen Rendering) are not supported on Windows 7.</p>
<h2>🧰 Getting Started</h2>
<p>Create a simple WinFormium Application by following the steps below:</p>
<p><strong>1. Create a WinForm Application by default template.</strong></p>
<p><strong>2. Install WinFormium NuGet Package</strong></p>
<p>Open the NuGet Package Manager to install or use NuGet Package Manager Console, and run the following command to install WinFormium nuget package:</p>
<pre><code class="language-powershell">PM> Install-Package NetDimension.NanUI
</code></pre>
<p>Install the dependencies of Chromium Embedded Framework that WinFormium depends on:</p>
<pre><code class="language-powershell">PM> Install-Package NetDimension.NanUI.Runtime
</code></pre>
<p><strong>3. A basic WinFormium application requires the following code:</strong></p>
<p>Modify the code in the <strong>Program.cs</strong> file as follows:</p>
<pre><code class="language-csharp">using WinFormium;
class Program
{
[STAThread]
static void Main(string[] args)
{
var builder = WinFormiumApp.CreateBuilder();
builder.UseWinFormiumApp<MyApp>();
var app = builder.Build();
app.Run();
}
}
</code></pre>
<p>Create a class implements <strong>WinFormiumStartup</strong> for configuring the application:</p>
<pre><code class="language-csharp">using WinFormium;
class MyAPP : WinFormiumStartup
{
protected override MainWindowCreationAction? UseMainWindow(MainWindowOptions opts)
{
// Configure the main window of this application
return opts.UseMainFormium<MyWindow>();
}
protected override void WinFormiumMain(string[] args)
{
// The codes in Main function should be here, this function only runs in Main process. So it can prevent the codes in Main process running in sub-processes.
ApplicationConfiguration.Initialize();
}
protected override void ConfigurationChromiumEmbedded(ChromiumEnvironmentBuiler cef)
{
// Configure the Chromium Embedded Framework here
}
protected override void ConfigureServices(IServiceCollection services)
{
// Configure the services of this application here
}
}
</code></pre>
<p>Create a class implements <strong>Formium</strong> for configuring the main window of the application:</p>
<pre><code class="language-csharp">using WinFormium;
using WinFormium.Forms;
class MyWindow : Formium
{
public MyWindow()
{
Url = "https://www.google.com";
}
protected override FormStyle ConfigureWindowStyle(WindowStyleBuilder builder)
{
// Configure the style of the window here or leave it blank to use the default style
var style = builder.UseSystemForm();
style.TitleBar = false;
style.DefaultAppTitle = "My first WinFomrim app";
return style;
}
}
</code></pre>
<p><strong>4. Build and run your WinFormium application</strong></p>
<h2>📖 Documentation</h2>
<p>For more info please see - <a href="https://raw.githubusercontent.com/XuanchenLin/NanUI/master/docs/README.md">Documentation</a> or <a href="https://github.com/XuanchenLin/WinFormium/wiki">Wiki</a></p>
<h2>🤖 Demos</h2>
<ul>
<li><a href="https://raw.githubusercontent.com/XuanchenLin/NanUI/master/examples/MinimalWinFormiumApp">Minimal WinFormium App</a> - Introduction to the basic usage of WinFormium.</li>
</ul>
<h2>🔗 Third-Party References & Tools</h2>
<ul>
<li>CEF - <a href="">https://bitbucket.org/chromiumembedded/cef</a></li>
<li>Xilium.CefGlue - <a href="">https://gitlab.com/xiliumhq/chromiumembedded/cefglue/</a></li>
<li>Vanara.Library - <a href="">https://github.com/dahall/Vanara/</a></li>
<li>Vortice.Windows - <a href="">https://github.com/amerkoleci/Vortice.Windows</a></li>
<li>SkiaSharp - <a href="">https://github.com/mono/SkiaSharp</a></li>
<li>React - <a href="">https://github.com/facebook/react</a></li>
<li>React-Router - <a href="">https://github.com/remix-run/react-router</a></li>
<li>Vite - <a href="">https://github.com/vitejs/vite</a></li>
</ul>
<h2>🏆 Inspirations</h2>
<p>I was inspired by the following songs and albums when creating this version of WinFormium.</p>
<ul>
<li><strong>Strandels</strong> - Chance Of Rain</li>
<li><strong>One Direction</strong> - What a Feeling (Made In The A.M.)</li>
<li><strong>Thomas Rhett</strong> - VHS (Center Point Road)</li>
<li><strong>Sammy Kershaw</strong> - She Don't Know She's Beautiful (Haunted Heart)</li>
<li><strong>Chrissy Steele</strong> - Two Bodies (Magnet To Steele)</li>
<li><strong>Halestorm</strong> - I Like It Heavy (Into the Wild Life)</li>
<li><strong>Joan Jett & The Blackhearts</strong> - I Hate Myself for Loving You (Up Your Alley)</li>
</ul>
-
-
- microsoft/typechat.net
- 2023-10-10T01:25:35Z
- tag:github.com,2023-10-10:/microsoft/typechat.net
-
- <p></p><hr><h1>TypeChat.NET</h1>
<p>TypeChat.NET is an <strong>experimental project</strong> from the <a href="https://github.com/microsoft/semantic-kernel">Microsoft Semantic Kernel</a> team. TypeChat.NET brings the ideas of <a href="https://github.com/microsoft/TypeChat">TypeChat</a> to .NET.</p>
<p>TypeChat.NET provides <strong>cross platform</strong> libraries that help you build natural language interfaces with language models using strong types, type validation and simple type safe programs (plans). Strong typing may help make software that uses language models more deterministic and reliable.</p>
<pre><code>// Translates user intent into strongly typed Calendar Actions
var model = new LanguageModel(Config.LoadOpenAI());
var translator = new JsonTranslator<CalendarActions>(model);
// Translate natural language request
CalendarActions actions = await translator.TranslateAsync(requestText);
</code></pre>
<p>TypeChat.NET is in <strong>active development</strong> with frequent updates. The framework will evolve as the team explores the space and incorporates feedback. Supported scenarios are shown in the included <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples">Examples</a>. Documentation will also continue to improve. When in doubt, please look at the code.</p>
<h1>Assemblies</h1>
<p>TypeChat.NET currently consists of the following assemblies:</p>
<ul>
<li> <p><strong>Microsoft.TypeChat</strong>: Classes that translate user intent into strongly typed and validated objects.</p> </li>
<li> <p><strong>Microsoft.TypeChat.Program</strong>: Classes to synthesize, validate and run <em><strong>JSON programs</strong></em>.</p> </li>
<li> <p><strong>Microsoft.TypeChat.SemanticKernel</strong>: Integration with Microsoft Semantic Kernel for language models, plugins and embeddings.</p> </li>
</ul>
<h2>Microsoft.TypeChat</h2>
<p>TypeChat uses language models to translate user intent into JSON that conforms to a schema. This JSON is then validated and deserialized into a typed object. Additional constraint checking is applied as needed. Validation errors are sent back to the language model, which uses them to <strong>repair</strong> the Json it originally returned.</p>
<p>TypeChat provides:</p>
<ul>
<li>Json translation, validation, repair and deserialization.</li>
<li>Extensibility: interfaces for customizing schemas, validators and prompts.</li>
<li>Schema export: classes to generate schema for the .NET Type you want to translate to. Exported schema includes dependencies and base classes. The exported schema is specified using <strong>Typescript</strong>, which can concisely express schema for JSON objects.
<ul>
<li>Support for common scenarios shown in TypeChat examples. When you encounter limitations (such as how generics are currently exported), you can supply schema text, such as Typescript authored by hand.</li>
<li>Helper attributes for Vocabularies and Comments. Vocabularies are string tables that constrain the values that can be assigned to string properties. Dynamic loading of vocabularies enables scenarios where they vary at runtime.</li>
<li><strong>Note</strong>: Like TypeChat, TypeChat.NET has only been tested with schema specified in Typescript.</li>
</ul> </li>
</ul>
<pre><code>[Comment("Milks currently in stock")]
public class Milks
{
[JsonVocab("whole milk | two percent milk | nonfat milk | soy milk | almond milk")]
public string Name { get; set; }
}
</code></pre>
<h2>Microsoft.TypeChat.Program</h2>
<p>TypeChat.Program translates natural language requests into simple programs (<em><strong>Plans</strong></em>), represented as JSON.</p>
<p>JSON programs can be thought of as a <a href="https://en.wikipedia.org/wiki/Domain-specific_language">DSL</a> or <a href="https://learn.microsoft.com/en-us/semantic-kernel/ai-orchestration/planners/?tabs=Csharp">Plan</a>, expressed in JSON, with an associated <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/src/typechat.program/ProgramSchema.ts"><strong>grammar</strong></a> that is enforced. JSON programs can be type checked against the APIs they target. They can be then be run using an interpreter, or compiled into .NET code. Both mechanisms enforce type safety.</p>
<p>TypeChat.Program includes:</p>
<ul>
<li>Program Translator: translates user intent into programs that follow the <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/src/typechat.program/ProgramSchema.ts">Program Grammar</a></li>
<li>Program Interpreter: runs programs generated by ProgramTranslator using an interpreter.</li>
<li>Program Compiler: uses the dynamic language runtime (DLR) to compile programs/plans with type checking. Compilation diagnostics are used to repair programs.</li>
</ul>
<pre><code>// Translates user intent into typed Programs that call methods on a Math API
var model = new LanguageModel(Config.LoadOpenAI());
var api = new MathAPI();
var translator = new ProgramTranslator<IMathAPI>(model, api);
// Translate natural language request
Program program = await translator.TranslateAsync(requestText);
// Run the program
program.Run(api);
</code></pre>
<h2>Microsoft.TypeChat.SemanticKernel</h2>
<p>TypeChat.SemanticKernel provides default bindings for language models, plugins and embeddings to Typechat.NET and TypeChat.NET examples.</p>
<p>TypeChat.SemanticKernel include classes for:</p>
<ul>
<li><strong>Json Programs for Plugins</strong>: turn registered plugins into <strong>APIs</strong> that Json programs can target. See the <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/Plugins/Program.cs">Plugins Example</a>.</li>
<li>Language model and embeddings access: all TypeChat examples use the Semantic Kernel to call models and generate embeddings.</li>
</ul>
<h1>Getting Started</h1>
<h2>Prerequisite: OpenAI</h2>
<ul>
<li><strong>OpenAI Language Models</strong>: TypeChat.NET and its examples currently require familiarity with and access to language models from OpenAI.</li>
<li>TypeChat.NET has been tested with and supports the following models:
<ul>
<li>gpt-35-turbo</li>
<li>gpt-4</li>
<li>ada-002</li>
</ul> </li>
<li>Some examples and scenarios will work best with gpt-4</li>
<li>Since TypeChat.NET uses the Semantic Kernel, models from other providers <em><strong>may</strong></em> be used for experimentation.</li>
</ul>
<h2>Building</h2>
<ul>
<li>Visual Studio 2022.
<ul>
<li>Load <strong>typechat.sln</strong> from the root directory.</li>
<li>Restore packages</li>
<li>Build</li>
</ul> </li>
<li>dotnet build
<ul>
<li>Launch a command prompt / terminal</li>
<li>Go to the root directory of the project</li>
<li>dotnet build Typechat.sln</li>
</ul> </li>
</ul>
<h2>Nuget Packages</h2>
<ul>
<li>Microsoft.Typechat</li>
</ul>
<pre><code>dotnet add package Microsoft.TypeChat
dotnet add package Microsoft.TypeChat.SemanticKernel
</code></pre>
<p>Please ensure that you have installed both packages above.</p>
<ul>
<li>Microsoft.TypeChat.Program</li>
</ul>
<pre><code>dotnet add package Microsoft.TypeChat.Program
</code></pre>
<h2>Examples</h2>
<p>To see TypeChat.NET in action, explore the <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples">Example projects</a> and <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/typechat.examplesLib">TypeChat.Examples Library</a>.</p>
<p>Each example includes an <strong>input.txt</strong> with sample input. Pass the input file as an argument to run the example in <strong>batch mode</strong>.</p>
<p>The sections below describe which examples will best introduce which concept. Some examples or scenarios may work <em><strong>best with gpt-4</strong></em>.</p>
<h3>Hello World</h3>
<p>The <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/Sentiment/Program.cs">Sentiment</a> example is TypeChat's Hello World and a minimal introduction to JsonTranslator.</p>
<h3>JsonTranslator</h3>
<p>The following examples demonstrate how to use JsonTranslator, Schemas and Vocabularies:</p>
<ul>
<li><a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/CoffeeShop">CoffeeShop</a>: Natural language ordering at a coffee shop. Demonstrates a complex schema with polymorphic deserialzation.</li>
<li><a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/Calendar">Calendar</a>: Transform language into calendar actions</li>
<li><a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/Restaurant">Restaurant</a>: Order processing at a pizza restaurant</li>
</ul>
<h3>Hierarchical schemas</h3>
<ul>
<li><a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/MultiSchema">MultiSchema</a>: dynamically route user intent to other 'sub-apps'</li>
<li><a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/SchemaHierarchy">SchemaHierarchy</a>: A Json Translator than uses multiple child JsonTranslators. For each user request, it picks the semantically <em><strong>nearest</strong></em> child translator and routes the input to it.</li>
<li><a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/typechat.examplesLib/Classification">TextClassification</a> and <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/typechat.examplesLib/VectorTextIndex.cs">VectorTextIndex</a> show how to build a simple classifiers to route input.</li>
</ul>
<h3>Json Programs</h3>
<ul>
<li><a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/Math">Math</a>: How to turn user requests into simple calculator programs</li>
<li><a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/Plugins">Plugins</a>: How to translate user intent into programs programs that call Semantic Kernel Plugins</li>
</ul>
<h3>Interactive agents</h3>
<ul>
<li><a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/HealthData">HealthData</a>: how to use an interactive bot to collect a user's health information.</li>
<li><a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/typechat.examplesLib/Dialog">Agent Classes</a> for working with interactive agents that have history. These classes emonstrate how TypeChat.NET may be used for strongly typed interactions with message passing agents or bots. These agents can include features such as built in interaction history.</li>
</ul>
<h2>Api Key and Configuration</h2>
<p>To use TypeChat.net or run the examples, you need an <strong>API key</strong> for an OpenAI service. Azure OpenAI and the OpenAI service are both supported.</p>
<h3>Configure Api Key for examples</h3>
<ul>
<li>Go to the <strong><a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples">examples</a></strong> folder in the solution</li>
<li>Make a copy of the <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/examples/appSettings.json">appSettings.json</a> file and name it <strong>appSettings.Development.json</strong>. Ensure it is in the same folder as appSettings.json</li>
<li>appSettings.Development.json is a local development only override of the settings in appSettings.json and is <strong>never</strong> checked in.</li>
<li>Add your Api Key to <strong>appSettings.Development.json</strong>.</li>
</ul>
<p>A typical appSettings.Development.json will look like this:</p>
<pre><code>// For Azure OpenAI service
{
"OpenAI": {
"Azure": true,
"ApiKey": "YOUR API KEY",
"Endpoint": "https://YOUR_RESOURCE_NAME.openai.azure.com",
"Model": "gpt-35-turbo" // Name of Azure deployment
}
}
// For OpenAI Service:
{
"OpenAI": {
"Azure": false,
"ApiKey": "YOUR API KEY",
"Endpoint": "https://api.openai.com/v1/chat/completions",
"Model": "gpt-3.5-turbo" // Name of OpenAI model
}
}
</code></pre>
<h3>OpenAIConfig</h3>
<p>TypeChat examples accesses language models using the <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/src/typechat.sk/LanguageModel.cs">LanguageModel</a> class. The OpenAIConfig class supplies configuration for LanguageModel. You initialize OpenAIConfig from your application's configuration, from a Json file or from environment variables.</p>
<p>See <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/src/typechat.sk/OpenAIConfig.cs">OpenAIConfig.cs</a> for a list of :</p>
<ul>
<li>Configurable properties</li>
<li>Supported environment variables.</li>
</ul>
<pre><code>// Your configuration
OpenAIConfig config = Config.LoadOpenAI();
// Or Json file
OpenAIConfig config = OpenAIConfig.LoadFromJsonFile(...);
// Or from config
config = OpenAIConfig.FromEnvironment();
var model = new LanguageModel(config);
</code></pre>
<h2>Using Semantic Kernel directly</h2>
<p>You can also initialize LanguageModel using an IKernel object you created using a KernelBuilder.</p>
<pre><code>const string modelName = "gpt-35-turbo";
new LanguageModel(_kernel.GetService<IChatCompletion>(modelName), modelName);
</code></pre>
<h2>Using your own client</h2>
<p>TypeChat accesses language models using the <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/src/typechat/ILanguageModel.cs">ILanguageModel</a> interface. <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/src/typechat.sk/LanguageModel.cs">LanguageModel</a> implements ILanguageModel.</p>
<p>You can use your own model client by implementing ILanguageModel.</p>
<h1>Code of Conduct</h1>
<p>This project has adopted the <a href="https://opensource.microsoft.com/codeofconduct/">Microsoft Open Source Code of Conduct</a>. For more information see the <a href="https://opensource.microsoft.com/codeofconduct/faq/">Code of Conduct FAQ</a> or contact <a href="mailto:opencode@microsoft.com">opencode@microsoft.com</a> with any additional questions or comments.</p>
<h1>License</h1>
<p>Copyright (c) Microsoft Corporation. All rights reserved.</p>
<p>Licensed under the <a href="https://raw.githubusercontent.com/microsoft/typechat.net/main/LICENSE">MIT</a> license.</p>
<h1>Trademarks</h1>
<p>This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow <a href="https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general">Microsoft's Trademark & Brand Guidelines</a>. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.</p>
-
-
- bepu/bepuphysics2
- 2023-10-10T01:25:35Z
- tag:github.com,2023-10-10:/bepu/bepuphysics2
-
- <p>Pure C# 3D real time physics simulation library, now with a higher version number.</p><hr><h1>bepuphysics v2</h1>
<p align="center"> <a href="https://www.youtube.com/watch?v=sfgC_eNx9M8" target="_blank"><img src="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/images/youtubeLink.png" width="375" height="211" border="0"></a> <a href="https://www.youtube.com/watch?v=tjtwSq3u6Dg" target="_blank"><img src="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/images/youtubeLink24.png" width="375" height="211" border="0"></a></p>
<p>This is the repo for the bepuphysics v2 library, a complete rewrite of the C# 3d rigid body physics engine <a href="https://github.com/bepu/bepuphysics1">BEPUphysics v1</a>.</p>
<p>The BepuPhysics and BepuUtilities libraries target .NET 6 and should work on any supported platform. The demos application, Demos.sln, uses DX11 by default. There is also a Demos.GL.sln that uses OpenGL and should run on other platforms. The demos can be run from the command line (in the repo root directory) with <code>dotnet run --project Demos/Demos.csproj -c Release</code> or <code>dotnet run --project Demos.GL/Demos.csproj -c Release</code>.</p>
<p>The physics engine heavily uses <code>System.Numerics.Vectors</code> types, so to get good performance, you'll need a compiler which can consume those types (like RyuJIT).</p>
<p>To build the source, you'll need a recent version of Visual Studio with the .NET desktop development workload installed. Demos.sln references all relevant projects. For more information, see <a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/Building.md">Building</a>.</p>
<h2>Features</h2>
<ul>
<li>Spheres, capsules, boxes, triangles, cylinders, and convex hulls</li>
<li>Compounds of the above</li>
<li>Meshes</li>
<li>A <a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/BepuPhysics/Constraints/">whole bunch of constraint types</a></li>
<li><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Demos/Demos/NewtDemo.cs">Newts</a></li>
<li>Linear and angular continuous collision detection</li>
<li>Extremely low cost sleep states for resting bodies</li>
<li>Efficient scene-wide ray and sweep queries</li>
<li><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Demos/Demos/Characters/CharacterDemo.cs">Character controller example</a></li>
<li>At least somewhat extensible collision pipeline, with <a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Demos/Demos/CustomVoxelCollidableDemo.cs">example custom voxel collidable</a></li>
<li>Highly nonidiomatic APIs</li>
<li>Super speediness</li>
<li>And a bunch of other miscellaneous stuff!</li>
</ul>
<h2>Links</h2>
<p>Report bugs <a href="https://raw.githubusercontent.com/bepu/issues">on the issues tab</a>.</p>
<p>Use the <a href="https://raw.githubusercontent.com/bepu/discussions">discussions tab</a> for... discussions. And questions.</p>
<p>By user request, there's a <a href="https://discord.gg/ssa2XpY">discord server</a>. I'll be focusing on github for long-form content, but if you like discord, now you can discord.</p>
<p><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/GettingStarted.md">Getting Started</a></p>
<p><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/Building.md">Building</a></p>
<p><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/QuestionsAndAnswers.md">Q&A</a></p>
<p><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/StabilityTips.md">Stability Tips</a></p>
<p><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/PerformanceTips.md">Performance Tips</a></p>
<p><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/Substepping.md">Substepping</a></p>
<p><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/ContinuousCollisionDetection.md">Continuous Collision Detection</a></p>
<p><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/CONTRIBUTING.md">Contributing</a></p>
<p><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/changelog.md">Change log</a></p>
<p><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/UpgradingFromV1.md">Upgrading from v1, concept mapping</a></p>
<p><a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/PackagingAndVersioning.md">Packaging and Versioning</a></p>
<p>Check the <a href="https://raw.githubusercontent.com/bepu/bepuphysics2/master/Documentation/roadmap.md">roadmap</a> for a high level look at where things are going.</p>
<p>If you have too many dollars, we are willing to consume them through <a href="https://www.github.com/sponsors/RossNordby">github sponsors</a>.</p>
<p><img src="https://raw.githubusercontent.com/bepu/bepuphysics1/master/Documentation/images/readme/angelduck.png" alt=""></p>
-
\ No newline at end of file
diff --git a/c++/daily/index.xml b/c++/daily/index.xml
index ad3fa3f9a44..c3a90840f49 100644
--- a/c++/daily/index.xml
+++ b/c++/daily/index.xml
@@ -1,14 +1,7 @@
GitHub C++ Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:50Z
+ 2023-10-11T01:25:36Z
Daily Trending of C++ in GitHub
-
- defold/defold
- 2023-10-10T01:25:50Z
- tag:github.com,2023-10-10:/defold/defold
-
- <p>Defold is a completely free to use game engine for development of desktop, mobile and web games.</p><hr><p><img src="https://github.com/defold/defold/workflows/CI%20-%20Main/badge.svg?sanitize=true" alt="CI - Main"> <img src="https://github.com/defold/defold/workflows/CI%20-%20Editor%20Only/badge.svg?sanitize=true" alt="CI - Editor Only"> <img src="https://github.com/defold/defold/workflows/CI%20-%20Engine%20nightly/badge.svg?sanitize=true" alt="CI - Engine nightly"></p>
<p><a href="https://discord.gg/cHBde7J"><img src="https://img.shields.io/discord/250018174974689280?color=%237289DA&label=defold&logo=discord&logoColor=white" alt="Join the chat at https://discord.gg/cHBde7J"></a></p>
<h1>Defold</h1>
<p>Repository for the Defold engine, editor and command line tools.</p>
<h2>Supported by</h2>
<p><a href="https://melsoft-games.com/"><img src="https://defold.com/images/logo/others/melsoft-black.png" alt=""></a> <img src="https://defold.com/images/spacer32.png" alt=""> <a href="https://www.rive.app"><img src="https://defold.com/images/logo/others/rive-black.png" alt=""></a> <img src="https://defold.com/images/spacer32.png" alt=""> <a href="https://www.opgames.org"><img src="https://defold.com/images/logo/others/op-games-color.png" alt=""></a> <img src="https://defold.com/images/spacer32.png" alt=""> <a href="https://www.heroiclabs.com"><img src="https://defold.com/images/logo/others/heroiclabs-blue.png" alt=""></a> <img src="https://defold.com/images/spacer32.png" alt=""> <a href="https://king.com/"><img src="https://defold.com/images/logo/others/king-color.png" alt=""></a></p>
<h2>Folder Structure</h2>
<ul>
<li><strong>build_tools</strong> - Build configuration and build tools used by build scripts</li>
<li><strong>ci</strong> - Continuous integration files for GitHub CI (<a href="https://raw.githubusercontent.com/defold/defold/dev/README_CI.md">more info</a>)</li>
<li><strong>com.dynamo.cr</strong> - Bob</li>
<li><strong>engine</strong> - Engine</li>
<li><strong>editor</strong> - Editor</li>
<li><strong>packages</strong> - External packages</li>
<li><strong>scripts</strong> - Build and utility scripts</li>
<li><strong>share</strong> - Misc shared stuff used by other tools. Waf build-scripts, valgrind suppression files, etc.</li>
</ul>
<h2>Setup and Build</h2>
<h3>Setup Engine</h3>
<p>Follow the <a href="https://raw.githubusercontent.com/defold/defold/dev/README_SETUP.md">setup guide</a> to install all of the tools needed to build the Defold engine.</p>
<h3>Build Engine</h3>
<p>Follow the <a href="https://raw.githubusercontent.com/defold/defold/dev/README_BUILD.md">build instructions</a> to build the engine and command line tools.</p>
<h3>Setup, Build and Run Editor</h3>
<p>Follow the <a href="https://raw.githubusercontent.com/defold/defold/dev/editor/README.md">instructions</a> in the editor folder.</p>
<h2>Engine Overview</h2>
<p>An overview of the engine architecture and additional engine information can be <a href="https://raw.githubusercontent.com/defold/defold/dev/README_ENGINE.md">viewed here</a>.</p>
<h3>Platform Specifics</h3>
<ul>
<li><a href="https://raw.githubusercontent.com/defold/defold/dev/README_IOS.md">iOS</a></li>
<li><a href="https://raw.githubusercontent.com/defold/defold/dev/README_ANDROID.md">Android</a></li>
<li><a href="https://raw.githubusercontent.com/defold/defold/dev/README_EMSCRIPTEN.md">HTML5/Emscripten</a></li>
</ul>
<h2>Releasing a new version</h2>
<p>The release process is documented <a href="https://raw.githubusercontent.com/defold/defold/dev/RELEASE.md">here</a>.</p>
<h2>Complying with licenses</h2>
<p>A full list of third party software licenses along with information on how to give attribution and include the licenses in your game can be found in the <a href="https://raw.githubusercontent.com/defold/defold/dev/COMPLYING_WITH_LICENSES.md">COMPLYING WITH LICENSES</a> document in the Defold repository on GitHub.</p>
-
\ No newline at end of file
diff --git a/c-objdump/daily/index.xml b/c-objdump/daily/index.xml
index ef0c11d58c2..8fd105c841a 100644
--- a/c-objdump/daily/index.xml
+++ b/c-objdump/daily/index.xml
@@ -1,7 +1,7 @@
GitHub C-ObjDump Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:46Z
+ 2023-10-11T01:25:31Z
Daily Trending of C-ObjDump in GitHub
\ No newline at end of file
diff --git a/c/daily/index.xml b/c/daily/index.xml
index 50fae798de4..c0cb254833a 100644
--- a/c/daily/index.xml
+++ b/c/daily/index.xml
@@ -1,7 +1,28 @@
GitHub C Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:27Z
+ 2023-10-11T01:25:21Z
Daily Trending of C in GitHub
+
+ reduz/larvita3
+ 2023-10-11T01:25:21Z
+ tag:github.com,2023-10-11:/reduz/larvita3
+
+ <p>Larvita 3 Game Engine</p><hr><h1>Larvita3</h1>
<p>Larvita 3 Game Engine</p>
<p>This game engine is the precursor of <a href="http://www.godotengine.org">Godot Engine</a> developed by Ariel Manzur and Juan Linietsky. It was used for a couple of games and prototypes, most notably (Atmosphir)[https://www.youtube.com/watch?v=DvQsmPC27VU].</p>
<p><img src="https://github.com/reduz/larvita3/assets/6265307/6687cd24-0751-4e11-b779-8acfd3db93e9" alt="larvita2"> <img src="https://github.com/reduz/larvita3/assets/6265307/2ffce16d-e9e6-4ba7-bed4-ee00cacd8bf0" alt="image"></p>
<h4>Compilation</h4>
<p>I have no idea, please update instructions. I think it went something like:</p>
<pre><code>scons bin/script_exec
</code></pre>
<h4>Usage</h4>
<p>The editor is written in Lua (this is a Lua game engine). You open the editor like this:</p>
<pre><code>cd bin
script_exec editor
</code></pre>
<p>To execute games:</p>
<pre><code>script_exec game_folder
</code></pre>
<p>Games are implemented by inheriting SceneMainLoop from Lua, then doing whathever you want.</p>
<h4>Documentation</h4>
<p>There is none.</p>
<h4>Origins</h4>
<p>Our previous engine was called "Larvotor" (used for Regnum Online). This was originally a 3D engine aimed to run on the Nintendo 3DS, hence the name "Larvita" (Larvita 1 was a prototype engine for that platform). Life happened and we ended up getting to work for clients wanting to make PC games.</p>
<p>An explanation of Larvita 3 design and how we moved from it to Godot can be <a href="https://gist.github.com/reduz/9b9d1278848237fd9a9a8b6cc77c8270">read here</a>.</p>
+
+
+ OpenIPC/firmware
+ 2023-10-11T01:25:21Z
+ tag:github.com,2023-10-11:/OpenIPC/firmware
+
+ <p>Alternative IP Camera firmware from an open community</p><hr><p><img src="https://cdn.themactep.com/images/logo_openipc.png" alt="OpenIPC Logo"></p>
<h2>OpenIPC firmware</h2>
<p><a href="https://t.me/OpenIPC"><img src="https://openipc.org/images/telegram_button.svg?sanitize=true" alt="Telegram"></a> <em>(based on Buildroot)</em></p>
<p>OpenIPC is a rapidly developing open source alternative <a href="https://github.com/openipc/firmware/">firmware</a> for popular IP cameras from an <a href="https://opencollective.com/openipc">open community</a>.</p>
<p>Historically, OpenIPC <a href="https://github.com/openipc/firmware/">firmware</a> only supported SoC manufactured by HiSilicon, but as the development continues, the list of supported processors expands. Today, it also includes chips from <em>Ambarella</em>, <em>Anyka</em>, <em>Fullhan</em>, <em>Goke</em>, <em>GrainMedia</em>, <em>Ingenic</em>, <em>MStar</em>, <em>Novatek</em>, <em>SigmaStar</em>, <em>XiongMai</em>, and is expected to grow further.</p>
<p>More information about the <a href="https://github.com/openipc/">project</a> is available in our <a href="https://openipc.org/">website</a> and on the <a href="https://openipc.github.io/wiki/">wiki</a>.</p>
<h2>Support</h2>
<p>OpenIPC offers two levels of support.</p>
<ul>
<li>Free support through the community (via <a href="https://openipc.org/our-channels">chat</a>).</li>
<li>Paid commercial support (from the team of developers).</li>
</ul>
<p>Please consider subscribing for paid commercial support if you intend to use our product for business. As a paid customer, you will get technical support and maintenance services directly from our skilled team. Your bug reports and feature requests will get prioritized attention and expedited solutions. It's a win-win strategy for both parties, that would contribute to the stability your business, and help core developers to work on the project full-time.</p>
<p>If you have any specific questions concerning our project, feel free to <a href="mailto:dev@openipc.org">contact us</a>.</p>
<h2>Participating and Contribution</h2>
<p>If you like what we do, and willing to intensify the development, please consider participating.</p>
<p>You can improve existing code and send us patches. You can add new features missing from our code.</p>
<p>You can help us to write a better documentation, proofread and correct our websites.</p>
<p>You can just donate some money to cover the cost of development and long-term maintaining of what we believe is going to be the most stable, flexible, and open IP Network Camera Framework for users like yourself.</p>
<p>You can make a financial contribution to the project at <a href="https://opencollective.com/openipc/contribute/backer-14335/checkout">Open Collective</a>.</p>
<p>Thank you.</p>
<p align="center"> <a href="https://opencollective.com/openipc/contribute/backer-14335/checkout" target="_blank"><img src="https://opencollective.com/webpack/donate/button@2x.png?color=blue" width="375" alt="Open Collective donate button"></a> </p>
+
+
+ linxinrao/Shamrock
+ 2023-10-11T01:25:21Z
+ tag:github.com,2023-10-11:/linxinrao/Shamrock
+
+ <p>☘ 基于Xposed实现的Onebot11/12标准QQBot框架</p><hr><div align="center">
<p><img src="https://socialify.git.ci/linxinrao/Shamrock/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Flinxinrao.github.io%2FShamrock%2Fshamrock.png&pattern=Plus&pulls=1&stargazers=1&theme=Auto" alt=""></p>
<p><a href="https://github.com/linxinrao/Shamrock/actions/workflows/build-apk.yml"><img src="https://img.shields.io/github/actions/workflow/status/linxinrao/Shamrock/build-apk.yml?style=for-the-badge" alt=""></a> <a href="https://github.com/linxinrao/Shamrock/releases"><img src="https://img.shields.io/github/v/release/linxinrao/Shamrock?style=for-the-badge" alt=""></a> <a href="https://github.com/linxinrao/Shamrock/releases"><img src="https://img.shields.io/github/downloads/linxinrao/Shamrock/total?style=for-the-badge" alt=""></a></p>
<p><img src="https://img.shields.io/badge/OneBot-11-black?style=for-the-badge" alt=""> <img src="https://img.shields.io/badge/OneBot-12-black?style=for-the-badge" alt=""> <a href="https://raw.githubusercontent.com/linxinrao/Shamrock/master/LICENSE"><img src="https://img.shields.io/github/license/linxinrao/Shamrock?style=for-the-badge" alt=""></a></p>
<p><a href="https://linxinrao.github.io/Shamrock/guide/getting-started.html#%E4%B8%8B%E8%BD%BD">下载</a> | <a href="https://linxinrao.github.io/Shamrock/guide/getting-started.html#%E9%83%A8%E7%BD%B2">部署</a> | <a href="https://linxinrao.github.io/Shamrock/api">接口</a> | <a href="https://linxinrao.github.io/Shamrock/">文档</a> | <a href="https://linxinrao.github.io/Shamrock/group.html">加群</a></p>
</div>
<h2>简介</h2>
<p>☘ 基于 Xposed 实现 OneBot 标准的 QQ 机器人框架</p>
<blockquote>
<p>本项目仅提供学习与交流用途,请在24小时内删除。<br> 本项目目的是研究 Xposed 和 LSPosed 框架的使用。 Epic 框架开发相关知识。<br> 如有违反法律,请联系删除。</p>
</blockquote>
<h2>兼容说明</h2>
<p>本项目基于 go-cqhttp 的文档进行开发实现,未来将会支持 Docker 部署(现在也可以)。<br> 在 qsign 死亡(报废)的情况下,Shamrock 支持作为 NTR 提供 sign API 服务。</p>
<h2>权限声明</h2>
<p>如出现未在此处声明的权限,请警惕 Shamrock 是否被修改/植入恶意代码</p>
<ul>
<li>网络访问权限: Shamrock 进程需要使用 HTTP API 来进行一些操作</li>
<li><a href="https://github.com/linxinrao/Shamrock/wiki/perm_hook_android">Hook 系统框架</a>: 为了保证息屏状态下服务不被杀死,Shamrock 需要 Hook 系统框架</li>
<li>后台启动 Activity: 自动唤醒 QQ 时需要使用</li>
</ul>
<h2>语音解码</h2>
<p>请参考文档中 <a href="https://linxinrao.github.io/Shamrock/advanced/voice.html">语音支持</a> 部分</p>
<h2>开源协议</h2>
<p>本项目使用 <a href="https://raw.githubusercontent.com/linxinrao/Shamrock/master/LICENSE">GPL-3.0</a> 协议开放源代码</p>
<pre><code class="language-text">Shamrock - OneBot standard QQ robot framework based on Xposed implementation
Copyright (C) 2023 Shamrock Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
</code></pre>
<h2>贡献者</h2>
<p><a href="https://github.com/linxinrao/Shamrock/graphs/contributors"><img src="https://contrib.rocks/image?repo=linxinrao/Shamrock" alt=""></a></p>
+
\ No newline at end of file
diff --git a/c2hs-haskell/daily/index.xml b/c2hs-haskell/daily/index.xml
index 166841128b8..0e58c99c9c8 100644
--- a/c2hs-haskell/daily/index.xml
+++ b/c2hs-haskell/daily/index.xml
@@ -1,7 +1,7 @@
GitHub C2hs Haskell Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:45Z
+ 2023-10-11T01:25:32Z
Daily Trending of C2hs Haskell in GitHub
\ No newline at end of file
diff --git a/cabal-config/daily/index.xml b/cabal-config/daily/index.xml
index 5a9ae4feffe..df590f179e5 100644
--- a/cabal-config/daily/index.xml
+++ b/cabal-config/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Cabal Config Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:25:47Z
+ 2023-10-11T01:25:32Z
Daily Trending of Cabal Config in GitHub
\ No newline at end of file
diff --git a/cadence/daily/index.xml b/cadence/daily/index.xml
index 479aca0af00..7b9f55eb745 100644
--- a/cadence/daily/index.xml
+++ b/cadence/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Cadence Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:13Z
+ 2023-10-11T01:25:48Z
Daily Trending of Cadence in GitHub
\ No newline at end of file
diff --git a/cairo/daily/index.xml b/cairo/daily/index.xml
index ef5945a72df..0d71cdf2fce 100644
--- a/cairo/daily/index.xml
+++ b/cairo/daily/index.xml
@@ -1,14 +1,7 @@
GitHub Cairo Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:14Z
+ 2023-10-11T01:25:49Z
Daily Trending of Cairo in GitHub
-
- Starklandxyz/contract
- 2023-10-10T01:26:14Z
- tag:github.com,2023-10-10:/Starklandxyz/contract
-
- <p></p><hr>
-
\ No newline at end of file
diff --git a/cap'n-proto/daily/index.xml b/cap'n-proto/daily/index.xml
index 8dd6c336248..544a8310f7f 100644
--- a/cap'n-proto/daily/index.xml
+++ b/cap'n-proto/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Cap'n Proto Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:18Z
+ 2023-10-11T01:25:54Z
Daily Trending of Cap'n Proto in GitHub
\ No newline at end of file
diff --git a/cartocss/daily/index.xml b/cartocss/daily/index.xml
index d29ddd7b149..10a3070e605 100644
--- a/cartocss/daily/index.xml
+++ b/cartocss/daily/index.xml
@@ -1,7 +1,7 @@
GitHub CartoCSS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:15Z
+ 2023-10-11T01:25:52Z
Daily Trending of CartoCSS in GitHub
\ No newline at end of file
diff --git a/ceylon/daily/index.xml b/ceylon/daily/index.xml
index e41a78d96e9..295b7e5197f 100644
--- a/ceylon/daily/index.xml
+++ b/ceylon/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Ceylon Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:17Z
+ 2023-10-11T01:25:55Z
Daily Trending of Ceylon in GitHub
\ No newline at end of file
diff --git a/chapel/daily/index.xml b/chapel/daily/index.xml
index b599d31825d..993f9c7750d 100644
--- a/chapel/daily/index.xml
+++ b/chapel/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Chapel Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:16Z
+ 2023-10-11T01:25:53Z
Daily Trending of Chapel in GitHub
\ No newline at end of file
diff --git a/charity/daily/index.xml b/charity/daily/index.xml
index 13690be4eee..f179e17201e 100644
--- a/charity/daily/index.xml
+++ b/charity/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Charity Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:22Z
+ 2023-10-11T01:25:57Z
Daily Trending of Charity in GitHub
\ No newline at end of file
diff --git a/chuck/daily/index.xml b/chuck/daily/index.xml
index f014638ccf9..91ef0ecde58 100644
--- a/chuck/daily/index.xml
+++ b/chuck/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ChucK Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:21Z
+ 2023-10-11T01:25:56Z
Daily Trending of ChucK in GitHub
\ No newline at end of file
diff --git a/cil/daily/index.xml b/cil/daily/index.xml
index 76ab1da5c6c..905f4bd08af 100644
--- a/cil/daily/index.xml
+++ b/cil/daily/index.xml
@@ -1,7 +1,7 @@
GitHub CIL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:19Z
+ 2023-10-11T01:25:57Z
Daily Trending of CIL in GitHub
\ No newline at end of file
diff --git a/cirru/daily/index.xml b/cirru/daily/index.xml
index 6de94749d00..42f1c89be70 100644
--- a/cirru/daily/index.xml
+++ b/cirru/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Cirru Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:25Z
+ 2023-10-11T01:26:02Z
Daily Trending of Cirru in GitHub
\ No newline at end of file
diff --git a/clarion/daily/index.xml b/clarion/daily/index.xml
index d59373ca16c..f460369898c 100644
--- a/clarion/daily/index.xml
+++ b/clarion/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Clarion Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:23Z
+ 2023-10-11T01:26:01Z
Daily Trending of Clarion in GitHub
\ No newline at end of file
diff --git a/clarity/daily/index.xml b/clarity/daily/index.xml
index 4cbe3b8fdb2..ebc4b36ab89 100644
--- a/clarity/daily/index.xml
+++ b/clarity/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Clarity Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:25Z
+ 2023-10-11T01:25:59Z
Daily Trending of Clarity in GitHub
\ No newline at end of file
diff --git a/classic-asp/daily/index.xml b/classic-asp/daily/index.xml
index ab6f222a514..d4925a3322d 100644
--- a/classic-asp/daily/index.xml
+++ b/classic-asp/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Classic ASP Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:27Z
+ 2023-10-11T01:26:06Z
Daily Trending of Classic ASP in GitHub
+
+ vnovikov746/ShifterMan
+ 2023-10-11T01:26:06Z
+ tag:github.com,2023-10-11:/vnovikov746/ShifterMan
+
+ <p>ShifterMan Project -The ultimate tool to organize shift schedule</p><hr>
+
\ No newline at end of file
diff --git a/clean/daily/index.xml b/clean/daily/index.xml
index 24349282194..9561f094bff 100644
--- a/clean/daily/index.xml
+++ b/clean/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Clean Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:28Z
+ 2023-10-11T01:26:04Z
Daily Trending of Clean in GitHub
\ No newline at end of file
diff --git a/click/daily/index.xml b/click/daily/index.xml
index 2df46db4de8..b385c8bead9 100644
--- a/click/daily/index.xml
+++ b/click/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Click Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:27Z
+ 2023-10-11T01:26:05Z
Daily Trending of Click in GitHub
\ No newline at end of file
diff --git a/clips/daily/index.xml b/clips/daily/index.xml
index 417cbd0a72f..f55fb04f182 100644
--- a/clips/daily/index.xml
+++ b/clips/daily/index.xml
@@ -1,7 +1,7 @@
GitHub CLIPS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:29Z
+ 2023-10-11T01:26:03Z
Daily Trending of CLIPS in GitHub
\ No newline at end of file
diff --git a/clojure/daily/index.xml b/clojure/daily/index.xml
index 5bba03a1d45..40a767fdf95 100644
--- a/clojure/daily/index.xml
+++ b/clojure/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Clojure Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:33Z
+ 2023-10-11T01:26:13Z
Daily Trending of Clojure in GitHub
+
+ ftravers/soap-helper
+ 2023-10-11T01:26:13Z
+ tag:github.com,2023-10-11:/ftravers/soap-helper
+
+ <p></p><hr>
+
\ No newline at end of file
diff --git a/closure-templates/daily/index.xml b/closure-templates/daily/index.xml
index 5e4b48ae168..f9a50e8a5e5 100644
--- a/closure-templates/daily/index.xml
+++ b/closure-templates/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Closure Templates Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:30Z
+ 2023-10-11T01:26:08Z
Daily Trending of Closure Templates in GitHub
\ No newline at end of file
diff --git a/cloud-firestore-security-rules/daily/index.xml b/cloud-firestore-security-rules/daily/index.xml
index 6f6566f0970..37e940ced43 100644
--- a/cloud-firestore-security-rules/daily/index.xml
+++ b/cloud-firestore-security-rules/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Cloud Firestore Security Rules Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:31Z
+ 2023-10-11T01:26:07Z
Daily Trending of Cloud Firestore Security Rules in GitHub
\ No newline at end of file
diff --git a/cmake/daily/index.xml b/cmake/daily/index.xml
index 6e002553ee7..ff79db0ad70 100644
--- a/cmake/daily/index.xml
+++ b/cmake/daily/index.xml
@@ -1,14 +1,21 @@
GitHub CMake Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:36Z
+ 2023-10-11T01:26:11Z
Daily Trending of CMake in GitHub
- sush2023/URC
- 2023-10-10T01:26:36Z
- tag:github.com,2023-10-10:/sush2023/URC
-
- <p>Software for URC Rover</p><hr>
+ ISC-Project-Phoenix/obj_detector
+ 2023-10-11T01:26:11Z
+ tag:github.com,2023-10-11:/ISC-Project-Phoenix/obj_detector
+
+ <p>Project Pheonix Object detector node</p><hr>
+
+
+ ISC-Project-Phoenix/obj_tracker
+ 2023-10-11T01:26:11Z
+ tag:github.com,2023-10-11:/ISC-Project-Phoenix/obj_tracker
+
+ <p>Project Phoenix Object Tracking Node</p><hr>
\ No newline at end of file
diff --git a/cobol/daily/index.xml b/cobol/daily/index.xml
index 228e7d788f3..6b44359633b 100644
--- a/cobol/daily/index.xml
+++ b/cobol/daily/index.xml
@@ -1,7 +1,7 @@
GitHub COBOL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:38Z
+ 2023-10-11T01:26:16Z
Daily Trending of COBOL in GitHub
\ No newline at end of file
diff --git a/codeowners/daily/index.xml b/codeowners/daily/index.xml
index 7007d5212de..1847f85b6c5 100644
--- a/codeowners/daily/index.xml
+++ b/codeowners/daily/index.xml
@@ -1,7 +1,7 @@
GitHub CODEOWNERS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:39Z
+ 2023-10-11T01:26:15Z
Daily Trending of CODEOWNERS in GitHub
\ No newline at end of file
diff --git a/codeql/daily/index.xml b/codeql/daily/index.xml
index 29a248a1805..9cac1f527e8 100644
--- a/codeql/daily/index.xml
+++ b/codeql/daily/index.xml
@@ -1,7 +1,7 @@
GitHub CodeQL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:38Z
+ 2023-10-11T01:26:19Z
Daily Trending of CodeQL in GitHub
\ No newline at end of file
diff --git a/coffeescript/daily/index.xml b/coffeescript/daily/index.xml
index 0ac58326743..690c8501fe6 100644
--- a/coffeescript/daily/index.xml
+++ b/coffeescript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub CoffeeScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:41Z
+ 2023-10-11T01:26:18Z
Daily Trending of CoffeeScript in GitHub
\ No newline at end of file
diff --git a/coldfusion-cfc/daily/index.xml b/coldfusion-cfc/daily/index.xml
index 23966937d64..0ccf1be86d4 100644
--- a/coldfusion-cfc/daily/index.xml
+++ b/coldfusion-cfc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ColdFusion CFC Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:43Z
+ 2023-10-11T01:26:21Z
Daily Trending of ColdFusion CFC in GitHub
\ No newline at end of file
diff --git a/coldfusion/daily/index.xml b/coldfusion/daily/index.xml
index c672056a71f..5ec4cec2826 100644
--- a/coldfusion/daily/index.xml
+++ b/coldfusion/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ColdFusion Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:42Z
+ 2023-10-11T01:26:23Z
Daily Trending of ColdFusion in GitHub
\ No newline at end of file
diff --git a/collada/daily/index.xml b/collada/daily/index.xml
index 36f9eaac6a4..da3932913f1 100644
--- a/collada/daily/index.xml
+++ b/collada/daily/index.xml
@@ -1,7 +1,7 @@
GitHub COLLADA Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:44Z
+ 2023-10-11T01:26:20Z
Daily Trending of COLLADA in GitHub
\ No newline at end of file
diff --git a/common-lisp/daily/index.xml b/common-lisp/daily/index.xml
index 4e55014e4d9..34bfe250b35 100644
--- a/common-lisp/daily/index.xml
+++ b/common-lisp/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Common Lisp Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:46Z
+ 2023-10-11T01:26:23Z
Daily Trending of Common Lisp in GitHub
\ No newline at end of file
diff --git a/common-workflow-language/daily/index.xml b/common-workflow-language/daily/index.xml
index 682f15a6ade..5a0b114bbed 100644
--- a/common-workflow-language/daily/index.xml
+++ b/common-workflow-language/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Common Workflow Language Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:50Z
+ 2023-10-11T01:26:25Z
Daily Trending of Common Workflow Language in GitHub
\ No newline at end of file
diff --git a/component-pascal/daily/index.xml b/component-pascal/daily/index.xml
index dca93747115..9b6cef75324 100644
--- a/component-pascal/daily/index.xml
+++ b/component-pascal/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Component Pascal Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:51Z
+ 2023-10-11T01:26:26Z
Daily Trending of Component Pascal in GitHub
\ No newline at end of file
diff --git a/conll-u/daily/index.xml b/conll-u/daily/index.xml
index 65d53db7830..db5015e97d0 100644
--- a/conll-u/daily/index.xml
+++ b/conll-u/daily/index.xml
@@ -1,7 +1,7 @@
GitHub CoNLL-U Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:49Z
+ 2023-10-11T01:26:27Z
Daily Trending of CoNLL-U in GitHub
\ No newline at end of file
diff --git a/cool/daily/index.xml b/cool/daily/index.xml
index 37278ddd307..5cecd0401cb 100644
--- a/cool/daily/index.xml
+++ b/cool/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Cool Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:48Z
+ 2023-10-11T01:26:26Z
Daily Trending of Cool in GitHub
\ No newline at end of file
diff --git a/coq/daily/index.xml b/coq/daily/index.xml
index f9359edc295..122e526b8d5 100644
--- a/coq/daily/index.xml
+++ b/coq/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Coq Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:56Z
+ 2023-10-11T01:26:31Z
Daily Trending of Coq in GitHub
\ No newline at end of file
diff --git a/cpp-objdump/daily/index.xml b/cpp-objdump/daily/index.xml
index 55176d4a575..7b74ac1d0c9 100644
--- a/cpp-objdump/daily/index.xml
+++ b/cpp-objdump/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Cpp-ObjDump Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:52Z
+ 2023-10-11T01:26:30Z
Daily Trending of Cpp-ObjDump in GitHub
\ No newline at end of file
diff --git a/creole/daily/index.xml b/creole/daily/index.xml
index f6916e1017a..5d3de243cb5 100644
--- a/creole/daily/index.xml
+++ b/creole/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Creole Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:55Z
+ 2023-10-11T01:26:32Z
Daily Trending of Creole in GitHub
\ No newline at end of file
diff --git a/crystal/daily/index.xml b/crystal/daily/index.xml
index acd0026009e..6d9c9e78197 100644
--- a/crystal/daily/index.xml
+++ b/crystal/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Crystal Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:54Z
+ 2023-10-11T01:26:29Z
Daily Trending of Crystal in GitHub
\ No newline at end of file
diff --git a/cson/daily/index.xml b/cson/daily/index.xml
index 5dba3d424f4..28058a26de6 100644
--- a/cson/daily/index.xml
+++ b/cson/daily/index.xml
@@ -1,7 +1,7 @@
GitHub CSON Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:00Z
+ 2023-10-11T01:26:33Z
Daily Trending of CSON in GitHub
\ No newline at end of file
diff --git a/csound-document/daily/index.xml b/csound-document/daily/index.xml
index 447f49c917d..79a949aff03 100644
--- a/csound-document/daily/index.xml
+++ b/csound-document/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Csound Document Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:57Z
+ 2023-10-11T01:26:36Z
Daily Trending of Csound Document in GitHub
\ No newline at end of file
diff --git a/csound-score/daily/index.xml b/csound-score/daily/index.xml
index 5038f1efa8d..b5918bc23c0 100644
--- a/csound-score/daily/index.xml
+++ b/csound-score/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Csound Score Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:58Z
+ 2023-10-11T01:26:37Z
Daily Trending of Csound Score in GitHub
\ No newline at end of file
diff --git a/csound/daily/index.xml b/csound/daily/index.xml
index 7b1cc0ac7cb..916b060dbee 100644
--- a/csound/daily/index.xml
+++ b/csound/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Csound Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:26:59Z
+ 2023-10-11T01:26:34Z
Daily Trending of Csound in GitHub
\ No newline at end of file
diff --git a/css/daily/index.xml b/css/daily/index.xml
index 31d417555ec..e04e655a104 100644
--- a/css/daily/index.xml
+++ b/css/daily/index.xml
@@ -1,21 +1,28 @@
GitHub CSS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:08Z
+ 2023-10-11T01:26:46Z
Daily Trending of CSS in GitHub
- omicreativedev/hacktoberfest2023
- 2023-10-10T01:27:08Z
- tag:github.com,2023-10-10:/omicreativedev/hacktoberfest2023
-
- <p>⭐ 200 Star Goal 👆🏽 My first time maintaining a repo for #hacktoberfest (YAY!) — Website with Theme Switcher. You can see the deployment below.</p><hr><h1>hacktoberfest2023 - ⭐ Goal 200 Stars!</h1>
<p>📢 <strong>Announcement: You do NOT need to work on issues in this repo. You can also just FORK IT and start working on a page or theme without approval.</strong> Of course you are ALSO welcome to work on issues!</p>
<ul>
<li>Read the Docs.</li>
<li>Give a ⭐</li>
<li>Don't break anything.</li>
</ul>
<p>🥳👉🏽 <a href="https://github.com/omicreativedev">Follow me on Github</a> to stay notified of NEXT YEAR's #Hacktoberfest Repos!</p>
<p><img src="https://repository-images.githubusercontent.com/701103132/df77a062-b115-4b01-8c8e-a5d7d9ebd6c7" alt="BANNER"></p>
<h2>About The Project</h2>
<p>My first attempt at trying to maintain a repo for #hacktoberfest (YAY!) Your stars help this repo qualify for syndication libraries. Please star BEFORE you are merged! Please give me 24 hours to respond to issues or pull requests. 😎</p>
<p>This project is a simple website with a theme switcher and page switcher in Javascript. You can drop the theme switcher and/or page switcher into your project and it's highly customizable.</p>
<ul>
<li>Flat file list of themes located in a theme folder so you can make multiple css files for your site!</li>
<li>Flat file list of pages located in a pages folder so you can make webpages, presentation slides, activities, etc.</li>
<li>Magically ✨🧙♂️✨ switch your fancy theme to an <a href="https://venngage.com/blog/accessible-colors/">Accessible Color Scheme</a> or Darkmode 🐱👤</li>
</ul>
<p>🤩</p>
<p>☝ Although this project is intended to be beginner friendly 💗, it should not be easy 🚫. Because some people might be really advanced at C++ or Python but never made a webpage before, I'm trusting that people don't use this repository for an easy pull request. <strong>Tiny PRs won't be merged such as typos, spaces, spam</strong> without a significant contribution. Please stretch your limits 🤓 and challenge yourself 💪🏽.</p>
<p>For total beginners, I will be listing ongoing issues and enhancement ideas that you can partake in. If you have an idea or suggestion, feel free to raise an issue or start a <a href="https://github.com/omicreativedev/hacktoberfest2023/discussions">Discussions</a>. This site is very basic, and I made it after taking a few lessons on freeCodeCamp. 💖💖💖 Anyone can do it!</p>
<h2>Stack</h2>
<div align="center">
<img src="https://img.shields.io/badge/html5-%23E34F26.svg?style=for-the-badge&logo=html5&logoColor=white" alt="HTML5">
<img src="https://img.shields.io/badge/css3-%231572B6.svg?style=for-the-badge&logo=css3&logoColor=white" alt="CSS3">
<img src="https://img.shields.io/badge/javascript-%23323330.svg?style=for-the-badge&logo=javascript&logoColor=%23F7DF1E" alt="JAVASCRIPT">
</div>
<h2>Contributors - Your Image Will Show Here! OPEN FIRST Pull Request 🎉</h2>
<p>(updates every 7 days)</p>
<div align="center">
<a href="https://github.com/omicreativedev/hacktoberfest2023/graphs/contributors">
<!-- <img src="https://contrib.rocks/image?repo=omicreativedev/hacktoberfest2023"> --> <img src="https://readme-contributors.now.sh/omicreativedev/hacktoberfest2023?width=400&spacing=1"> </a>
</div>
<h2>About Hacktoberfest 2023</h2>
<ul>
<li>Register <a href="https://hacktoberfest.digitalocean.com">here</a> for Hacktoberfest</li>
<li>Get four pull requests (PRs) merged between October 1st-31st (Yes, you can do all 4 here!)</li>
<li>Earn DIGITAL-SWAG 🔥 from Digital Ocean ⚡</li>
</ul>
<h2>This Project Is Perfect For Your First Pull Request</h2>
<ul>
<li>Read the <a href="https://github.com/omicreativedev/hacktoberfest2023/raw/main/README.md">README.md</a></li>
<li>Look at how the <a href="https://omicreativedev.github.io/hacktoberfest2023/">Website</a> works</li>
<li>Read about <a href="https://github.com/omicreativedev/hacktoberfest2023/raw/main/CONTRIBUTING.md">CONTRIBUTING.md</a></li>
<li>Read the <a href="https://github.com/omicreativedev/hacktoberfest2023/raw/main/CODE_OF_CONDUCT.md">CODE_OF_CONDUCT.md</a></li>
<li>Find or Raise an issue and wait for approval -OR- just get started making a page or theme.</li>
<li><a href="https://reflectoring.io/github-fork-and-pull/">Learn more about the fork workflow here 🏹</a></li>
<li>Fork the repository and make your changes</li>
<li>Create your PR!</li>
<li>Wait for feedback or approval (Tweet me or DM on X or Discord for faster response)</li>
<li>Get Merged 🎉🎈🥳</li>
<li><a href="https://twitter.com/intent/tweet?text=https%3A%2F%2Fomicreativedev.github.io%2Fhacktoberfest2023%2Fpages%2Fthankyou.html%0A%F0%9F%8E%88%F0%9F%A5%B3%20I%20just%20merged%20an%20%23opensource%20PR%20for%20%23Hacktoberfest%20">CLICK TO TWEET A RECOGNITION BADGE FOR CONTRIBUTING</a></li>
</ul>
<h2>Don't Forget!</h2>
<ul>
<li>⭐ STAR this repository!</li>
<li>👽 <a href="https://github.com/omicreativedev">Follow me on Github</a></li>
<li>🐤 <a href="https://twitter.com/omicreativedev">Follow me on ❌itter</a></li>
<li>👾 <a href="https://discord.gg/DWFRBv3JEy">Friend me on DISCORD</a></li>
</ul>
<h2>COPYLEFT</h2>
<p>This code / website is CC0 but the information on user created pages is personal and may be covered by additional rights such as namesake, tradedress, etc. As such, you are welcome to download this whole project but <strong>only the project is CC0, not the "personal data" <em>within</em> profile pages</strong>. Themes created are part of the opensource contribution but pages (such as the profiles in the /pages folder) <strong>must be WIPED of all personal identifying information (name, face, links)</strong> and any photographs which I don't have rights to grant. The <em>LAYOUTS</em> of those pages are opensource contributions and CC0. Anyone may adapt this project for their own repository to start a Hacktoberfest Repo of their own 💗. If you choose to do this, make a PULL REQUEST and list your repository (based on this one) below.</p>
<h3>COOL PROJECTS TO VISIT BASED ON THIS ONE! 👇🏽👇🏽👇🏽</h3>
<ul>
<li>Your Project Link Here! ⬅⬅⬅</li>
</ul>
<h1>THANK YOU! 💗💗💗</h1>
<p>The following repsitories are teaching me a lot about open source, Git, maintaining a repo for Hacktoberfest and more.</p>
<ul>
<li><a href="https://github.com/Lissy93/git-into-open-source/tree/main">Git Into Open Source</a> vy Lissy93</li>
<li><a href="https://github.com/ossamamehmood/Hacktoberfest2023">Hacktoberfest2023</a> by OssamaMehmood</li>
</ul>
+ omicreativedev/ThemeSwitcher
+ 2023-10-11T01:26:46Z
+ tag:github.com,2023-10-11:/omicreativedev/ThemeSwitcher
+
+ <p>⭐ 200 Star Goal 👆🏽 My first time maintaining a repo for #hacktoberfest (YAY!) — Website with Theme Switcher. You can see the deployment below.</p><hr><p>Due to something breaking— The code in this repository had a big update. Because so many forks are out of sync, some actions are failing. If you are working on a fork, please backup your work and resync. Since almost all open issues are in modules, you can you drop your themes/pages in the synced repo.</p>
<h1>hacktoberfest2023 - ⭐ Goal 200 Stars!</h1>
<p>📢 <strong>Announcement: You do NOT need to work on issues in this repo. You can also just FORK IT and start working on a page or theme without approval.</strong> Of course you are ALSO welcome to work on issues!</p>
<ul>
<li>Read the Docs.</li>
<li>Give a ⭐</li>
<li>Don't break anything.</li>
</ul>
<p>🥳👉🏽 <a href="https://github.com/omicreativedev">Follow me on Github</a> to stay notified of NEXT YEAR's #Hacktoberfest Repos!</p>
<p><img src="https://repository-images.githubusercontent.com/701103132/df77a062-b115-4b01-8c8e-a5d7d9ebd6c7" alt="BANNER"></p>
<h2>About The Project</h2>
<p>My first attempt at trying to maintain a repo for #hacktoberfest (YAY!) Your stars help this repo qualify for syndication libraries. Please star BEFORE you are merged! Please give me 24 hours to respond to issues or pull requests. 😎</p>
<p>This project is a simple website with a theme switcher and page switcher in Javascript. You can drop the theme switcher and/or page switcher into your project and it's highly customizable.</p>
<ul>
<li>Flat file list of themes located in a theme folder so you can make multiple css files for your site!</li>
<li>Flat file list of pages located in a pages folder so you can make webpages, presentation slides, activities, etc.</li>
<li>Magically ✨🧙♂️✨ switch your fancy theme to an <a href="https://venngage.com/blog/accessible-colors/">Accessible Color Scheme</a> or Darkmode 🐱👤</li>
</ul>
<p>🤩</p>
<p>☝ Although this project is intended to be beginner friendly 💗, it should not be easy 🚫. Because some people might be really advanced at C++ or Python but never made a webpage before, I'm trusting that people don't use this repository for an easy pull request. <strong>Tiny PRs won't be merged such as typos, spaces, spam</strong> without a significant contribution. Please stretch your limits 🤓 and challenge yourself 💪🏽.</p>
<p>For total beginners, I will be listing ongoing issues and enhancement ideas that you can partake in. If you have an idea or suggestion, feel free to raise an issue or start a <a href="https://github.com/omicreativedev/hacktoberfest2023/discussions">Discussions</a>. This site is very basic, and I made it after taking a few lessons on freeCodeCamp. 💖💖💖 Anyone can do it!</p>
<h2>Stack</h2>
<div align="center">
<img src="https://img.shields.io/badge/html5-%23E34F26.svg?style=for-the-badge&logo=html5&logoColor=white" alt="HTML5">
<img src="https://img.shields.io/badge/css3-%231572B6.svg?style=for-the-badge&logo=css3&logoColor=white" alt="CSS3">
<img src="https://img.shields.io/badge/javascript-%23323330.svg?style=for-the-badge&logo=javascript&logoColor=%23F7DF1E" alt="JAVASCRIPT">
</div>
<h2>Contributors - Your Image Will Show Here! OPEN FIRST Pull Request 🎉</h2>
<p>(updates every 7 days)</p>
<div align="center">
<a href="https://github.com/omicreativedev/hacktoberfest2023/graphs/contributors">
<!-- <img src="https://contrib.rocks/image?repo=omicreativedev/hacktoberfest2023"> --> <img src="https://readme-contributors.now.sh/omicreativedev/hacktoberfest2023?width=400&spacing=1"> </a>
</div>
<h2>About Hacktoberfest 2023</h2>
<ul>
<li>Register <a href="https://hacktoberfest.digitalocean.com">here</a> for Hacktoberfest</li>
<li>Get four pull requests (PRs) merged between October 1st-31st (Yes, you can do all 4 here!)</li>
<li>Earn DIGITAL-SWAG 🔥 from Digital Ocean ⚡</li>
</ul>
<h2>This Project Is Perfect For Your First Pull Request</h2>
<ul>
<li>Read the <a href="https://github.com/omicreativedev/hacktoberfest2023/raw/main/README.md">README.md</a></li>
<li>Look at how the <a href="https://omicreativedev.github.io/hacktoberfest2023/">Website</a> works</li>
<li>Read about <a href="https://github.com/omicreativedev/hacktoberfest2023/raw/main/CONTRIBUTING.md">CONTRIBUTING.md</a></li>
<li>Read the <a href="https://github.com/omicreativedev/hacktoberfest2023/raw/main/CODE_OF_CONDUCT.md">CODE_OF_CONDUCT.md</a></li>
<li>Find or Raise an issue and wait for approval -OR- just get started making a page or theme.</li>
<li><a href="https://reflectoring.io/github-fork-and-pull/">Learn more about the fork workflow here 🏹</a></li>
<li>Fork the repository and make your changes</li>
<li>Create your PR!</li>
<li>Wait for feedback or approval (Tweet me or DM on X or Discord for faster response)</li>
<li>Get Merged 🎉🎈🥳</li>
<li><a href="https://twitter.com/intent/tweet?text=https%3A%2F%2Fomicreativedev.github.io%2Fhacktoberfest2023%2Fpages%2Fthankyou.html%0A%F0%9F%8E%88%F0%9F%A5%B3%20I%20just%20merged%20an%20%23opensource%20PR%20for%20%23Hacktoberfest%20">CLICK TO TWEET A RECOGNITION BADGE FOR CONTRIBUTING</a></li>
</ul>
<h2>Don't Forget!</h2>
<ul>
<li>⭐ STAR this repository!</li>
<li>👽 <a href="https://github.com/omicreativedev">Follow me on Github</a></li>
<li>🐤 <a href="https://twitter.com/omicreativedev">Follow me on ❌itter</a></li>
<li>👾 <a href="https://discord.gg/DWFRBv3JEy">Friend me on DISCORD</a></li>
</ul>
<h2>COPYLEFT</h2>
<p>This code / website is CC0 but the information on user created pages is personal and may be covered by additional rights such as namesake, tradedress, etc. As such, you are welcome to download this whole project but <strong>only the project is CC0, not the "personal data" <em>within</em> profile pages</strong>. Themes created are part of the opensource contribution but pages (such as the profiles in the /pages folder) <strong>must be WIPED of all personal identifying information (name, face, links)</strong> and any photographs which I don't have rights to grant. The <em>LAYOUTS</em> of those pages are opensource contributions and CC0. Anyone may adapt this project for their own repository to start a Hacktoberfest Repo of their own 💗. If you choose to do this, make a PULL REQUEST and list your repository (based on this one) below.</p>
<h3>COOL PROJECTS TO VISIT BASED ON THIS ONE! 👇🏽👇🏽👇🏽</h3>
<ul>
<li>Your Project Link Here! ⬅⬅⬅</li>
</ul>
<h1>THANK YOU! 💗💗💗</h1>
<p>The following repsitories are teaching me a lot about open source, Git, maintaining a repo for Hacktoberfest and more.</p>
<ul>
<li><a href="https://github.com/Lissy93/git-into-open-source/tree/main">Git Into Open Source</a> vy Lissy93</li>
<li><a href="https://github.com/ossamamehmood/Hacktoberfest2023">Hacktoberfest2023</a> by OssamaMehmood</li>
</ul>
<h1>DEPLOYMENT STATUS</h1>
<p>This may take awhile after a large update... <a href="https://github.com/omicreativedev/hacktoberfest2023/actions/workflows/pages/pages-build-deployment"><img src="https://github.com/omicreativedev/hacktoberfest2023/actions/workflows/pages/pages-build-deployment/badge.svg?branch=main" alt="pages-build-deployment"></a></p>
- lazyjinchuriki/pokedex
- 2023-10-10T01:27:08Z
- tag:github.com,2023-10-10:/lazyjinchuriki/pokedex
-
- <p>A Pokedex website made in HTML5, CSS, Vanilla Javascript</p><hr><h1>Pokedex App</h1>
<p><a href="https://lazyjinchuriki.github.io/pokedex/"><img src="https://img.shields.io/badge/Visit%20My-Website-blue?style=for-the-badge&logo=arrow-right&logoColor=white" alt="Visit My Website"></a></p>
<p>Pokedex is a web application that serves as a comprehensive guide to Pokemon. It allows users to search for information on different Pokemon species, including their characteristics, abilities, types, and evolutions. The website is built using basic HTML, CSS, and vanilla JavaScript, and it utilizes the PokeAPI to fetch data on Pokemon.</p>
<h2>Tech Stacks</h2>
<p><img src="https://img.shields.io/badge/-HTML5-E34F26?style=for-the-badge&logo=html5&logoColor=white" alt="HTML5"> <img src="https://img.shields.io/badge/-CSS3-1572B6?style=for-the-badge&logo=css3&logoColor=white" alt="CSS3"> <img src="https://img.shields.io/badge/-JavaScript-F7DF1E?style=for-the-badge&logo=javascript&logoColor=black" alt="JavaScript"></p>
<h2>Features</h2>
<p>Pokedex offers the following features:</p>
<ul>
<li>Search for Pokemon by name or Pokedex number</li>
<li>Get detailed information about a specific Pokemon, including its types, abilities, stats, and evolutions</li>
<li>View a list of all Pokemon and browse through them</li>
<li>Filter Pokemon based on their types</li>
<li>View popular Pokemon and their rankings</li>
<li>View top-rated Pokemon based on their stats</li>
<li>Explore Pokemon evolutions and their evolutionary paths</li>
</ul>
<h2>Installation</h2>
<p>To install Pokedex, follow these steps:</p>
<ol>
<li>Download the source code from the repository: <a href="https://github.com/lazyjinchuriki/pokedex">https://github.com/lazyjinchuriki/pokedex</a></li>
<li>Extract the files from the downloaded ZIP archive.</li>
<li>Open the <code>index.html</code> file in your web browser.</li>
</ol>
<h2>Usage</h2>
<p>Once you have installed Pokedex, you can use it by opening it in your web browser. You can search for Pokemon using the search bar or browse through the list of all Pokemon. Clicking on a Pokemon will display its detailed information, including its types, abilities, stats, and evolutions.</p>
<h2>Screenshots</h2>
<p>Here are some screenshots of Pokedex in action:</p>
<table>
<thead>
<tr>
<th>Homepage</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="https://raw.githubusercontent.com/lazyjinchuriki/pokedex/main/screenshots/homepage.png" alt="Homepage screenshot"></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>Pokemon Overview</th>
<th>Mobile Version</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="https://raw.githubusercontent.com/lazyjinchuriki/pokedex/main/screenshots/overview.jpg" alt="Pokemon search screenshot"></td>
<td><img src="https://raw.githubusercontent.com/lazyjinchuriki/pokedex/main/screenshots/mobile.jpg" alt="Mobile screenshot"></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>Pokemon Stats</th>
<th>Pokemon Evolution</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="https://raw.githubusercontent.com/lazyjinchuriki/pokedex/main/screenshots/stats.jpg" alt="Pokemon details screenshot"></td>
<td><img src="https://raw.githubusercontent.com/lazyjinchuriki/pokedex/main/screenshots/evolution.jpg" alt="Pokemon details screenshot"></td>
</tr>
</tbody>
</table>
<h2>Credits</h2>
<p>Pokedex uses the following open source libraries and APIs:</p>
<ul>
<li>PokeAPI: <a href="https://pokeapi.co/">https://pokeapi.co/</a></li>
</ul>
<h2>Contributing</h2>
<p>Contributions to Pokedex are always welcome. If you find any bugs or issues, please open an issue on GitHub or submit a pull request.</p>
<h2>Contact</h2>
<p>If you have any questions or concerns, you can contact the author of this project at <a href="mailto:rahulkhushalani@proton.me">rahulkhushalani@proton.me</a>.</p>
<h3>Donations</h3>
<p>If you found Gallery useful, consider buying me a coffee!</p>
<a href="https://www.buymeacoffee.com/lazyjinchuriki"> <img src="https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-1.svg?sanitize=true" width="150" height="50"> </a>
<h2>Social</h2>
<p>If you're not coding right now, check out my socials:</p>
<p><a href="https://www.instagram.com/amundaneguy/"><img src="https://img.shields.io/badge/Instagram-%40amundaneguy-E4405F?style=for-the-badge&logo=instagram&logoColor=white" alt="Instagram"></a> <a href="https://www.linkedin.com/in/rahul-khushalani-77ab21201/"><img src="https://img.shields.io/badge/LinkedIn-Rahul%20Khushalani-0077B5?style=for-the-badge&logo=linkedin&logoColor=white" alt="LinkedIn"></a></p>
+ g0t4/course3-jenkins-gs-spring-petclinic
+ 2023-10-11T01:26:46Z
+ tag:github.com,2023-10-11:/g0t4/course3-jenkins-gs-spring-petclinic
+
+ <p>For Course3 Jenkins Getting Started - fork of https://github.com/spring-projects/spring-petclinic</p><hr><h1>Spring PetClinic Sample Application <a href="https://github.com/spring-projects/spring-petclinic/actions/workflows/maven-build.yml"><img src="https://github.com/spring-projects/spring-petclinic/actions/workflows/maven-build.yml/badge.svg?sanitize=true" alt="Build Status"></a></h1>
<p><a href="https://gitpod.io/#https://github.com/spring-projects/spring-petclinic"><img src="https://gitpod.io/button/open-in-gitpod.svg?sanitize=true" alt="Open in Gitpod"></a> <a href="https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=7517918"><img src="https://github.com/codespaces/badge.svg?sanitize=true" alt="Open in GitHub Codespaces"></a></p>
<h2>Understanding the Spring Petclinic application with a few diagrams</h2>
<p><a href="https://speakerdeck.com/michaelisvy/spring-petclinic-sample-application">See the presentation here</a></p>
<h2>Running petclinic locally</h2>
<p>Petclinic is a <a href="https://spring.io/guides/gs/spring-boot">Spring Boot</a> application built using <a href="https://spring.io/guides/gs/maven/">Maven</a> or <a href="https://spring.io/guides/gs/gradle/">Gradle</a>. You can build a jar file and run it from the command line (it should work just as well with Java 17 or newer):</p>
<pre><code>git clone https://github.com/spring-projects/spring-petclinic.git
cd spring-petclinic
./mvnw package
java -jar target/*.jar
</code></pre>
<p>You can then access petclinic at <a href="http://localhost:8080/">http://localhost:8080/</a></p>
<img width="1042" alt="petclinic-screenshot" src="https://cloud.githubusercontent.com/assets/838318/19727082/2aee6d6c-9b8e-11e6-81fe-e889a5ddfded.png">
<p>Or you can run it from Maven directly using the Spring Boot Maven plugin. If you do this, it will pick up changes that you make in the project immediately (changes to Java source files require a compile as well - most people use an IDE for this):</p>
<pre><code>./mvnw spring-boot:run
</code></pre>
<blockquote>
<p>NOTE: If you prefer to use Gradle, you can build the app using <code>./gradlew build</code> and look for the jar file in <code>build/libs</code>.</p>
</blockquote>
<h2>Building a Container</h2>
<p>There is no <code>Dockerfile</code> in this project. You can build a container image (if you have a docker daemon) using the Spring Boot build plugin:</p>
<pre><code>./mvnw spring-boot:build-image
</code></pre>
<h2>In case you find a bug/suggested improvement for Spring Petclinic</h2>
<p>Our issue tracker is available <a href="https://github.com/spring-projects/spring-petclinic/issues">here</a></p>
<h2>Database configuration</h2>
<p>In its default configuration, Petclinic uses an in-memory database (H2) which gets populated at startup with data. The h2 console is exposed at <code>http://localhost:8080/h2-console</code>, and it is possible to inspect the content of the database using the <code>jdbc:h2:mem:testdb</code> url.</p>
<p>A similar setup is provided for MySQL and PostgreSQL if a persistent database configuration is needed. Note that whenever the database type changes, the app needs to run with a different profile: <code>spring.profiles.active=mysql</code> for MySQL or <code>spring.profiles.active=postgres</code> for PostgreSQL.</p>
<p>You can start MySQL or PostgreSQL locally with whatever installer works for your OS or use docker:</p>
<pre><code>docker run -e MYSQL_USER=petclinic -e MYSQL_PASSWORD=petclinic -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=petclinic -p 3306:3306 mysql:8.0
</code></pre>
<p>or</p>
<pre><code>docker run -e POSTGRES_USER=petclinic -e POSTGRES_PASSWORD=petclinic -e POSTGRES_DB=petclinic -p 5432:5432 postgres:15.2
</code></pre>
<p>Further documentation is provided for <a href="https://github.com/spring-projects/spring-petclinic/raw/main/src/main/resources/db/mysql/petclinic_db_setup_mysql.txt">MySQL</a> and for <a href="https://github.com/spring-projects/spring-petclinic/raw/main/src/main/resources/db/postgres/petclinic_db_setup_postgres.txt">PostgreSQL</a>.</p>
<p>Instead of vanilla <code>docker</code> you can also use the provided <code>docker-compose.yml</code> file to start the database containers. Each one has a profile just like the Spring profile:</p>
<pre><code>$ docker-compose --profile mysql up
</code></pre>
<p>or</p>
<pre><code>$ docker-compose --profile postgres up
</code></pre>
<h2>Test Applications</h2>
<p>At development time we recommend you use the test applications set up as <code>main()</code> methods in <code>PetClinicIntegrationTests</code> (using the default H2 database and also adding Spring Boot devtools), <code>MySqlTestApplication</code> and <code>PostgresIntegrationTests</code>. These are set up so that you can run the apps in your IDE and get fast feedback, and also run the same classes as integration tests against the respective database. The MySql integration tests use Testcontainers to start the database in a Docker container, and the Postgres tests use Docker Compose to do the same thing.</p>
<h2>Compiling the CSS</h2>
<p>There is a <code>petclinic.css</code> in <code>src/main/resources/static/resources/css</code>. It was generated from the <code>petclinic.scss</code> source, combined with the <a href="https://getbootstrap.com/">Bootstrap</a> library. If you make changes to the <code>scss</code>, or upgrade Bootstrap, you will need to re-compile the CSS resources using the Maven profile "css", i.e. <code>./mvnw package -P css</code>. There is no build profile for Gradle to compile the CSS.</p>
<h2>Working with Petclinic in your IDE</h2>
<h3>Prerequisites</h3>
<p>The following items should be installed in your system:</p>
<ul>
<li>Java 17 or newer (full JDK, not a JRE).</li>
<li><a href="https://help.github.com/articles/set-up-git">git command line tool</a></li>
<li>Your preferred IDE
<ul>
<li>Eclipse with the m2e plugin. Note: when m2e is available, there is an m2 icon in <code>Help -> About</code> dialog. If m2e is not there, follow the install process <a href="https://www.eclipse.org/m2e/">here</a></li>
<li><a href="https://spring.io/tools">Spring Tools Suite</a> (STS)</li>
<li><a href="https://www.jetbrains.com/idea/">IntelliJ IDEA</a></li>
<li><a href="https://code.visualstudio.com">VS Code</a></li>
</ul> </li>
</ul>
<h3>Steps:</h3>
<ol>
<li> <p>On the command line run:</p> <pre><code>git clone https://github.com/spring-projects/spring-petclinic.git
</code></pre> </li>
<li> <p>Inside Eclipse or STS:</p> <pre><code>File -> Import -> Maven -> Existing Maven project
</code></pre> <p>Then either build on the command line <code>./mvnw generate-resources</code> or use the Eclipse launcher (right click on project and <code>Run As -> Maven install</code>) to generate the css. Run the application main method by right-clicking on it and choosing <code>Run As -> Java Application</code>.</p> </li>
<li> <p>Inside IntelliJ IDEA In the main menu, choose <code>File -> Open</code> and select the Petclinic <a href="https://raw.githubusercontent.com/g0t4/course3-jenkins-gs-spring-petclinic/main/pom.xml">pom.xml</a>. Click on the <code>Open</code> button.</p> <p>CSS files are generated from the Maven build. You can build them on the command line <code>./mvnw generate-resources</code> or right-click on the <code>spring-petclinic</code> project then <code>Maven -> Generates sources and Update Folders</code>.</p> <p>A run configuration named <code>PetClinicApplication</code> should have been created for you if you're using a recent Ultimate version. Otherwise, run the application by right-clicking on the <code>PetClinicApplication</code> main class and choosing <code>Run 'PetClinicApplication'</code>.</p> </li>
<li> <p>Navigate to Petclinic</p> <p>Visit <a href="http://localhost:8080">http://localhost:8080</a> in your browser.</p> </li>
</ol>
<h2>Looking for something in particular?</h2>
<table>
<thead>
<tr>
<th>Spring Boot Configuration</th>
<th>Class or Java property files</th>
</tr>
</thead>
<tbody>
<tr>
<td>The Main Class</td>
<td><a href="https://github.com/spring-projects/spring-petclinic/raw/main/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java">PetClinicApplication</a></td>
</tr>
<tr>
<td>Properties Files</td>
<td><a href="https://github.com/spring-projects/spring-petclinic/raw/main/src/main/resources">application.properties</a></td>
</tr>
<tr>
<td>Caching</td>
<td><a href="https://github.com/spring-projects/spring-petclinic/raw/main/src/main/java/org/springframework/samples/petclinic/system/CacheConfiguration.java">CacheConfiguration</a></td>
</tr>
</tbody>
</table>
<h2>Interesting Spring Petclinic branches and forks</h2>
<p>The Spring Petclinic "main" branch in the <a href="https://github.com/spring-projects/spring-petclinic">spring-projects</a> GitHub org is the "canonical" implementation based on Spring Boot and Thymeleaf. There are <a href="https://spring-petclinic.github.io/docs/forks.html">quite a few forks</a> in the GitHub org <a href="https://github.com/spring-petclinic">spring-petclinic</a>. If you are interested in using a different technology stack to implement the Pet Clinic, please join the community there.</p>
<h2>Interaction with other open source projects</h2>
<p>One of the best parts about working on the Spring Petclinic application is that we have the opportunity to work in direct contact with many Open Source projects. We found bugs/suggested improvements on various topics such as Spring, Spring Data, Bean Validation and even Eclipse! In many cases, they've been fixed/implemented in just a few days. Here is a list of them:</p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Issue</th>
</tr>
</thead>
<tbody>
<tr>
<td>Spring JDBC: simplify usage of NamedParameterJdbcTemplate</td>
<td><a href="https://jira.springsource.org/browse/SPR-10256">SPR-10256</a> and <a href="https://jira.springsource.org/browse/SPR-10257">SPR-10257</a></td>
</tr>
<tr>
<td>Bean Validation / Hibernate Validator: simplify Maven dependencies and backward compatibility</td>
<td><a href="https://hibernate.atlassian.net/browse/HV-790">HV-790</a> and <a href="https://hibernate.atlassian.net/browse/HV-792">HV-792</a></td>
</tr>
<tr>
<td>Spring Data: provide more flexibility when working with JPQL queries</td>
<td><a href="https://jira.springsource.org/browse/DATAJPA-292">DATAJPA-292</a></td>
</tr>
</tbody>
</table>
<h1>Contributing</h1>
<p>The <a href="https://github.com/spring-projects/spring-petclinic/issues">issue tracker</a> is the preferred channel for bug reports, features requests and submitting pull requests.</p>
<p>For pull requests, editor preferences are available in the <a href="https://raw.githubusercontent.com/g0t4/course3-jenkins-gs-spring-petclinic/main/.editorconfig">editor config</a> for easy use in common text editors. Read more and download plugins at <a href="https://editorconfig.org">https://editorconfig.org</a>. If you have not previously done so, please fill out and submit the <a href="https://cla.pivotal.io/sign/spring">Contributor License Agreement</a>.</p>
<h1>License</h1>
<p>The Spring PetClinic sample application is released under version 2.0 of the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License</a>.</p>
+
+
+ samipak458/Simple-Library-Managment
+ 2023-10-11T01:26:46Z
+ tag:github.com,2023-10-11:/samipak458/Simple-Library-Managment
+
+ <p>A simple library management project that is easy to use and helps learners understand the basic concept of JS.</p><hr><div align="center">
<h1> Simple Library Management </h1>
</div>
<p>A simple library management project is an <strong>Open Source Website</strong> built using <strong>HTML, CSS, JavaScript</strong> and <strong>Bootstrap</strong> and is <strong>easy to use</strong> and helps learners understand the <strong>basic concept of JS</strong>. In this project, the user has a provision to add book details like book name, author name, book URL, ISBN, edition, publication date, the status of reading the book, and book genre through the web page. In addition, the user has a provision to search for the available books in the library by the book name, author name, or type. If book details are present in the LocalStorage, the search details are displayed on the web page. Users also have a provision to delete a specific book or all books. The user can choose his favorites and edit any book details very quickly.</p>
<p>In this project, you will learn how to implement add, remove/delete, search, and save functionalities. You will also learn how to deploy, or publish, your web site to Azure so that you can show it off to your friends.</p>
<h1>Visit Website:</h1>
<p>You can try the website at <a href="https://delightful-coast-00b51a700.1.azurestaticapps.net/">Online Library</a></p>
<p align="center"> <img src="https://user-images.githubusercontent.com/114664734/198336464-836cce97-3ae2-4bb7-9b67-0237017fa890.png"> <img src="https://user-images.githubusercontent.com/114664734/198337311-3a82c12f-f0dc-40f9-9a3e-d74e1554388b.png"> </p>
<h2>Functionalities :</h2>
<p>Input the book Name, Author, URL, Edition, ISBN, Publication Date, Status, and Book Type to add the book. If the book name is <strong>missing</strong>, it will show you an error. As I used LocalStorage, if you <strong>refresh</strong> or <strong>close</strong> the tab, your <strong>books</strong> will <strong>not disappear</strong>. You can clear the bookshelf just by clicking on clear shelf. You can also search books by book name, author, and type.</p>
<h2>Adding</h2>
<h3>Adding Book in Shelf:</h3>
<p align="center"> <img src="https://user-images.githubusercontent.com/72745563/193397827-07ee2ced-da5f-45ca-af3c-859444b04385.png"> </p>
<h3>Adding Book Without Entering Book Name:</h3>
<p align="center"> <img src="https://user-images.githubusercontent.com/72745563/193397865-272abcb4-ee3f-4996-a738-27cbc8f31406.png"> </p>
<h3>Clearing Book Shelf:</h3>
<img src="https://user-images.githubusercontent.com/72745563/193404992-6b48eb39-e5c3-4831-89a0-3683cf8ce03a.png">
<p></p>
<h2>Searching</h2>
<h3>Search Book By Type:</h3>
<p align="center"> <img src="https://user-images.githubusercontent.com/52650290/188080738-190d7032-7494-4d38-94aa-f9ab45b091e3.png"> </p>
<h3>Search Book By Author:</h3>
<p align="center"> <img src="https://user-images.githubusercontent.com/52650290/188081091-dafe73b6-6166-4ba7-9348-073b00c8b816.png"> </p>
<h3>Search Book By Name:</h3>
<p align="center"> <img src="https://user-images.githubusercontent.com/52650290/188081402-3973c542-cfac-496e-89a9-690cdb90f779.png"> </p>
<h2>Sample working</h2>
<p><a href="https://user-images.githubusercontent.com/53844369/195153604-9a5adf2d-67be-4fc2-82d7-f2307d517e00.mp4">https://user-images.githubusercontent.com/53844369/195153604-9a5adf2d-67be-4fc2-82d7-f2307d517e00.mp4</a></p>
<div align="center">
<h2>Tech Stack</h2>
</div>
<div align="center">
<a href="https://github-readme-tech-stack.vercel.app/api/cards?theme=github_dark_green&lineCount=2&line1=html5,html,0;bootstrap,bootstrap,0;javascript,javascript,0&title=This%20Project%27s%20Tech%20Stack"> <img src="https://github-readme-tech-stack.vercel.app/api/cards?theme=github_dark_green&lineCount=2&line1=html5,html,0;bootstrap,bootstrap,0;javascript,javascript,0&title=This%20Project%27s%20Tech%20Stack" title="Tech Stack"> </a>
</div>
<h2>How to use :</h2>
<ul>
<li>Clone the repository</li>
<li>Go to the directory</li>
<li>Run index.html file</li>
<li>Enter book name, author and type of book</li>
<li>Press add book</li>
</ul>
<h1>Code Of Conduct 📜</h1>
<p>To maintain a safe and inclusive space for everyone to learn and grow, contributors are advised to follow the <a href="https://github.com/samipak458/Simple-Library-Managment/raw/main/CODE_OF_CONDUCT.md">Code of Conduct</a>.</p>
<h1>Contribution is fun! ✌🏼</h1>
<p>If you have any feedback or suggestions please reach out to me.</p>
<p>In order to make a hassle-free environment, I implore you all (while contributing) to follow the instructions <a href="https://github.com/samipak458/Simple-Library-Managment/raw/main/CONTRIBUTING.md">Contributing Guidelines</a>!</p>
<p>You can create a <a href="https://github.com/samipak458/Simple-Library-Managment/issues">issue</a> and mention there , which new features or extension can make this Project more good.</p>
<!-- ------------------------------------------------------------------------------------------------------------------------------------------------------------------ -->
<br>
<br>
<p align="right"><a href="https://raw.githubusercontent.com/samipak458/Simple-Library-Managment/main/#top"><img src="https://img.shields.io/badge/-Back%20to%20Top-red?style=for-the-badge"></a></p>
<div align="center">
<h3>Show some ❤️ by starring⭐ this awesome Repository!</h3>
</div>
<br>
<h1 align="center"> OUR VALUABLE CONTRIBUTORS✨ </h1>
<p align="center"> <a href="https://github.com/samipak458/Simple-Library-Managment/graphs/contributors"> <img src="https://contrib.rocks/image?repo=samipak458/Simple-Library-Managment"> </a> </p>
\ No newline at end of file
diff --git a/csv/daily/index.xml b/csv/daily/index.xml
index 980a8245ca2..b6b46ca0e71 100644
--- a/csv/daily/index.xml
+++ b/csv/daily/index.xml
@@ -1,7 +1,7 @@
GitHub CSV Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:02Z
+ 2023-10-11T01:26:38Z
Daily Trending of CSV in GitHub
\ No newline at end of file
diff --git a/cuda/daily/index.xml b/cuda/daily/index.xml
index b29fadc7076..075a909ddbf 100644
--- a/cuda/daily/index.xml
+++ b/cuda/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Cuda Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:08Z
+ 2023-10-11T01:26:42Z
Daily Trending of Cuda in GitHub
\ No newline at end of file
diff --git a/cue/daily/index.xml b/cue/daily/index.xml
index 080d577a262..0148c7d1f6a 100644
--- a/cue/daily/index.xml
+++ b/cue/daily/index.xml
@@ -1,7 +1,7 @@
GitHub CUE Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:03Z
+ 2023-10-11T01:26:40Z
Daily Trending of CUE in GitHub
\ No newline at end of file
diff --git a/curl-config/daily/index.xml b/curl-config/daily/index.xml
index 24ce9388ab7..cf83f2eb78e 100644
--- a/curl-config/daily/index.xml
+++ b/curl-config/daily/index.xml
@@ -1,7 +1,7 @@
GitHub cURL Config Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:16Z
+ 2023-10-11T01:26:52Z
Daily Trending of cURL Config in GitHub
\ No newline at end of file
diff --git a/curry/daily/index.xml b/curry/daily/index.xml
index c363d655dbb..b77cb6b5ccd 100644
--- a/curry/daily/index.xml
+++ b/curry/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Curry Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:17Z
+ 2023-10-11T01:26:53Z
Daily Trending of Curry in GitHub
\ No newline at end of file
diff --git a/cweb/daily/index.xml b/cweb/daily/index.xml
index 30888ec7a6a..b9af452cd01 100644
--- a/cweb/daily/index.xml
+++ b/cweb/daily/index.xml
@@ -1,7 +1,7 @@
GitHub CWeb Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:14Z
+ 2023-10-11T01:26:54Z
Daily Trending of CWeb in GitHub
\ No newline at end of file
diff --git a/cycript/daily/index.xml b/cycript/daily/index.xml
index ed560cb1f22..9062aef7be8 100644
--- a/cycript/daily/index.xml
+++ b/cycript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Cycript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:21Z
+ 2023-10-11T01:26:55Z
Daily Trending of Cycript in GitHub
\ No newline at end of file
diff --git a/cython/daily/index.xml b/cython/daily/index.xml
index 4eef075996d..6d2933fe723 100644
--- a/cython/daily/index.xml
+++ b/cython/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Cython Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:20Z
+ 2023-10-11T01:26:57Z
Daily Trending of Cython in GitHub
\ No newline at end of file
diff --git a/d-objdump/daily/index.xml b/d-objdump/daily/index.xml
index 5d9a722a3b2..bce633dd1c7 100644
--- a/d-objdump/daily/index.xml
+++ b/d-objdump/daily/index.xml
@@ -1,7 +1,7 @@
GitHub D-ObjDump Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:25Z
+ 2023-10-11T01:27:02Z
Daily Trending of D-ObjDump in GitHub
\ No newline at end of file
diff --git a/d/daily/index.xml b/d/daily/index.xml
index 7803266ee8f..fc1a8d7405c 100644
--- a/d/daily/index.xml
+++ b/d/daily/index.xml
@@ -1,7 +1,7 @@
GitHub D Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:19Z
+ 2023-10-11T01:26:59Z
Daily Trending of D in GitHub
\ No newline at end of file
diff --git a/dafny/daily/index.xml b/dafny/daily/index.xml
index 1020dbd29ce..71e7287a2ef 100644
--- a/dafny/daily/index.xml
+++ b/dafny/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Dafny Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:26Z
+ 2023-10-11T01:27:03Z
Daily Trending of Dafny in GitHub
\ No newline at end of file
diff --git a/darcs-patch/daily/index.xml b/darcs-patch/daily/index.xml
index 05bbe819fff..f567464c5dc 100644
--- a/darcs-patch/daily/index.xml
+++ b/darcs-patch/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Darcs Patch Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:23Z
+ 2023-10-11T01:27:05Z
Daily Trending of Darcs Patch in GitHub
\ No newline at end of file
diff --git a/dart/daily/index.xml b/dart/daily/index.xml
index 3e0c1b37392..5c071d55b10 100644
--- a/dart/daily/index.xml
+++ b/dart/daily/index.xml
@@ -1,14 +1,14 @@
GitHub Dart Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:34Z
+ 2023-10-11T01:27:13Z
Daily Trending of Dart in GitHub
- AOSSIE-Org/Resonate
- 2023-10-10T01:27:34Z
- tag:github.com,2023-10-10:/AOSSIE-Org/Resonate
-
- <p>Clubhouse, but Open Source. A social voice platform.</p><hr><div align="center">
<span> <img src="https://github.com/ShivamMenda/Resonate/assets/74780977/ca9e88d2-f4ca-4d8c-8a8a-289286b91e54" alt="Resonate logo" width="150" height="auto"> <img src="https://raw.githubusercontent.com/AOSSIE-Org/Resonate/master/assets/images/aossie_logo.png" alt="Resonate logo" width="150" height="auto"> </span>
<h1><span>🎤</span> Resonate - An Open Source Social Voice Platform</h1>
</div>
<div align="center">
<span> <a href="https://appwrite.io" target="_blank"><img src="https://github.com/appwrite/website/raw/main/static/images/logos/appwrite.svg?sanitize=true" alt="Appwrite Logo" width="200"></a> <img src="https://github.com/ShivamMenda/Resonate/assets/74780977/38823d33-edfb-4d90-9c4b-823cbe33c0a5" alt="Livekit Logo" width="200"> </span>
</div>
<br>
<br>
<div align="center">
<p><a href="https://opensource.org/license/gpl-3-0/"><img src="https://img.shields.io/badge/License-GPL-yellow.svg?sanitize=true" alt="License:GPL-3.0"></a> <img src="https://img.shields.io/github/stars/AOSSIE-Org/Resonate?style=social" alt="GitHub Org's stars"></p>
</div>
<p>With the rising popularity of social voice platforms such as Clubhouse and Twitter Spaces, it is high time for an Open Source alternative. A platform like this would not only enhance credibility within the open-source community but also attract more users and foster growth. An engagement platform that is Open Source has the potential to drive significant traction and help establish a strong presence.</p>
<h2><span>🚀</span> Features</h2>
<ol>
<li>Real-time Audio Communication by joining rooms and talking to people.</li>
<li>Ability to create rooms and moderate speakers and events.</li>
<li>Pair chatting to enable users to find random partners to talk to in the app.</li>
<li>Real-time messaging(Coming Soon)</li>
</ol>
<h2><span>💻</span> Technologies Used</h2>
<ol>
<li><strong>Flutter</strong> - Mobile application</li>
<li><strong>Appwrite</strong> - Authentication, Database, Storage and Cloud functions.</li>
<li><strong>LiveKit</strong> - Web Real-Time Communication</li>
</ol>
<h2><span>🔗</span> Repository Links</h2>
<ol>
<li><a href="https://github.com/AOSSIE-Org/Resonate">Resonate Flutter App</a></li>
<li><a href="https://github.com/AOSSIE-Org/Resonate-Backend">Resonate Backend</a></li>
</ol>
<h2><span>🎥</span> App Screenshots</h2>
<div align="center">
<table>
<thead>
<tr>
<th align="left">Login Screen</th>
<th align="left">Home Screen</th>
<th align="left">Create Room Screen</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><img src="https://github.com/ShivamMenda/Resonate/assets/74780977/7c996c0a-1201-44e4-86bb-832ded1aae15" width="260" height="auto"></td>
<td align="left"><img src="https://user-images.githubusercontent.com/41890434/246064681-16cfa072-af71-4e1f-97b8-2c429a875483.png" width="250" height="auto"></td>
<td align="left"><img src="https://user-images.githubusercontent.com/41890434/246064943-82e83ead-dcf3-45fa-b3ba-c0a60455946a.png" width="250" height="auto"></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th align="left">Room Screen</th>
<th align="left">Profile Screen</th>
<th align="left">Pairchat Screen</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><img src="https://user-images.githubusercontent.com/41890434/246065343-352bdfb5-3cb4-44ad-9050-6460c3be18ad.png" width="250" height="auto"></td>
<td align="left"><img src="https://user-images.githubusercontent.com/41890434/246064895-1b8cd5a8-b427-4514-91b8-d783ff4a0604.png" width="250" height="auto"></td>
<td align="left"><img src="https://github.com/ShivamMenda/Resonate/assets/74780977/8d7c5da5-0b2f-4d8f-8f12-d1059b0e4a01" width="250" height="auto"></td>
</tr>
</tbody>
</table>
</div>
<h2><span>🙌</span> Contributing</h2>
<p><span>⭐</span> Don't forget to star this repository if you find it useful! <span>⭐</span></p>
<p>Thank you for considering contributing to this project! Contributions are highly appreciated and welcomed. To ensure a smooth collaboration, Refer to the <a href="https://github.com/AOSSIE-Org/Resonate/raw/master/CONTRIBUTING.md">Contribution Guidelines</a>.</p>
<p>We appreciate your contributions and look forward to working with you to make this project even better!</p>
<p>By following these guidelines, we can maintain a productive and collaborative open-source environment. Thank you for your support!</p>
<h2><span>✌</span> Maintainers</h2>
<ul>
<li><a href="https://github.com/jddeep">Jaideep Prasad</a></li>
<li><a href="https://github.com/chandansgowda">Chandan S Gowda</a></li>
</ul>
<h2><span>📫</span> Communication Channels</h2>
<p>If you have any questions, need clarifications, or want to discuss ideas, feel free to reach out through the following channels:</p>
<ul>
<li><a href="https://discord.com/invite/6mFZ2S846n">Discord Server</a></li>
<li><a href="mailto:aossie.oss@gmail.com">Email</a></li>
</ul>
<!-- License -->
<h2><span>📍</span> License</h2>
<p>Distributed under the <a href="https://opensource.org/license/gpl-3-0/">GNU General Public License</a>. See <a href="https://github.com/AOSSIE-Org/Resonate/raw/master/LICENSE">LICENSE</a> for more information.</p>
+ Sameera-Perera/Flutter-TDD-Clean-Architecture-E-Commerce-App
+ 2023-10-11T01:27:13Z
+ tag:github.com,2023-10-11:/Sameera-Perera/Flutter-TDD-Clean-Architecture-E-Commerce-App
+
+ <p>A modern E-Commerce mobile application built with Flutter, TDD, Clean Architecture, and BLoC.</p><hr><p><a href="https://github.com/Sameera-Perera/Flutter-TDD-Clean-Architecture-E-Commerce-App/graphs/contributors"><img src="https://img.shields.io/github/contributors/Sameera-Perera/Flutter-TDD-Clean-Architecture-E-Commerce-App.svg?style=for-the-badge" alt="Contributors"></a> <a href="https://github.com/Sameera-Perera/Flutter-TDD-Clean-Architecture-E-Commerce-App/network/members"><img src="https://img.shields.io/github/forks/Sameera-Perera/Flutter-TDD-Clean-Architecture-E-Commerce-App.svg?style=for-the-badge" alt="Forks"></a> <a href="https://github.com/Sameera-Perera/Flutter-TDD-Clean-Architecture-E-Commerce-App/stargazers"><img src="https://img.shields.io/github/stars/Sameera-Perera/Flutter-TDD-Clean-Architecture-E-Commerce-App.svg?style=for-the-badge" alt="Stargazers"></a> <a href="https://github.com/Sameera-Perera/Flutter-TDD-Clean-Architecture-E-Commerce-App/issues"><img src="https://img.shields.io/github/issues/Sameera-Perera/Flutter-TDD-Clean-Architecture-E-Commerce-App.svg?style=for-the-badge" alt="Issues"></a> <a href="http://www.linkedin.com/in/sameera-perera-1148081b8"><img src="https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555" alt="LinkedIn"></a></p>
<!-- PROJECT LOGO -->
<p align="center"> </p>
<h3 align="center">Flutter TDD Clean Architecture E-Commerce App - EShop</h3>
<p></p>
<p><a href="https://example.com"><img src="https://raw.githubusercontent.com/Sameera-Perera/Flutter-TDD-Clean-Architecture-E-Commerce-App/main/readme_assets/splash.jpg" alt="Product Name Screen Shot"></a></p>
<p>Welcome to the Flutter-TDD-Clean-Architecture-E-Commerce-App GitHub repository! This project is a showcase of modern mobile app development practices, leveraging the power of Flutter, Test-Driven Development (TDD), Clean Architecture, and the BLoC (Business Logic Component) package. Built using the latest version of Flutter 3, this E-Commerce application exemplifies best practices for building scalable, maintainable, and efficient Flutter apps.</p>
<h2>Key Features:</h2>
<ul>
<li><strong>Test-Driven Development (TDD)</strong>: This project emphasizes the importance of writing tests before writing the actual code. It ensures that the application's logic is thoroughly tested, enhancing reliability and maintainability.</li>
<li><strong>Clean Architecture</strong>: The app follows a clean and modular architecture that separates concerns into different layers: Presentation, Domain, and Data. This architecture promotes code reusability and makes it easier to adapt to changes in the future.</li>
<li><strong>BLoC State Management</strong>: The app utilizes the BLoC pattern for state management. BLoC helps manage the flow of data and business logic in a clean and reactive manner, improving overall app performance.</li>
<li><strong>E-Commerce Functionality</strong>: The app showcases a variety of E-Commerce features, such as product browsing, searching, cart and purchasing. Users can explore products, add them to their cart, and complete transactions seamlessly.</li>
</ul>
<!-- Features -->
<hr>
<table>
<thead>
<tr>
<th>Feature</th>
<th>UseCases</th>
</tr>
</thead>
<tbody>
<tr>
<td>Product</td>
<td>Get Product UseCase</td>
</tr>
<tr>
<td>Category</td>
<td>Get Cached Category UseCase<br>Get Remote Category UseCase<br>Filter Category UseCase</td>
</tr>
<tr>
<td>Cart</td>
<td>Get Cached Cart UseCase<br>Get Remote Cart UseCase<br>Add Cart Item UseCase<br>Sync Cart UseCase</td>
</tr>
<tr>
<td>User</td>
<td>Get Cached User UseCase<br>SignIn UseCase<br>SignUp UseCase<br>SignOut UseCase</td>
</tr>
<tr>
<td>Delivery Info</td>
<td>Get Cached Delivery Info UseCase<br>Get Remote Delivery Info UseCase<br>Add Delivery Info UseCase</td>
</tr>
<tr>
<td>Order</td>
<td>Get Orders UseCase<br>Add Order UseCase</td>
</tr>
</tbody>
</table>
<hr>
<h2>Demo Sample</h2>
<div style="text-align: center">
<table>
<tbody>
<tr>
<td style="text-align: center"> <img src="https://res.cloudinary.com/dhyttttax/image/upload/v1695741758/RepoAssets/home-loading_r39lc6.gif" width="200"> </td>
<td style="text-align: center"> <img src="https://res.cloudinary.com/dhyttttax/image/upload/v1695743869/RepoAssets/home-navigation-min_q1cou5.gif" width="200"> </td>
<td style="text-align: center"> <img src="https://res.cloudinary.com/dhyttttax/image/upload/v1695744798/RepoAssets/product-details-order_j0lvw5.gif" width="200"> </td>
</tr>
<tr>
<td style="text-align: center"> <img src="https://res.cloudinary.com/dhyttttax/image/upload/v1695745493/RepoAssets/user-delivery-infomarion_zr1eyv.gif" width="200"> </td>
<td style="text-align: center"> <img src="https://res.cloudinary.com/dhyttttax/image/upload/v1695746530/RepoAssets/user-auth-screens_k3h6fw.gif" width="200"> </td>
<td style="text-align: center"> <img src="https://res.cloudinary.com/dhyttttax/image/upload/v1695747060/RepoAssets/user-sign-in-loading_qjqmt0.gif" width="200"> </td>
</tr>
</tbody>
</table>
</div>
<h2>Contributing:</h2>
<p>We welcome contributions from the Flutter community to make this project even better. Whether you are interested in adding new features, fixing bugs, or improving documentation, your contributions are highly appreciated. Please refer to the contribution guidelines in the repository for more details on how to get involved.</p>
<!-- GETTING STARTED -->
<h2>Getting Started</h2>
<p>To get started with this project, follow the instructions in the README to set up your development environment and run the app locally. You can also explore the project's architecture, tests, and documentation to gain insights into building robust Flutter apps.</p>
<p>We hope this Flutter-TDD-Clean-Architecture-E-Commerce-App serves as a valuable resource for both Flutter enthusiasts and developers looking to learn about TDD, clean architecture, and BLoC in the context of mobile app development. Happy coding!</p>
<h3>Installation</h3>
<ol>
<li>Clone the repo <pre><code class="language-sh">git clone https://github.com/Sameera-Perera/Flutter-TDD-Clean-Architecture-E-Commerce-App.git
</code></pre> </li>
<li>Install packages <pre><code class="language-sh">flutter pub get
</code></pre> </li>
<li>Run app <pre><code class="language-sh">flutter run lib/main.dart
</code></pre> </li>
<li>Run test <pre><code class="language-sh">flutter test
</code></pre> </li>
</ol>
<p>For help getting started with Flutter, view our online <a href="https://flutter.io/">documentation</a>.</p>
<!-- LICENSE -->
<h2>License</h2>
<p>Distributed under the MIT License. See <code>LICENSE</code> for more information.</p>
<!-- MARKDOWN LINKS & IMAGES -->
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->
\ No newline at end of file
diff --git a/dataweave/daily/index.xml b/dataweave/daily/index.xml
index a0809a80510..d9dcfe475f5 100644
--- a/dataweave/daily/index.xml
+++ b/dataweave/daily/index.xml
@@ -1,7 +1,7 @@
GitHub DataWeave Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:28Z
+ 2023-10-11T01:27:06Z
Daily Trending of DataWeave in GitHub
\ No newline at end of file
diff --git a/debian-package-control-file/daily/index.xml b/debian-package-control-file/daily/index.xml
index 4d83cbad764..bc3a71f3878 100644
--- a/debian-package-control-file/daily/index.xml
+++ b/debian-package-control-file/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Debian Package Control File Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:30Z
+ 2023-10-11T01:27:07Z
Daily Trending of Debian Package Control File in GitHub
\ No newline at end of file
diff --git a/denizenscript/daily/index.xml b/denizenscript/daily/index.xml
index c436aa3a777..1dfd46261ab 100644
--- a/denizenscript/daily/index.xml
+++ b/denizenscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub DenizenScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:29Z
+ 2023-10-11T01:27:08Z
Daily Trending of DenizenScript in GitHub
\ No newline at end of file
diff --git a/desktop/daily/index.xml b/desktop/daily/index.xml
index 595a95c1234..45659c6f015 100644
--- a/desktop/daily/index.xml
+++ b/desktop/daily/index.xml
@@ -1,7 +1,7 @@
GitHub desktop Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:44Z
+ 2023-10-11T01:27:33Z
Daily Trending of desktop in GitHub
\ No newline at end of file
diff --git a/dhall/daily/index.xml b/dhall/daily/index.xml
index b9a98653270..ee37180d4f7 100644
--- a/dhall/daily/index.xml
+++ b/dhall/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Dhall Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:42Z
+ 2023-10-11T01:27:30Z
Daily Trending of Dhall in GitHub
\ No newline at end of file
diff --git a/diff/daily/index.xml b/diff/daily/index.xml
index f73c904a73a..88289db49b9 100644
--- a/diff/daily/index.xml
+++ b/diff/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Diff Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:45Z
+ 2023-10-11T01:27:31Z
Daily Trending of Diff in GitHub
\ No newline at end of file
diff --git a/digital-command-language/daily/index.xml b/digital-command-language/daily/index.xml
index ff0f09dab04..0dcd03845c1 100644
--- a/digital-command-language/daily/index.xml
+++ b/digital-command-language/daily/index.xml
@@ -1,7 +1,7 @@
GitHub DIGITAL Command Language Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:43Z
+ 2023-10-11T01:27:32Z
Daily Trending of DIGITAL Command Language in GitHub
\ No newline at end of file
diff --git a/dircolors/daily/index.xml b/dircolors/daily/index.xml
index f87885a9b38..c3ef7c72c7e 100644
--- a/dircolors/daily/index.xml
+++ b/dircolors/daily/index.xml
@@ -1,7 +1,7 @@
GitHub dircolors Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:48Z
+ 2023-10-11T01:27:37Z
Daily Trending of dircolors in GitHub
\ No newline at end of file
diff --git a/directx-3d-file/daily/index.xml b/directx-3d-file/daily/index.xml
index cd9949f562f..2f41c8a10a7 100644
--- a/directx-3d-file/daily/index.xml
+++ b/directx-3d-file/daily/index.xml
@@ -1,7 +1,7 @@
GitHub DirectX 3D File Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:47Z
+ 2023-10-11T01:27:35Z
Daily Trending of DirectX 3D File in GitHub
\ No newline at end of file
diff --git a/dm/daily/index.xml b/dm/daily/index.xml
index 527040547f8..45ada78271a 100644
--- a/dm/daily/index.xml
+++ b/dm/daily/index.xml
@@ -1,14 +1,7 @@
GitHub DM Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:50Z
+ 2023-10-11T01:27:40Z
Daily Trending of DM in GitHub
-
- JasmineRickards/Wasteland-After-Dark
- 2023-10-10T01:27:50Z
- tag:github.com,2023-10-10:/JasmineRickards/Wasteland-After-Dark
-
- <p></p><hr>
-
\ No newline at end of file
diff --git a/dns-zone/daily/index.xml b/dns-zone/daily/index.xml
index 9ad810f5312..b108e80ad38 100644
--- a/dns-zone/daily/index.xml
+++ b/dns-zone/daily/index.xml
@@ -1,7 +1,7 @@
GitHub DNS Zone Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:48Z
+ 2023-10-11T01:27:36Z
Daily Trending of DNS Zone in GitHub
\ No newline at end of file
diff --git a/dockerfile/daily/index.xml b/dockerfile/daily/index.xml
index c253d0c46ba..3f349013423 100644
--- a/dockerfile/daily/index.xml
+++ b/dockerfile/daily/index.xml
@@ -1,21 +1,14 @@
GitHub Dockerfile Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:57Z
+ 2023-10-11T01:27:48Z
Daily Trending of Dockerfile in GitHub
- jfloff/alpine-python
- 2023-10-10T01:27:57Z
- tag:github.com,2023-10-10:/jfloff/alpine-python
-
- <p>A small, more complete, Python Docker image based on Alpine Linux.</p><hr><h1>alpine-python</h1>
<p><a href="https://hub.docker.com/r/jfloff/alpine-python/"><img src="https://img.shields.io/docker/stars/jfloff/alpine-python.svg?sanitize=true" alt="Docker Stars"></a> <a href="https://hub.docker.com/r/jfloff/alpine-python/"><img src="https://img.shields.io/docker/pulls/jfloff/alpine-python.svg?sanitize=true" alt="Docker Pulls"></a> <a href="https://travis-ci.org/jfloff/alpine-python"><img src="https://travis-ci.org/jfloff/alpine-python.svg?branch=master" alt="Build Status"></a></p>
<p>A small Python Docker image based on <a href="http://alpinelinux.org/">Alpine Linux</a>.</p>
<!-- MDTOC maxdepth:6 firsth1:0 numbering:0 flatten:0 bullets:1 updateOnSave:1 -->
<ul>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#alpine-python">alpine-python</a>
<ul>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#supported-tags">Supported tags</a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#why">Why?</a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#details">Details</a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#usage">Usage</a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#usage-of-onbuild-images">Usage of <code>onbuild</code> images</a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#usage-of-slim-images">Usage of <code>slim</code> images</a>
<ul>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#via-docker-run">Via <code>docker run</code></a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#pip-dependencies">Pip Dependencies</a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#run-time-dependencies">Run-Time Dependencies</a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#build-time-dependencies">Build-Time Dependencies</a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#creating-images">Creating Images</a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#debugging">Debugging</a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#additional-arguments">Additional Arguments</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#ecosystem">Ecosystem</a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#contribution">Contribution</a></li>
<li><a href="https://raw.githubusercontent.com/jfloff/alpine-python/master/#license">License</a></li>
</ul> </li>
</ul>
<!-- /MDTOC -->
<h2>Supported tags</h2>
<ul>
<li><strong><code>2.7</code> (<a href="https://github.com/jfloff/alpine-python/raw/master/2.7/Dockerfile">2.7/Dockerfile</a>)</strong></li>
<li><strong><code>2.7-onbuild</code> (<a href="https://github.com/jfloff/alpine-python/raw/master/2.7-onbuild/Dockerfile">2.7-onbuild/Dockerfile</a>)</strong></li>
<li><strong><code>2.7-slim</code> (<a href="https://github.com/jfloff/alpine-python/raw/master/2.7-slim/Dockerfile">2.7-slim/Dockerfile</a>)</strong></li>
<li><strong><code>3.6</code> (<a href="https://github.com/jfloff/alpine-python/raw/master/3.6/Dockerfile">Dockerfile</a>)</strong></li>
<li><strong><code>3.6-onbuild</code> (<a href="https://github.com/jfloff/alpine-python/raw/master/3.6-onbuild/Dockerfile">Dockerfile</a>)</strong></li>
<li><strong><code>3.6-slim</code> (<a href="https://github.com/jfloff/alpine-python/raw/master/3.6-slim/Dockerfile">Dockerfile</a>)</strong></li>
<li><strong><code>3.7</code> (<a href="https://github.com/jfloff/alpine-python/raw/master/3.7/Dockerfile">Dockerfile</a>)</strong></li>
<li><strong><code>3.7-onbuild</code> (<a href="https://github.com/jfloff/alpine-python/raw/master/3.7-onbuild/Dockerfile">Dockerfile</a>)</strong></li>
<li><strong><code>3.7-slim</code> (<a href="https://github.com/jfloff/alpine-python/raw/master/3.7-slim/Dockerfile">Dockerfile</a>)</strong></li>
<li><strong><code>3.8</code> <code>latest</code> (<a href="https://github.com/jfloff/alpine-python/raw/master/3.8/Dockerfile">Dockerfile</a>)</strong></li>
<li><strong><code>3.8-onbuild</code> <code>latest-onbuild</code> (<a href="https://github.com/jfloff/alpine-python/raw/master/3.8-onbuild/Dockerfile">Dockerfile</a>)</strong></li>
<li><strong><code>3.8-slim</code> <code>latest-slim</code> (<a href="https://github.com/jfloff/alpine-python/raw/master/3.8-slim/Dockerfile">Dockerfile</a>)</strong></li>
</ul>
<p><strong>NOTES:</strong></p>
<ul>
<li><code>onbuild</code> images install the <code>requirements.txt</code> of your project from the get go. This allows you to cache your requirements right in the build. <em>Make sure you are in the same directory of your <code>requirements.txt</code> file</em>.</li>
</ul>
<h2>Why?</h2>
<p>The default docker python images are too <a href="https://github.com/docker-library/python/issues/45">big</a>, much larger than they need to be. Hence I built this simple image based on <a href="https://github.com/gliderlabs/docker-alpine">docker-alpine</a>, that has everything needed for the most common python projects - including <code>python-dev</code> (which is not common in most minimal alpine python packages).</p>
<table>
<thead>
<tr>
<th>REPOSITORY</th>
<th>TAG</th>
<th>SIZE</th>
</tr>
</thead>
<tbody>
<tr>
<td>jfloff/alpine-python</td>
<td>2.7-slim</td>
<td>60MB</td>
</tr>
<tr>
<td>python</td>
<td>2.7-slim</td>
<td>120MB</td>
</tr>
<tr>
<td>python</td>
<td>2.7-alpine</td>
<td>61.2MB</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>jfloff/alpine-python</td>
<td>2.7</td>
<td>235MB</td>
</tr>
<tr>
<td>python</td>
<td>2.7</td>
<td>912MB</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>jfloff/alpine-python</td>
<td>3.6-slim</td>
<td>76.3MB</td>
</tr>
<tr>
<td>python</td>
<td>3.6-slim</td>
<td>138MB</td>
</tr>
<tr>
<td>python</td>
<td>3.6-alpine</td>
<td>79MB</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>jfloff/alpine-python</td>
<td>3.6</td>
<td>252MB</td>
</tr>
<tr>
<td>python</td>
<td>3.6</td>
<td>922MB</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>jfloff/alpine-python</td>
<td>3.7-slim</td>
<td>80.4MB</td>
</tr>
<tr>
<td>python</td>
<td>3.7-slim</td>
<td>86.7MB</td>
</tr>
<tr>
<td>python</td>
<td>3.7-alpine</td>
<td>143MB</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>jfloff/alpine-python</td>
<td>3.7</td>
<td>256MB</td>
</tr>
<tr>
<td>python</td>
<td>3.7</td>
<td>927MB</td>
</tr>
</tbody>
</table>
<p>Perhaps this could be even smaller, but I'm not an Alpine guru. <strong>Feel free to post a PR.</strong></p>
<h2>Details</h2>
<ul>
<li>Installs <code>build-base</code> and <code>python-dev</code>, allowing the use of more advanced packages such as <code>gevent</code></li>
<li>Installs <code>bash</code> allowing interaction with the container</li>
<li>Just like the main <code>python</code> docker image, it creates useful symlinks that are expected to exist, e.g. <code>python3</code> > <code>python</code>, <code>pip2.7</code> > <code>pip</code>, etc.)</li>
<li>Added <code>testing</code> and <code>community</code> repositories to Alpine's <code>/etc/apk/repositories</code> file</li>
</ul>
<h2>Usage</h2>
<p>This image runs <code>python</code> command on <code>docker run</code>. You can either specify your own command, e.g:</p>
<pre><code class="language-shell">docker run --rm -ti jfloff/alpine-python python hello.py
</code></pre>
<p>You can also access <code>bash</code> inside the container:</p>
<pre><code class="language-shell">docker run --rm -ti jfloff/alpine-python bash
</code></pre>
<h2>Usage of <code>onbuild</code> images</h2>
<p>These images can be used to bake your dependencies into an image by extending the plain python images. To do so, create a custom <code>Dockerfile</code> like this:</p>
<pre><code class="language-dockerfile">FROM jfloff/alpine-python:3.6-onbuild
# for a flask server
EXPOSE 5000
CMD python manage.py runserver
</code></pre>
<p>Don't forget to build that <code>Dockerfile</code>:</p>
<pre><code class="language-shell">docker build --rm=true -t jfloff/app .
docker run --rm -t jfloff/app
</code></pre>
<p>Personally, I build an extended <code>Dockerfile</code> version (like shown above), and mount my specific application inside the container:</p>
<pre><code class="language-shell">docker run --rm -v "$(pwd)":/home/app -w /home/app -p 5000:5000 -ti jfloff/app
</code></pre>
<h2>Usage of <code>slim</code> images</h2>
<p>These images are very small to download, and can install requirements at run-time via flags. The install only happens the first time the container is run, and dependencies can be baked in (see Creating Images).</p>
<h4>Via <code>docker run</code></h4>
<p>These images can be run in multiple ways. With no arguments, it will run <code>python</code> interactively:</p>
<pre><code class="language-shell">docker run --rm -ti jfloff/alpine-python:2.7-slim
</code></pre>
<p>If you specify a command, they will run that:</p>
<pre><code class="language-shell">docker run --rm -ti jfloff/alpine-python:2.7-slim python hello.py
</code></pre>
<h4>Pip Dependencies</h4>
<p>Pip dependencies can be installed by the <code>-p</code> switch, or a <code>requirements.txt</code> file.</p>
<p>If the file is at <code>/requirements.txt</code> it will be automatically read for dependencies. If not, use the <code>-P</code> or <code>-r</code> switch to specify a file.</p>
<pre><code class="language-shell"># This runs interactive Python with 'simplejson' and 'requests' installed
docker run --rm -ti jfloff/alpine-python:2.7-slim -p simplejson -p requests
# Don't forget to add '--' after your dependencies to run a custom command:
docker run --rm -ti jfloff/alpine-python:2.7-slim -p simplejson -p requests -- python hello.py
# This accomplishes the same thing by mounting a requirements.txt in:
echo 'simplejson' > requirements.txt
echo 'requests' > requirements.txt
docker run --rm -ti \
-v requirements.txt:/requirements.txt \
jfloff/alpine-python:2.7-slim python hello.py
# This does too, but with the file somewhere else:
echo 'simplejson requests' > myapp/requirements.txt
docker run --rm -ti \
-v myapp:/usr/src/app \
jfloff/alpine-python:2.7-slim \
-r /usr/src/app/requirements.txt \
-- python /usr/src/app/hello.py
</code></pre>
<h4>Run-Time Dependencies</h4>
<p>Alpine package dependencies can be installed by the <code>-a</code> switch, or an <code>apk-requirements.txt</code> file.</p>
<p>If the file is at <code>/apk-requirements.txt</code> it will be automatically read for dependencies. If not, use the <code>-A</code> switch to specify a file.</p>
<p>You can also try installing some Python modules via this method, but it is possible for Pip to interfere if it detects a version problem.</p>
<pre><code class="language-shell"># Unknown why you'd need to do this, but you can!
docker run --rm -ti jfloff/alpine-python:2.7-slim -a openssl -- python hello.py
# This installs libxml2 module faster than via Pip, but then Pip reinstalls it because Ajenti's dependencies make it think it's the wrong version.
docker run --rm -ti jfloff/alpine-python:2.7-slim -a py-libxml2 -p ajenti
</code></pre>
<h4>Build-Time Dependencies</h4>
<p>Build-time Alpine package dependencies (such as compile headers) can be installed by the <code>-b</code> switch, or a <code>build-requirements.txt</code> file. They will be removed after the dependencies are installed to save space.</p>
<p>If the file is at <code>/build-requirements.txt</code> it will be automatically read for dependencies. If not, use the <code>-B</code> switch to specify a file.</p>
<p><code>build-base</code>, <code>linux-headers</code> and <code>python-dev</code> are always build dependencies, you don't need to include them.</p>
<pre><code class="language-shell">docker run --rm -ti jfloff/alpine-python:2.7-slim \
-p gevent \
-p libxml2 \
-b libxslt-dev \
-b libxml-dev \
-- python hello.py
</code></pre>
<h4>Creating Images</h4>
<p>Similar to the onbuild images, dependencies can be baked into a new image by using a custom <code>Dockerfile</code>, e.g:</p>
<pre><code class="language-dockerfile">FROM jfloff/alpine-python:2.7-slim
RUN /entrypoint.sh \
-p ajenti-panel \
-p ajenti.plugin.dashboard \
-p ajenti.plugin.settings \
-p ajenti.plugin.plugins \
-b libxml2-dev \
-b libxslt-dev \
-b libffi-dev \
-b openssl-dev \
&& echo
CMD ["ajenti-panel"]
# you won't be able to add more dependencies later though-- see 'Debugging'
</code></pre>
<h4>Debugging</h4>
<p>The <code>/entrypoint.sh</code> script that manages dependencies in the slim images creates an empty file, <code>/requirements.installed</code>, telling the script not to install any dependencies after the container's first run. Removing this file will allow the script to work again if it is needed.</p>
<p>You can use the <code>-x</code> flag to see everything the <code>/entrypoint.sh</code> script is doing.</p>
<p>You can also access <code>bash</code> inside the container:</p>
<pre><code class="language-shell">docker run --rm -ti jfloff/alpine-python:2.7-slim bash
</code></pre>
<h4>Additional Arguments</h4>
<p><code>-q</code>: silences output from <code>/entrypoint.sh</code> <code>-x</code>: turns on Bash debugging, making the output very verbose.</p>
<h2>Ecosystem</h2>
<p>These are some of the images that use <code>jfloff/alpine-python</code> as base image. <em>If you have another image that uses this as base image, please submit an issue or PR for it to be added. Image has to be published on Docker Hub.</em></p>
<ul>
<li><strong><a href="https://github.com/jfloff/docker-alscipy">jfloff/alscipy</a></strong> <a href="https://hub.docker.com/r/jfloff/alscipy/"><img src="https://img.shields.io/docker/stars/jfloff/alscipy.svg?sanitize=true" alt="Docker Stars"></a> <a href="https://hub.docker.com/r/jfloff/alscipy/"><img src="https://img.shields.io/docker/pulls/jfloff/alscipy.svg?sanitize=true" alt="Docker Pulls"></a> : image with common packages for Science in Alpine Python.</li>
<li><strong><a href="https://github.com/jfloff/docker-pywfm">jfloff/pywfm</a></strong> <a href="https://hub.docker.com/r/jfloff/pywfm/"><img src="https://img.shields.io/docker/stars/jfloff/pywfm.svg?sanitize=true" alt="Docker Stars"></a> <a href="https://hub.docker.com/r/jfloff/pywfm/"><img src="https://img.shields.io/docker/pulls/jfloff/pywfm.svg?sanitize=true" alt="Docker Pulls"></a> : image from the python wrapper for Steffen Rendle's factorization machines library libFM.</li>
<li><strong><a href="https://github.com/bismuthfoundation/Bismuth-Docker">bismuthfoundation/Bismuth-Docker</a></strong> <a href="https://hub.docker.com/r/eggdrasyl/bismuth-node/"><img src="https://img.shields.io/docker/stars/eggdrasyl/bismuth-node.svg?sanitize=true" alt="Docker Stars"></a> <a href="https://hub.docker.com/r/eggdrasyl/bismuth-node/"><img src="https://img.shields.io/docker/pulls/eggdrasyl/bismuth-node.svg?sanitize=true" alt="Docker Pulls"></a> : node and associated services, from scratch crypto-currency with Python codebase.</li>
</ul>
<h2>Contribution</h2>
<p>Feel free to contribute with whatever you feel like this image is missing. There is also some changes that happen often like, updating Alpine or Python versions. Do not forget that this repo folders mirror <strong>Python</strong> version and <strong><em>not</em></strong> Alpine versions.</p>
<h2>License</h2>
<p>The code in this repository, unless otherwise noted, is MIT licensed. See the <code>LICENSE</code> file in this repository.</p>
-
-
- atmlvs/scripts
- 2023-10-10T01:27:57Z
- tag:github.com,2023-10-10:/atmlvs/scripts
-
- <p>untils in general task</p><hr><h2>Scripts</h2>
<p>Untils in general tasks.</p>
<p>Description:</p>
<ul>
<li>create target directories using YEAR.</li>
<li>read date time from EXIF as part of photo name.</li>
<li>use system creation time for photos with limit EXIF.</li>
<li>copy photos from src directory to corresponding target directories.</li>
</ul>
<p>tested on Mac OS X 10.8.2/Python 2.7.3</p>
+ smyliy/choreo-ws
+ 2023-10-11T01:27:48Z
+ tag:github.com,2023-10-11:/smyliy/choreo-ws
+
+ <p></p><hr><p>2023/10/11 00:40:57</p>
\ No newline at end of file
diff --git a/dogescript/daily/index.xml b/dogescript/daily/index.xml
index 4283d84de47..c63434d3019 100644
--- a/dogescript/daily/index.xml
+++ b/dogescript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Dogescript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:53Z
+ 2023-10-11T01:27:43Z
Daily Trending of Dogescript in GitHub
\ No newline at end of file
diff --git a/dtrace/daily/index.xml b/dtrace/daily/index.xml
index bfe41e6c049..72d03983458 100644
--- a/dtrace/daily/index.xml
+++ b/dtrace/daily/index.xml
@@ -1,7 +1,7 @@
GitHub DTrace Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:27:52Z
+ 2023-10-11T01:27:41Z
Daily Trending of DTrace in GitHub
\ No newline at end of file
diff --git a/dylan/daily/index.xml b/dylan/daily/index.xml
index 2860a9adfd6..3e192126d81 100644
--- a/dylan/daily/index.xml
+++ b/dylan/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Dylan Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:30Z
+ 2023-10-11T01:28:32Z
Daily Trending of Dylan in GitHub
\ No newline at end of file
diff --git a/e-mail/daily/index.xml b/e-mail/daily/index.xml
index 3abf8f72874..04ee6323236 100644
--- a/e-mail/daily/index.xml
+++ b/e-mail/daily/index.xml
@@ -1,7 +1,7 @@
GitHub E-mail Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:53Z
+ 2023-10-11T01:28:55Z
Daily Trending of E-mail in GitHub
\ No newline at end of file
diff --git a/e/daily/index.xml b/e/daily/index.xml
index 23bcb4ff83f..afc44b61910 100644
--- a/e/daily/index.xml
+++ b/e/daily/index.xml
@@ -1,7 +1,7 @@
GitHub E Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:29Z
+ 2023-10-11T01:28:34Z
Daily Trending of E in GitHub
\ No newline at end of file
diff --git a/eagle/daily/index.xml b/eagle/daily/index.xml
index 9038f9a9850..6ea0f69952d 100644
--- a/eagle/daily/index.xml
+++ b/eagle/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Eagle Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:31Z
+ 2023-10-11T01:28:36Z
Daily Trending of Eagle in GitHub
\ No newline at end of file
diff --git a/earthly/daily/index.xml b/earthly/daily/index.xml
index c78fbe66c90..cc313989c82 100644
--- a/earthly/daily/index.xml
+++ b/earthly/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Earthly Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:33Z
+ 2023-10-11T01:28:39Z
Daily Trending of Earthly in GitHub
\ No newline at end of file
diff --git a/easybuild/daily/index.xml b/easybuild/daily/index.xml
index 5bf7c2bb622..67e29662221 100644
--- a/easybuild/daily/index.xml
+++ b/easybuild/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Easybuild Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:35Z
+ 2023-10-11T01:28:38Z
Daily Trending of Easybuild in GitHub
\ No newline at end of file
diff --git a/ebnf/daily/index.xml b/ebnf/daily/index.xml
index 9a1359e7f63..f761885dc04 100644
--- a/ebnf/daily/index.xml
+++ b/ebnf/daily/index.xml
@@ -1,7 +1,7 @@
GitHub EBNF Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:32Z
+ 2023-10-11T01:28:37Z
Daily Trending of EBNF in GitHub
\ No newline at end of file
diff --git a/ec/daily/index.xml b/ec/daily/index.xml
index c2ff5ff4f74..37646c2312b 100644
--- a/ec/daily/index.xml
+++ b/ec/daily/index.xml
@@ -1,7 +1,7 @@
GitHub eC Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:34Z
+ 2023-10-11T01:28:39Z
Daily Trending of eC in GitHub
\ No newline at end of file
diff --git a/ecere-projects/daily/index.xml b/ecere-projects/daily/index.xml
index 37aa65b661e..a57edf18df9 100644
--- a/ecere-projects/daily/index.xml
+++ b/ecere-projects/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Ecere Projects Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:37Z
+ 2023-10-11T01:28:42Z
Daily Trending of Ecere Projects in GitHub
\ No newline at end of file
diff --git a/ecl/daily/index.xml b/ecl/daily/index.xml
index 5e07475d2d2..5a3dde48a81 100644
--- a/ecl/daily/index.xml
+++ b/ecl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ECL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:38Z
+ 2023-10-11T01:28:41Z
Daily Trending of ECL in GitHub
\ No newline at end of file
diff --git a/eclipse/daily/index.xml b/eclipse/daily/index.xml
index a3a22417222..772f4cfb779 100644
--- a/eclipse/daily/index.xml
+++ b/eclipse/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ECLiPSe Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:40Z
+ 2023-10-11T01:28:41Z
Daily Trending of ECLiPSe in GitHub
\ No newline at end of file
diff --git a/editorconfig/daily/index.xml b/editorconfig/daily/index.xml
index 45af65dae8a..89b200cbf5f 100644
--- a/editorconfig/daily/index.xml
+++ b/editorconfig/daily/index.xml
@@ -1,7 +1,7 @@
GitHub EditorConfig Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:41Z
+ 2023-10-11T01:28:44Z
Daily Trending of EditorConfig in GitHub
\ No newline at end of file
diff --git a/edje-data-collection/daily/index.xml b/edje-data-collection/daily/index.xml
index 86d0c07d9b1..23d7748a3ae 100644
--- a/edje-data-collection/daily/index.xml
+++ b/edje-data-collection/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Edje Data Collection Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:44Z
+ 2023-10-11T01:28:46Z
Daily Trending of Edje Data Collection in GitHub
\ No newline at end of file
diff --git a/edn/daily/index.xml b/edn/daily/index.xml
index ae4f0d8f67d..f4792649381 100644
--- a/edn/daily/index.xml
+++ b/edn/daily/index.xml
@@ -1,7 +1,7 @@
GitHub edn Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:42Z
+ 2023-10-11T01:28:47Z
Daily Trending of edn in GitHub
\ No newline at end of file
diff --git a/eiffel/daily/index.xml b/eiffel/daily/index.xml
index 778bc5b9e82..3d985bf351d 100644
--- a/eiffel/daily/index.xml
+++ b/eiffel/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Eiffel Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:43Z
+ 2023-10-11T01:28:45Z
Daily Trending of Eiffel in GitHub
\ No newline at end of file
diff --git a/ejs/daily/index.xml b/ejs/daily/index.xml
index 6456a6636eb..1fc6398dba1 100644
--- a/ejs/daily/index.xml
+++ b/ejs/daily/index.xml
@@ -1,7 +1,7 @@
GitHub EJS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:47Z
+ 2023-10-11T01:28:50Z
Daily Trending of EJS in GitHub
\ No newline at end of file
diff --git a/elixir/daily/index.xml b/elixir/daily/index.xml
index 0dbdfec91e0..5a9dcd779df 100644
--- a/elixir/daily/index.xml
+++ b/elixir/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Elixir Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:51Z
+ 2023-10-11T01:28:53Z
Daily Trending of Elixir in GitHub
+
+ aesmail/kaffy
+ 2023-10-11T01:28:53Z
+ tag:github.com,2023-10-11:/aesmail/kaffy
+
+ <p>Powerfully simple admin package for phoenix applications</p><hr>
+
\ No newline at end of file
diff --git a/elm/daily/index.xml b/elm/daily/index.xml
index 2cadcebd5d9..0a8e198e8ac 100644
--- a/elm/daily/index.xml
+++ b/elm/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Elm Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:45Z
+ 2023-10-11T01:28:54Z
Daily Trending of Elm in GitHub
\ No newline at end of file
diff --git a/emacs-lisp/daily/index.xml b/emacs-lisp/daily/index.xml
index 36b4cab5c66..199c0872e54 100644
--- a/emacs-lisp/daily/index.xml
+++ b/emacs-lisp/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Emacs Lisp Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:58Z
+ 2023-10-11T01:29:00Z
Daily Trending of Emacs Lisp in GitHub
\ No newline at end of file
diff --git a/emberscript/daily/index.xml b/emberscript/daily/index.xml
index 4dd0ef12587..42f0144e0f7 100644
--- a/emberscript/daily/index.xml
+++ b/emberscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub EmberScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:28:54Z
+ 2023-10-11T01:28:57Z
Daily Trending of EmberScript in GitHub
\ No newline at end of file
diff --git a/eq/daily/index.xml b/eq/daily/index.xml
index 75cd6537df3..480cbdc783e 100644
--- a/eq/daily/index.xml
+++ b/eq/daily/index.xml
@@ -1,7 +1,7 @@
GitHub EQ Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:08Z
+ 2023-10-11T01:29:10Z
Daily Trending of EQ in GitHub
\ No newline at end of file
diff --git a/erlang/daily/index.xml b/erlang/daily/index.xml
index bc35ceafaa5..80514f70430 100644
--- a/erlang/daily/index.xml
+++ b/erlang/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Erlang Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:13Z
+ 2023-10-11T01:29:14Z
Daily Trending of Erlang in GitHub
+
+ ur5r/barsoom_app
+ 2023-10-11T01:29:14Z
+ tag:github.com,2023-10-11:/ur5r/barsoom_app
+
+ <p>Web-Machine Sample Application runs on windows 7 Erlang R16A</p><hr>
+
\ No newline at end of file
diff --git a/euphoria/daily/index.xml b/euphoria/daily/index.xml
index 80005a438e2..fa3e13aa047 100644
--- a/euphoria/daily/index.xml
+++ b/euphoria/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Euphoria Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:10Z
+ 2023-10-11T01:29:10Z
Daily Trending of Euphoria in GitHub
\ No newline at end of file
diff --git a/f%23/daily/index.xml b/f%23/daily/index.xml
index 8cd019572bd..eb8ca890025 100644
--- a/f%23/daily/index.xml
+++ b/f%23/daily/index.xml
@@ -1,7 +1,7 @@
GitHub F# Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:13Z
+ 2023-10-11T01:29:14Z
Daily Trending of F# in GitHub
\ No newline at end of file
diff --git a/f*/daily/index.xml b/f*/daily/index.xml
index 6fefbc4610b..515d0f93263 100644
--- a/f*/daily/index.xml
+++ b/f*/daily/index.xml
@@ -1,7 +1,7 @@
GitHub F* Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:16Z
+ 2023-10-11T01:29:16Z
Daily Trending of F* in GitHub
\ No newline at end of file
diff --git a/factor/daily/index.xml b/factor/daily/index.xml
index 7edde6b6faf..4cd169e3e0b 100644
--- a/factor/daily/index.xml
+++ b/factor/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Factor Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:18Z
+ 2023-10-11T01:29:18Z
Daily Trending of Factor in GitHub
\ No newline at end of file
diff --git a/fancy/daily/index.xml b/fancy/daily/index.xml
index f8c83cba4ba..da541c8a110 100644
--- a/fancy/daily/index.xml
+++ b/fancy/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Fancy Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:15Z
+ 2023-10-11T01:29:18Z
Daily Trending of Fancy in GitHub
\ No newline at end of file
diff --git a/fantom/daily/index.xml b/fantom/daily/index.xml
index 599eddb46f1..390c1f36b06 100644
--- a/fantom/daily/index.xml
+++ b/fantom/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Fantom Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:17Z
+ 2023-10-11T01:29:17Z
Daily Trending of Fantom in GitHub
\ No newline at end of file
diff --git a/faust/daily/index.xml b/faust/daily/index.xml
index 3895b908d53..9372235168c 100644
--- a/faust/daily/index.xml
+++ b/faust/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Faust Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:20Z
+ 2023-10-11T01:29:21Z
Daily Trending of Faust in GitHub
\ No newline at end of file
diff --git a/fennel/daily/index.xml b/fennel/daily/index.xml
index 142d82d2b74..1999ecba60e 100644
--- a/fennel/daily/index.xml
+++ b/fennel/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Fennel Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:21Z
+ 2023-10-11T01:29:21Z
Daily Trending of Fennel in GitHub
\ No newline at end of file
diff --git a/figlet-font/daily/index.xml b/figlet-font/daily/index.xml
index aad09dce085..77130f576e7 100644
--- a/figlet-font/daily/index.xml
+++ b/figlet-font/daily/index.xml
@@ -1,7 +1,7 @@
GitHub FIGlet Font Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:19Z
+ 2023-10-11T01:29:22Z
Daily Trending of FIGlet Font in GitHub
\ No newline at end of file
diff --git a/filebench-wml/daily/index.xml b/filebench-wml/daily/index.xml
index 29651578dc3..bba60553af7 100644
--- a/filebench-wml/daily/index.xml
+++ b/filebench-wml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Filebench WML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:22Z
+ 2023-10-11T01:29:20Z
Daily Trending of Filebench WML in GitHub
\ No newline at end of file
diff --git a/filterscript/daily/index.xml b/filterscript/daily/index.xml
index 3f716991bd9..6296799d60b 100644
--- a/filterscript/daily/index.xml
+++ b/filterscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Filterscript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:24Z
+ 2023-10-11T01:29:25Z
Daily Trending of Filterscript in GitHub
\ No newline at end of file
diff --git a/fish/daily/index.xml b/fish/daily/index.xml
index 3e0e4589fc3..bbf75387302 100644
--- a/fish/daily/index.xml
+++ b/fish/daily/index.xml
@@ -1,7 +1,7 @@
GitHub fish Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:26Z
+ 2023-10-11T01:29:23Z
Daily Trending of fish in GitHub
\ No newline at end of file
diff --git a/fluent/daily/index.xml b/fluent/daily/index.xml
index 0738832ba9f..fe18cd31947 100644
--- a/fluent/daily/index.xml
+++ b/fluent/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Fluent Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:23Z
+ 2023-10-11T01:29:26Z
Daily Trending of Fluent in GitHub
\ No newline at end of file
diff --git a/flux/daily/index.xml b/flux/daily/index.xml
index 67bfb23caf8..59acc66677e 100644
--- a/flux/daily/index.xml
+++ b/flux/daily/index.xml
@@ -1,7 +1,7 @@
GitHub FLUX Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:25Z
+ 2023-10-11T01:29:24Z
Daily Trending of FLUX in GitHub
\ No newline at end of file
diff --git a/formatted/daily/index.xml b/formatted/daily/index.xml
index b0678116410..af19dcfe373 100644
--- a/formatted/daily/index.xml
+++ b/formatted/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Formatted Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:28Z
+ 2023-10-11T01:29:28Z
Daily Trending of Formatted in GitHub
\ No newline at end of file
diff --git a/forth/daily/index.xml b/forth/daily/index.xml
index 7b1d51032fa..7d5bf15fe49 100644
--- a/forth/daily/index.xml
+++ b/forth/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Forth Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:29Z
+ 2023-10-11T01:29:29Z
Daily Trending of Forth in GitHub
\ No newline at end of file
diff --git a/fortran-free-form/daily/index.xml b/fortran-free-form/daily/index.xml
index d25050c3e0c..5cde9f9fde6 100644
--- a/fortran-free-form/daily/index.xml
+++ b/fortran-free-form/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Fortran Free Form Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:27Z
+ 2023-10-11T01:29:27Z
Daily Trending of Fortran Free Form in GitHub
\ No newline at end of file
diff --git a/fortran/daily/index.xml b/fortran/daily/index.xml
index c62b758a89c..2d31d12e44e 100644
--- a/fortran/daily/index.xml
+++ b/fortran/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Fortran Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:32Z
+ 2023-10-11T01:29:32Z
Daily Trending of Fortran in GitHub
\ No newline at end of file
diff --git a/freebasic/daily/index.xml b/freebasic/daily/index.xml
index c8118a1be7e..4d8c4d0d75f 100644
--- a/freebasic/daily/index.xml
+++ b/freebasic/daily/index.xml
@@ -1,7 +1,7 @@
GitHub FreeBasic Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:36Z
+ 2023-10-11T01:29:34Z
Daily Trending of FreeBasic in GitHub
\ No newline at end of file
diff --git a/freemarker/daily/index.xml b/freemarker/daily/index.xml
index 9b6ff6cf834..16aae510841 100644
--- a/freemarker/daily/index.xml
+++ b/freemarker/daily/index.xml
@@ -1,7 +1,7 @@
GitHub FreeMarker Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:34Z
+ 2023-10-11T01:29:35Z
Daily Trending of FreeMarker in GitHub
\ No newline at end of file
diff --git a/frege/daily/index.xml b/frege/daily/index.xml
index 147c7c682e7..1f006a5b3b1 100644
--- a/frege/daily/index.xml
+++ b/frege/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Frege Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:35Z
+ 2023-10-11T01:29:36Z
Daily Trending of Frege in GitHub
\ No newline at end of file
diff --git a/futhark/daily/index.xml b/futhark/daily/index.xml
index b70114eb8ae..cd9ec67adb9 100644
--- a/futhark/daily/index.xml
+++ b/futhark/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Futhark Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:33Z
+ 2023-10-11T01:29:33Z
Daily Trending of Futhark in GitHub
\ No newline at end of file
diff --git a/g-code/daily/index.xml b/g-code/daily/index.xml
index f04d4f4cd4b..073feec4783 100644
--- a/g-code/daily/index.xml
+++ b/g-code/daily/index.xml
@@ -1,7 +1,7 @@
GitHub G-code Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:39Z
+ 2023-10-11T01:29:38Z
Daily Trending of G-code in GitHub
\ No newline at end of file
diff --git a/game-maker-language/daily/index.xml b/game-maker-language/daily/index.xml
index aec43402ff4..a53f907e4a2 100644
--- a/game-maker-language/daily/index.xml
+++ b/game-maker-language/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Game Maker Language Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:38Z
+ 2023-10-11T01:29:39Z
Daily Trending of Game Maker Language in GitHub
\ No newline at end of file
diff --git a/gaml/daily/index.xml b/gaml/daily/index.xml
index ae7a02ee2bb..29f81a1abba 100644
--- a/gaml/daily/index.xml
+++ b/gaml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub GAML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:40Z
+ 2023-10-11T01:29:37Z
Daily Trending of GAML in GitHub
\ No newline at end of file
diff --git a/gams/daily/index.xml b/gams/daily/index.xml
index 04394b4c2b4..614ede777a4 100644
--- a/gams/daily/index.xml
+++ b/gams/daily/index.xml
@@ -1,7 +1,7 @@
GitHub GAMS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:39Z
+ 2023-10-11T01:29:39Z
Daily Trending of GAMS in GitHub
\ No newline at end of file
diff --git a/gap/daily/index.xml b/gap/daily/index.xml
index 38a3b1f5a2e..a81c1a90573 100644
--- a/gap/daily/index.xml
+++ b/gap/daily/index.xml
@@ -1,7 +1,7 @@
GitHub GAP Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:42Z
+ 2023-10-11T01:29:42Z
Daily Trending of GAP in GitHub
\ No newline at end of file
diff --git a/gcc-machine-description/daily/index.xml b/gcc-machine-description/daily/index.xml
index 73a67b0e36e..5537fe15582 100644
--- a/gcc-machine-description/daily/index.xml
+++ b/gcc-machine-description/daily/index.xml
@@ -1,7 +1,7 @@
GitHub GCC Machine Description Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:42Z
+ 2023-10-11T01:29:41Z
Daily Trending of GCC Machine Description in GitHub
\ No newline at end of file
diff --git a/gdb/daily/index.xml b/gdb/daily/index.xml
index 7dc7419467a..ef96a294cfe 100644
--- a/gdb/daily/index.xml
+++ b/gdb/daily/index.xml
@@ -1,7 +1,7 @@
GitHub GDB Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:43Z
+ 2023-10-11T01:29:41Z
Daily Trending of GDB in GitHub
\ No newline at end of file
diff --git a/gdscript/daily/index.xml b/gdscript/daily/index.xml
index cc7c3ae115a..a565f158b90 100644
--- a/gdscript/daily/index.xml
+++ b/gdscript/daily/index.xml
@@ -1,14 +1,21 @@
GitHub GDScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:46Z
+ 2023-10-11T01:29:45Z
Daily Trending of GDScript in GitHub
- raffomania/spooky-shady-skeletons
- 2023-10-10T01:29:46Z
- tag:github.com,2023-10-10:/raffomania/spooky-shady-skeletons
-
- <p></p><hr>
+ doofmars/ssp-online
+ 2023-10-11T01:29:45Z
+ tag:github.com,2023-10-11:/doofmars/ssp-online
+
+ <p>A simple rps-online clone in godot</p><hr>
+
+
+ dandeliondino/terrain-autotiler
+ 2023-10-11T01:29:45Z
+ tag:github.com,2023-10-11:/dandeliondino/terrain-autotiler
+
+ <p>An advanced terrain tile matching algorithm for Godot 4.</p><hr>
\ No newline at end of file
diff --git a/gedcom/daily/index.xml b/gedcom/daily/index.xml
index f6adf6d4de1..ed921bffb61 100644
--- a/gedcom/daily/index.xml
+++ b/gedcom/daily/index.xml
@@ -1,7 +1,7 @@
GitHub GEDCOM Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:49Z
+ 2023-10-11T01:29:46Z
Daily Trending of GEDCOM in GitHub
\ No newline at end of file
diff --git a/gemfile.lock/daily/index.xml b/gemfile.lock/daily/index.xml
index 4e6f707ae3f..cd194d3bdb0 100644
--- a/gemfile.lock/daily/index.xml
+++ b/gemfile.lock/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Gemfile.lock Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:48Z
+ 2023-10-11T01:29:47Z
Daily Trending of Gemfile.lock in GitHub
\ No newline at end of file
diff --git a/genero-forms/daily/index.xml b/genero-forms/daily/index.xml
index b04991307f5..ef88c6c2acf 100644
--- a/genero-forms/daily/index.xml
+++ b/genero-forms/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Genero Forms Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:52Z
+ 2023-10-11T01:29:52Z
Daily Trending of Genero Forms in GitHub
\ No newline at end of file
diff --git a/genero/daily/index.xml b/genero/daily/index.xml
index 1f04d57fc7c..3fd79f53646 100644
--- a/genero/daily/index.xml
+++ b/genero/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Genero Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:50Z
+ 2023-10-11T01:29:49Z
Daily Trending of Genero in GitHub
\ No newline at end of file
diff --git a/genie/daily/index.xml b/genie/daily/index.xml
index 5d3579c3118..a99efdf8763 100644
--- a/genie/daily/index.xml
+++ b/genie/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Genie Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:51Z
+ 2023-10-11T01:29:50Z
Daily Trending of Genie in GitHub
\ No newline at end of file
diff --git a/genshi/daily/index.xml b/genshi/daily/index.xml
index c03df57d912..8ad5f040e7b 100644
--- a/genshi/daily/index.xml
+++ b/genshi/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Genshi Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:54Z
+ 2023-10-11T01:29:53Z
Daily Trending of Genshi in GitHub
\ No newline at end of file
diff --git a/gentoo-ebuild/daily/index.xml b/gentoo-ebuild/daily/index.xml
index c5131c3d506..bbee7203661 100644
--- a/gentoo-ebuild/daily/index.xml
+++ b/gentoo-ebuild/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Gentoo Ebuild Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:53Z
+ 2023-10-11T01:29:51Z
Daily Trending of Gentoo Ebuild in GitHub
\ No newline at end of file
diff --git a/gentoo-eclass/daily/index.xml b/gentoo-eclass/daily/index.xml
index 96e25b1c33e..03b341e7d32 100644
--- a/gentoo-eclass/daily/index.xml
+++ b/gentoo-eclass/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Gentoo Eclass Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:55Z
+ 2023-10-11T01:29:56Z
Daily Trending of Gentoo Eclass in GitHub
\ No newline at end of file
diff --git a/gerber-image/daily/index.xml b/gerber-image/daily/index.xml
index 9c060e4eae0..b3ee7b7550f 100644
--- a/gerber-image/daily/index.xml
+++ b/gerber-image/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Gerber Image Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:57Z
+ 2023-10-11T01:29:57Z
Daily Trending of Gerber Image in GitHub
\ No newline at end of file
diff --git a/gettext-catalog/daily/index.xml b/gettext-catalog/daily/index.xml
index 45c9c88f669..ca44efe0d03 100644
--- a/gettext-catalog/daily/index.xml
+++ b/gettext-catalog/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Gettext Catalog Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:56Z
+ 2023-10-11T01:29:54Z
Daily Trending of Gettext Catalog in GitHub
\ No newline at end of file
diff --git a/gherkin/daily/index.xml b/gherkin/daily/index.xml
index 1356bc95dcf..afc8d7afefa 100644
--- a/gherkin/daily/index.xml
+++ b/gherkin/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Gherkin Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:29:58Z
+ 2023-10-11T01:29:55Z
Daily Trending of Gherkin in GitHub
\ No newline at end of file
diff --git a/git-attributes/daily/index.xml b/git-attributes/daily/index.xml
index 8eace3bfdda..a7ba3dcea9f 100644
--- a/git-attributes/daily/index.xml
+++ b/git-attributes/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Git Attributes Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:00Z
+ 2023-10-11T01:29:59Z
Daily Trending of Git Attributes in GitHub
\ No newline at end of file
diff --git a/git-config/daily/index.xml b/git-config/daily/index.xml
index 602359d22df..84b8dda2515 100644
--- a/git-config/daily/index.xml
+++ b/git-config/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Git Config Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:01Z
+ 2023-10-11T01:29:58Z
Daily Trending of Git Config in GitHub
\ No newline at end of file
diff --git a/gleam/daily/index.xml b/gleam/daily/index.xml
index 7c9dada523c..d53f21d65aa 100644
--- a/gleam/daily/index.xml
+++ b/gleam/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Gleam Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:02Z
+ 2023-10-11T01:30:00Z
Daily Trending of Gleam in GitHub
\ No newline at end of file
diff --git a/glsl/daily/index.xml b/glsl/daily/index.xml
index 892d55c20da..4ef37e6a438 100644
--- a/glsl/daily/index.xml
+++ b/glsl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub GLSL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:07Z
+ 2023-10-11T01:30:05Z
Daily Trending of GLSL in GitHub
\ No newline at end of file
diff --git a/glyph-bitmap-distribution-format/daily/index.xml b/glyph-bitmap-distribution-format/daily/index.xml
index f589d3137cd..e3b77cd1815 100644
--- a/glyph-bitmap-distribution-format/daily/index.xml
+++ b/glyph-bitmap-distribution-format/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Glyph Bitmap Distribution Format Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:03Z
+ 2023-10-11T01:30:03Z
Daily Trending of Glyph Bitmap Distribution Format in GitHub
\ No newline at end of file
diff --git a/glyph/daily/index.xml b/glyph/daily/index.xml
index 1a782847a77..5114d71f9ef 100644
--- a/glyph/daily/index.xml
+++ b/glyph/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Glyph Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:05Z
+ 2023-10-11T01:30:02Z
Daily Trending of Glyph in GitHub
\ No newline at end of file
diff --git a/gn/daily/index.xml b/gn/daily/index.xml
index 3198fba7966..30a18378866 100644
--- a/gn/daily/index.xml
+++ b/gn/daily/index.xml
@@ -1,7 +1,7 @@
GitHub GN Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:04Z
+ 2023-10-11T01:30:03Z
Daily Trending of GN in GitHub
\ No newline at end of file
diff --git a/gnuplot/daily/index.xml b/gnuplot/daily/index.xml
index 7018771c06d..d71b325b102 100644
--- a/gnuplot/daily/index.xml
+++ b/gnuplot/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Gnuplot Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:10Z
+ 2023-10-11T01:30:07Z
Daily Trending of Gnuplot in GitHub
\ No newline at end of file
diff --git a/go-checksums/daily/index.xml b/go-checksums/daily/index.xml
index a0ecb3db4cb..063d1659ebd 100644
--- a/go-checksums/daily/index.xml
+++ b/go-checksums/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Go Checksums Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:09Z
+ 2023-10-11T01:30:08Z
Daily Trending of Go Checksums in GitHub
\ No newline at end of file
diff --git a/go-module/daily/index.xml b/go-module/daily/index.xml
index 07f70d18e6e..c6fa3cbc060 100644
--- a/go-module/daily/index.xml
+++ b/go-module/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Go Module Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:08Z
+ 2023-10-11T01:30:06Z
Daily Trending of Go Module in GitHub
\ No newline at end of file
diff --git a/go/daily/index.xml b/go/daily/index.xml
index 5d5d3d688ff..44dc0008b76 100644
--- a/go/daily/index.xml
+++ b/go/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Go Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:13Z
+ 2023-10-11T01:30:12Z
Daily Trending of Go in GitHub
+
+ Azure/azure-container-networking
+ 2023-10-11T01:30:12Z
+ tag:github.com,2023-10-11:/Azure/azure-container-networking
+
+ <p>Azure Container Networking Solutions for Linux and Windows Containers</p><hr><h1>Microsoft Azure Container Networking</h1>
<p><a href="https://msazure.visualstudio.com/One/_build/latest?definitionId=95007&branchName=master"><img src="https://msazure.visualstudio.com/One/_apis/build/status/Custom/Networking/ContainerNetworking/Azure.azure-container-networking?branchName=master" alt="Build Status"></a> <a href="https://goreportcard.com/report/github.com/Azure/azure-container-networking"><img src="https://goreportcard.com/badge/github.com/Azure/azure-container-networking" alt="Go Report Card"></a> <img src="https://img.shields.io/github/release/Azure/azure-container-networking.svg?sanitize=true" alt="GitHub release"></p>
<table>
<thead>
<tr>
<th>Azure Network Policy Manager Conformance</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>Cyclonus Network Policy Suite</td>
<td><a href="https://github.com/Azure/azure-container-networking/actions/workflows/cyclonus-netpol-test.yaml"><img src="https://github.com/Azure/azure-container-networking/actions/workflows/cyclonus-netpol-test.yaml/badge.svg?branch=master" alt="Cyclonus Network Policy Test"></a></td>
</tr>
<tr>
<td>Kubernetes Network Policy E2E</td>
<td><a href="https://dev.azure.com/msazure/One/_build/latest?definitionId=195725&branchName=master"><img src="https://dev.azure.com/msazure/One/_apis/build/status/Custom/Networking/ContainerNetworking/NPM%20Conformance%20Tests?branchName=master" alt="Build Status"></a></td>
</tr>
</tbody>
</table>
<h2>Overview</h2>
<p>This repository contains container networking services and plugins for Linux and Windows containers running on Azure:</p>
<ul>
<li><a href="https://raw.githubusercontent.com/Azure/azure-container-networking/master/docs/cni.md">Azure CNI network and IPAM plugins</a> for Kubernetes.</li>
<li><a href="https://raw.githubusercontent.com/Azure/azure-container-networking/master/docs/cnm.md">Azure CNM (libnetwork) network and IPAM plugins</a> for Docker Engine. <strong>(MAINTENANCE MODE)</strong></li>
<li><a href="https://raw.githubusercontent.com/Azure/azure-container-networking/master/docs/npm.md">Azure NPM - Kubernetes Network Policy Manager</a> (Linux and (preview) Windows Server 2022)</li>
</ul>
<p>The <code>azure-vnet</code> network plugins connect containers to your <a href="https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-overview">Azure VNET</a>, to take advantage of Azure SDN capabilities. The <code>azure-vnet-ipam</code> IPAM plugins provide address management functionality for container IP addresses allocated from Azure VNET address space.</p>
<p>The following environments are supported:</p>
<ul>
<li><a href="https://azure.microsoft.com">Microsoft Azure</a>: Available in all Azure regions.</li>
</ul>
<p>Plugins are offered as part of <a href="https://docs.microsoft.com/en-us/azure/aks/">Azure Kubernetes Service (AKS)</a>, as well as for individual Azure IaaS VMs. For Kubernetes clusters created by <a href="https://github.com/Azure/aks-engine">aks-engine</a>, the deployment and configuration of both plugins on both Linux and Windows nodes is automatic and default.</p>
<p>The next generation of Azure CNI Plugin is powered by <a href="https://cilium.io/">Cilium</a>. Learn more at <a href="https://raw.githubusercontent.com/Azure/azure-container-networking/master/docs/cilium.md">Azure CNI Powered By Cilium</a></p>
<h2>Documentation</h2>
<p>See <a href="https://raw.githubusercontent.com/Azure/azure-container-networking/master/docs/">Documentation</a> for more information and examples.</p>
<h2>Build</h2>
<p>This repository builds on Windows and Linux. Build plugins directly from the source code for the latest version.</p>
<pre><code class="language-bash">$ git clone https://github.com/Azure/azure-container-networking
$ cd azure-container-networking
$ make all-binaries
</code></pre>
<p>Then follow the instructions for the plugin in <a href="https://raw.githubusercontent.com/Azure/azure-container-networking/master/docs/">Documentation</a>.</p>
<h2>Contributions</h2>
<p>Contributions in the form of bug reports, feature requests and PRs are always welcome.</p>
<p>Please follow these steps before submitting a PR:</p>
<ul>
<li>Create an issue describing the bug or feature request.</li>
<li>Clone the repository and create a topic branch.</li>
<li>Make changes, adding new tests for new functionality.</li>
<li>Submit a PR.</li>
</ul>
<h2>License</h2>
<p>See <a href="https://raw.githubusercontent.com/Azure/azure-container-networking/master/LICENSE">LICENSE</a>.</p>
<h2>Code of Conduct</h2>
<p>This project has adopted the <a href="https://opensource.microsoft.com/codeofconduct/">Microsoft Open Source Code of Conduct</a>. For more information see the <a href="https://opensource.microsoft.com/codeofconduct/faq/">Code of Conduct FAQ</a> or contact <a href="mailto:opencode@microsoft.com">opencode@microsoft.com</a> with any additional questions or comments.</p>
+
\ No newline at end of file
diff --git a/golo/daily/index.xml b/golo/daily/index.xml
index 181ad26ca35..f80bf3ddb38 100644
--- a/golo/daily/index.xml
+++ b/golo/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Golo Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:23Z
+ 2023-10-11T01:30:27Z
Daily Trending of Golo in GitHub
\ No newline at end of file
diff --git a/gosu/daily/index.xml b/gosu/daily/index.xml
index 660e8c1d567..944a685ac86 100644
--- a/gosu/daily/index.xml
+++ b/gosu/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Gosu Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:25Z
+ 2023-10-11T01:30:25Z
Daily Trending of Gosu in GitHub
\ No newline at end of file
diff --git a/grace/daily/index.xml b/grace/daily/index.xml
index f538a689330..388cdd0c814 100644
--- a/grace/daily/index.xml
+++ b/grace/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Grace Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:27Z
+ 2023-10-11T01:30:30Z
Daily Trending of Grace in GitHub
\ No newline at end of file
diff --git a/gradle/daily/index.xml b/gradle/daily/index.xml
index bf8fc5af9cf..48af767dedf 100644
--- a/gradle/daily/index.xml
+++ b/gradle/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Gradle Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:27Z
+ 2023-10-11T01:30:29Z
Daily Trending of Gradle in GitHub
\ No newline at end of file
diff --git a/grammatical-framework/daily/index.xml b/grammatical-framework/daily/index.xml
index cc994592ef8..51dafd2637a 100644
--- a/grammatical-framework/daily/index.xml
+++ b/grammatical-framework/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Grammatical Framework Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:28Z
+ 2023-10-11T01:30:31Z
Daily Trending of Grammatical Framework in GitHub
\ No newline at end of file
diff --git a/graph-modeling-language/daily/index.xml b/graph-modeling-language/daily/index.xml
index 32a2b3579c8..9f9628b788e 100644
--- a/graph-modeling-language/daily/index.xml
+++ b/graph-modeling-language/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Graph Modeling Language Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:32Z
+ 2023-10-11T01:30:32Z
Daily Trending of Graph Modeling Language in GitHub
\ No newline at end of file
diff --git a/graphql/daily/index.xml b/graphql/daily/index.xml
index 054a17f4e8c..c135ae44a33 100644
--- a/graphql/daily/index.xml
+++ b/graphql/daily/index.xml
@@ -1,7 +1,7 @@
GitHub GraphQL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:30Z
+ 2023-10-11T01:30:33Z
Daily Trending of GraphQL in GitHub
\ No newline at end of file
diff --git a/graphviz-(dot)/daily/index.xml b/graphviz-(dot)/daily/index.xml
index 314384b97dd..1da338ba80a 100644
--- a/graphviz-(dot)/daily/index.xml
+++ b/graphviz-(dot)/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Graphviz (DOT) Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:31Z
+ 2023-10-11T01:30:34Z
Daily Trending of Graphviz (DOT) in GitHub
\ No newline at end of file
diff --git a/groovy-server-pages/daily/index.xml b/groovy-server-pages/daily/index.xml
index f1909753091..2fc53835485 100644
--- a/groovy-server-pages/daily/index.xml
+++ b/groovy-server-pages/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Groovy Server Pages Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:36Z
+ 2023-10-11T01:30:40Z
Daily Trending of Groovy Server Pages in GitHub
\ No newline at end of file
diff --git a/groovy/daily/index.xml b/groovy/daily/index.xml
index c3f6be41656..6ace7a7c515 100644
--- a/groovy/daily/index.xml
+++ b/groovy/daily/index.xml
@@ -1,21 +1,7 @@
GitHub Groovy Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:34Z
+ 2023-10-11T01:30:37Z
Daily Trending of Groovy in GitHub
-
- geb/geb-seconf-2012-slides
- 2023-10-10T01:30:34Z
- tag:github.com,2023-10-10:/geb/geb-seconf-2012-slides
-
- <p></p><hr>
-
-
- d3scomp/NPRG014
- 2023-10-10T01:30:34Z
- tag:github.com,2023-10-10:/d3scomp/NPRG014
-
- <p>Supplementary materials for the course of "Concepts of Modern Programming Languages" (NPRG014) taught at Charles University, Prague, Czech Republic.</p><hr>
-
\ No newline at end of file
diff --git a/gsc/daily/index.xml b/gsc/daily/index.xml
index 0306f40e593..47eda0edf77 100644
--- a/gsc/daily/index.xml
+++ b/gsc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub GSC Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:35Z
+ 2023-10-11T01:30:39Z
Daily Trending of GSC in GitHub
\ No newline at end of file
diff --git a/hack/daily/index.xml b/hack/daily/index.xml
index 801aed2e6bb..3485132855d 100644
--- a/hack/daily/index.xml
+++ b/hack/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Hack Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:37Z
+ 2023-10-11T01:30:41Z
Daily Trending of Hack in GitHub
\ No newline at end of file
diff --git a/haml/daily/index.xml b/haml/daily/index.xml
index 46ff768986c..fa034fd9136 100644
--- a/haml/daily/index.xml
+++ b/haml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Haml Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:36Z
+ 2023-10-11T01:30:38Z
Daily Trending of Haml in GitHub
\ No newline at end of file
diff --git a/handlebars/daily/index.xml b/handlebars/daily/index.xml
index ec6e14a4d9e..e4c4d921ae5 100644
--- a/handlebars/daily/index.xml
+++ b/handlebars/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Handlebars Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:40Z
+ 2023-10-11T01:30:45Z
Daily Trending of Handlebars in GitHub
+
+ nlad218/ShredNStyle
+ 2023-10-11T01:30:45Z
+ tag:github.com,2023-10-11:/nlad218/ShredNStyle
+
+ <p></p><hr>
+
\ No newline at end of file
diff --git a/haproxy/daily/index.xml b/haproxy/daily/index.xml
index 2249eb25d77..47dfd19e7f3 100644
--- a/haproxy/daily/index.xml
+++ b/haproxy/daily/index.xml
@@ -1,7 +1,7 @@
GitHub HAProxy Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:39Z
+ 2023-10-11T01:30:42Z
Daily Trending of HAProxy in GitHub
\ No newline at end of file
diff --git a/harbour/daily/index.xml b/harbour/daily/index.xml
index 4171bd59248..d4206f9c763 100644
--- a/harbour/daily/index.xml
+++ b/harbour/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Harbour Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:41Z
+ 2023-10-11T01:30:43Z
Daily Trending of Harbour in GitHub
\ No newline at end of file
diff --git a/haskell/daily/index.xml b/haskell/daily/index.xml
index 4c82393ce39..a51aa70e99e 100644
--- a/haskell/daily/index.xml
+++ b/haskell/daily/index.xml
@@ -1,7 +1,28 @@
GitHub Haskell Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:44Z
+ 2023-10-11T01:30:48Z
Daily Trending of Haskell in GitHub
+
+ Zelenya/elephants
+ 2023-10-11T01:30:48Z
+ tag:github.com,2023-10-11:/Zelenya/elephants
+
+ <p></p><hr><h1>How to use PostgreSQL with Haskell. Elephantine Library Review 2023</h1>
<p>As of October 2023, there are around a dozen mature PostgreSQL libraries, all levels of abstractions, from low-level queries to the type level. More than enough for anybody. <em>(Shout out to everyone who says Haskell has no libraries.)</em></p>
<p>Which one to use? Let’s see. Foreach library, we’ll talk about features and basics like writing queries, complexity, pitfalls, (everyone’s favorite topic) errors, and so on.</p>
<p><em>We assume you are familiar with the fundamentals of SQL and PostgreSQL.</em></p>
<h2>Mise en place</h2>
<p>Before integrating with the database, let’s discuss the data and the setup.</p>
<blockquote>
<p>💡 If you want to follow allow at home, the <a href="https://github.com/Zelenya/elephants">repository</a> contains all the imports and data types — we omit most of them from the tutorial for simplicity.</p>
</blockquote>
<h3>Data</h3>
<p>Let’s imagine that we’re building a (tiny) warehouse management system:</p>
<ul>
<li><strong>Warehouse</strong> has multiple <strong>products</strong>, some quantity of each.</li>
<li><strong>Product</strong> has a label and a description.</li>
<li><strong>Product</strong> can belong to <strong>categories</strong> (<em>many-to-many</em>).</li>
<li><strong>Category</strong> has a label.</li>
</ul>
<p>The <code>scripts/create_tables.sql</code> contains all the definitions:</p>
<pre><code class="language-sql">CREATE TABLE product (
id SERIAL PRIMARY KEY,
label TEXT NOT NULL,
description TEXT,
UNIQUE (label)
);
CREATE TABLE category (
id SERIAL PRIMARY KEY,
label TEXT NOT NULL,
UNIQUE (label)
);
CREATE TABLE product_category (
category_id INT NOT NULL,
product_id INT NOT NULL,
PRIMARY KEY (category_id, product_id),
FOREIGN KEY (product_id) REFERENCES product(id),
FOREIGN KEY (category_id) REFERENCES category(id)
);
CREATE TABLE warehouse (
id SERIAL PRIMARY KEY,
product_id INT NOT NULL,
quantity INT NOT NULL,
created TIMESTAMP,
modified TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES product(id)
);
</code></pre>
<p><img src="https://github.com/Zelenya/elephants/assets/11508062/92f8e097-a5c5-427f-b848-76d6edc23e7b" alt="schema"></p>
<h3>Postgres server</h3>
<p>Here are a few things you need to know to play along at home.</p>
<blockquote>
<p>🐘 If you don’t care, don’t like docker, or already have an easily-accessible postgres server, feel free to skip this section.</p>
</blockquote>
<p>First, install docker.</p>
<p><code>docker compose up</code> (<code>docker-compose up</code> on older versions) starts <a href="https://hub.docker.com/_/postgres">PostgreSQL</a> (see <code>docker-compose.yml</code>) and initializes the databases and tables (using the <code>scripts/create_tables.sql</code>). It mounts the data to the <code>postgres-data/</code> (in case you need to wipe it or something).</p>
<p>Some of the hardcoded things that the code relies on:</p>
<pre><code class="language-docker">environment:
- POSTGRES_DB=warehouse
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
ports:
- 5432:5432
</code></pre>
<blockquote>
<p>💡 These hardcoded values are also hardcoded in the code in <code>Hardcoded.hs</code> (for laziness reasons)</p>
</blockquote>
<p>You can connect to the container and run arbitrary queries using <code>psql</code>:</p>
<pre><code class="language-bash">docker exec -it elephants-postgres-1 psql -U postgres -d warehouse
</code></pre>
<p><strong>Note:</strong> <code>elephants-postgres-1</code> is a container name, which might be different for you; check with <code>docker ps</code> to get the correct container id (or name). We also pass a couple of flags: <code>-U postgres</code> for the user name and <code>-d warehouse</code> for the database name.</p>
<p><code>docker compose down</code> to stop and remove the containers.</p>
<h3>Project Overview</h3>
<p>If you have <code>stack</code> <a href="https://www.haskell.org/ghcup/install/#how-to-install">installed</a>, <code>stack build</code> to build and <code>stack run</code> to run.</p>
<blockquote>
<p>💡 We use <a href="https://www.stackage.org/lts-21.7">lts-21.7</a> (ghc-9.4.5), published on 2023-08-14.</p>
</blockquote>
<blockquote>
<p>🤷 To build the backend, you might need the <code>libpq</code> development libraries installed (e.g., <code>libpq-dev</code> on Debian-based distributions).</p>
</blockquote>
<h3>Extensions overview</h3>
<p>Note that most of the libraries rely on using various extensions. Here is a quick overview of the most important ones.</p>
<hr>
<p><code>OverloadedStrings</code></p>
<p>Used to simplify the construction of query values — we can use literal strings, like <code>"SELECT * FROM user"</code>, instead of manually constructing the whole type; for example, <code>Query . toByteString . stringUtf8 $ "SELECT * FROM user"</code> (see <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#t:Query">Query</a> in <code>postgresql-simple</code>).</p>
<hr>
<p><code>TemplateHaskell</code></p>
<p>Template Haskell (TH) is fairly useful for generating boilerplate code. Some libraries provide the TH machinery to derive typeclass instances and/or generate custom type-safe data types at the compile time.</p>
<hr>
<p><code>DeriveAnyClass</code> and <code>DeriveGeneric</code> enable alternative ways to get free typeclass instances.</p>
<p>We’ll use <code>DerivingStrategies</code> to make the derivation explicit, for example:</p>
<pre><code class="language-haskell">data Category = Category {label :: Text}
deriving (Show, Generic) -- Derive Generic instance,
deriving anyclass (ToRow, FromRow) -- used for these instances
</code></pre>
<hr>
<p><code>QuasiQuotes</code></p>
<p>Some libraries (e.g., <code>postgresql-simple</code>) provide quasi quoters for less tedious sql construction in Haskell code. For example:</p>
<pre><code class="language-haskell">[sql| select label from product |]
</code></pre>
<hr>
<p><code>DuplicateRecordFields</code></p>
<p>Only one postgres library requires it. But it’s a stylistic choice — we use this extension because we have multiple data types with a <code>label</code> field.</p>
<hr>
<p><code>OverloadedRecordDot</code></p>
<p>To access record fields as well as specific columns of the tables (for example, <code>product.label</code>)</p>
<hr>
<p>Note that the project uses <a href="https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/control.html#extension-GHC2021"><code>GHC2021</code></a>, which includes <a href="https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/generics.html#extension-DeriveGeneric"><code>DeriveGeneric</code></a>, <a href="https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/type_applications.html#extension-TypeApplications"><code>TypeApplications</code></a>, and many other extensions required for some libraries to work. Also, for the tutorial's sake, we’ll use the included <code>ScopedTypeVariables</code> to demonstrate some intermediate types.</p>
<h2><code>postgresql-simple</code></h2>
<p>Let’s start simple. <a href="https://hackage.haskell.org/package/postgresql-simple">postgresql-simple</a> describes itself as <em>“Mid-Level PostgreSQL client library“</em>.</p>
<p>In other words, we’ll write raw sql queries, and the library will deal with security and stuff.</p>
<p>To get started, we add <code>postgresql-simple</code> to dependencies. We’re using <code>v0.7.0.0</code> published in 2023.</p>
<h3>How to connect to a database</h3>
<p>We use <code>connect</code> to acquire a connection. It accepts <code>ConnectInfo</code>, which we can get by using <code>defaultConnectInfo</code> and overriding some defaults.</p>
<pre><code class="language-haskell">getConnection :: IO Connection
getConnection =
connect $
defaultConnectInfo
{ connectHost = Hardcoded.host
, connectDatabase = Hardcoded.database
, connectUser = Hardcoded.user
, connectPassword = Hardcoded.password
}
</code></pre>
<p>Eventually, we have to <code>close connection</code>. But you will probably not need to do it manually because you can use <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#v:withConnect"><code>withConnect</code></a>, <a href="https://hackage.haskell.org/package/base-4.18.0.0/docs/Control-Exception.html#v:bracket"><code>bracket</code></a>, or (better) a <strong>connection pool</strong>.</p>
<p>The library doesn’t support pools, but you can use the <a href="https://hackage.haskell.org/package/resource-pool">resource-pool</a> package (or something similar).</p>
<h3>How to modify data</h3>
<p>We use <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#v:execute"><code>execute</code></a> and <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#v:execute_"><code>execute_</code></a> to insert, update, and delete data.</p>
<p>The version with the <code>_</code> suffix is simpler — it doesn’t perform any query substitutions. We can use it with hardcoded values or with straightforward queries such as truncating the tables:</p>
<pre><code class="language-haskell">cleanUp :: Connection -> IO ()
cleanUp connection =
void $ execute_ connection "truncate warehouse, product_category, product, category"
</code></pre>
<p>Both <em>execute</em> functions return the number of affected rows, which isn’t relevant in case of truncate (it’s <code>0</code>) and safe to ignore (<a href="https://hackage.haskell.org/package/base-4.18.0.0/docs/Control-Monad.html#v:void"><code>void</code></a> ignores the result of evaluation).</p>
<p>We can use <code>execute</code> to make a proper insert and pass some values for substitutions. The simplest way is to pass a tuple:</p>
<pre><code class="language-haskell">insert1 <-
execute
connection
"insert into product (label, description) values (?, ?)"
("Wood Screw Kit 1" :: Text, "245-pieces" :: Text)
</code></pre>
<p>Sometimes, we must be explicit about types; for example, in cases like this, when we use string literals with <code>OverloadedStrings</code> or numeric literals (like <code>245</code>).</p>
<p>Because there is no tuple of 1, the library provides a custom type <code>Only</code>:</p>
<pre><code class="language-haskell">insert2 <-
execute
connection
"insert into product (label) values (?)"
(Only "Wood Screw Kit 2" :: Only Text)
</code></pre>
<p>Alternatively, we can use lists for any number of values:</p>
<pre><code class="language-haskell">insert3 <-
execute
connection
"insert into product (label) values (?)"
["Wood Screw Kit 3" :: Text]
</code></pre>
<p>But preferable, we use dedicated types:</p>
<pre><code class="language-haskell">execute
connection
"insert into product (label, description) values (?, ?)"
(BasicProduct "Wood Screw Kit 4" (Just "245-pieces"))
</code></pre>
<p>A record can be turned into a list of substitutions via the <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#t:ToRow"><code>ToRow</code></a> typeclass, which is derivable using GHC generics:</p>
<pre><code class="language-haskell">data BasicProduct = BasicProduct {label :: Text, description :: Maybe Text}
deriving (Show, Generic)
deriving anyclass (ToRow, FromRow)
</code></pre>
<p>If we want to modify multiple rows, we can use <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#v:executeMany"><code>executeMany</code></a>:</p>
<pre><code class="language-haskell">insert5 <-
executeMany
connection
insert into category (label) values (?)"
[Category "Screws", Category "Wood Screws", Category "Concrete Screws"]
</code></pre>
<h3>How to query data</h3>
<p>The execute functions can’t return any results (other than the number of affected rows), so we have to use the query functions.</p>
<p>Similar to <code>execute_</code>, <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#v:query_"><code>query_</code></a> takes a query with no substitutes:</p>
<pre><code class="language-haskell">query1 :: [(Int64, Text, Maybe Text)] <-
query_ connection "select id, label, description from product"
</code></pre>
<p>Note that we must be explicit about return types — the library can’t guess what we want. In this case, we expect an id of type <code>Int64</code> that corresponds to <code>Serial</code>, required <code>Text</code> label, and optional description.</p>
<p>We can specify a record return type if we derive <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#t:FromRow"><code>FromRow</code></a> (recall <code>ToRow</code> from the previous section). For example, let’s get a <code>BasicProduct</code> list by label using <code>query</code>:</p>
<pre><code class="language-haskell">query2 :: [BasicProduct] <-
query
connection
"select label, description from product where label = ? "
(Only "Wood Screw Kit 2" :: Only Text)
</code></pre>
<p>If we want to use the in-clause, the library provides a dedicated wrapper:</p>
<pre><code class="language-haskell">query3 :: [BasicProduct] <-
query connection "select label, description from product where label in ?" $
Only (In ["Wood Screw Kit 2" :: Text, "Wood Screw Kit 3"])
</code></pre>
<h3>How to use transactions</h3>
<p>Imagine we want to atomically insert a new listing: product, category, and quantity. This touches multiple tables and requires a transaction. Additionally, because we have a many-to-many relationship, we must first insert the product and category and then use their new ids to create a mapping.</p>
<p>We can use <code>returning</code> to get <code>id</code>s of created rows:</p>
<pre><code class="language-haskell">productIds :: [Only Int64] <-
query
connection
"insert into product (label, description) values (?, ?) returning id"
(BasicProduct "Drywall Screws Set" (Just "8000pcs"))
categoryIds :: [Only Int64] <-
query
connection
"insert into category (label) values (?) returning id"
(Category "Drywall Screws")
</code></pre>
<p>Note that we must use <code>query</code> and not <code>execute</code> because these queries return results.</p>
<p>We can use <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#v:withTransaction"><code>withTransaction</code></a> to wrap multiple queries in a transaction:</p>
<pre><code class="language-haskell">withTransaction connection $ do
productIds :: [Only Int64] <- query ...
categoryIds :: [Only Int64] <- query ...
void $ case (productIds, categoryIds) of
([Only productId], [Only categoryId]) -> do
_ <-
execute
connection
"insert into warehouse (product_id, quantity, created, modified) values (?, ?, now(), now())"
(productId, 10 :: Int)
execute
connection
"insert into product_category (category_id, product_id) values (?, ?)"
(categoryId, productId)
_ ->
throwIO $ userError "Failed to insert product/category"
</code></pre>
<p>Any error will rollback the transaction (and the exception will be rethrown). In this example, we throw an explicit error if we don’t get the expected ids for some reason.</p>
<p>Note that in case of a <strong>sql error</strong>, the exception will not only rollback the transaction but, if uncaught, will propagate further (killing everything on its way and potentially crashing the whole app). So, we should (at least) wrap transactions in the exception handler(s); we’ll see how to do this later.</p>
<p>When you need to, you can also use granular transaction functions: <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#v:begin">begin</a>, <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#v:commit">commit</a>, and <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#v:rollback">rollback</a>.</p>
<h3>How to query using joins</h3>
<p>To read all these tables at once, we need to query using a few joins. The library provides a quasi-quoter that makes writing big queries easier — we can format the query and not worry about whitespaces:</p>
<pre><code class="language-haskell">result :: [Listing] <-
query
connection
[sql|
select
w.quantity,
p.label,
p.description,
c.label
from warehouse as w
inner join product as p on w.product_id = p.id
left outer join product_category as pc on p.id = pc.product_id
left outer join category as c on c.id = pc.category_id
where w.quantity > (?)|]
[3 :: Int]
</code></pre>
<h3>Errors</h3>
<p>In <code>postgresql-simple</code>, all the programmer errors (in sql or library usage) are (runtime) exceptions.</p>
<p>If the query string is not formatted correctly, we get <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#t:FormatError"><code>FormatError</code></a>. For instance, if we have a mismatching number of substitutions (<code>?</code> and actual values):</p>
<pre><code class="language-haskell">execute
connection
"INSERT INTO category (label) VALUES (?)"
("One" :: Text, "Two" :: Text)
</code></pre>
<blockquote>
<p><code>FormatError {fmtMessage = "1 single '?' characters, but 2 parameters", fmtQuery = "INSERT INTO category (label) VALUES (?)", fmtParams = ["One","Two"]}</code></p>
</blockquote>
<p>Similarly, on the return side, if the number of columns doesn’t match the number of elements in the result type (in a list, a tuple, or a record), we get <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#t:ResultError"><code>ResultError</code></a>. The most likely variants are <code>Incompatible</code> and <code>UnexpectedNull</code>.</p>
<p>If we forget to wrap a nullable type on the Haskell side, we get <code>UnexpectedNull</code>. For instance, if we try to get <code>description</code> (which is nullable) as <code>Text</code> and not <code>Maybe Text</code>:</p>
<pre><code class="language-haskell">let result :: IO [(Text, Text)] = query_ connection "select label, description from product"
</code></pre>
<blockquote>
<p><code>UnexpectedNull {errSQLType = "text", errSQLTableOid = Just (Oid 16386), errSQLField = "description", errHaskellType = "Text", errMessage = ""}</code></p>
</blockquote>
<p>If we mistype the types, we get <code>Incompatible</code>. For instance, if we try to parse just <code>id</code> into <code>BasicProduct</code>:</p>
<pre><code class="language-haskell">let result :: IO [BasicProduct] = query_ connection "select id from product"
</code></pre>
<blockquote>
<p><code>Incompatible {errSQLType = "int4", errSQLTableOid = Just (Oid 16386), errSQLField = "id", errHaskellType = "Text", errMessage = "types incompatible"}</code></p>
</blockquote>
<p>On top of that, if we misuse the library — by mistaking <code>query</code> for <code>execute</code> or vice verse — we get <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#t:QueryError"><code>QueryError</code></a>. For example, if we use <code>execute</code> with <em>insert</em> query that has <em>returning</em>:</p>
<pre><code class="language-haskell">execute_
connection
"INSERT INTO category (label) VALUES (Screws) returning id"
</code></pre>
<blockquote>
<p><code>QueryError {qeMessage = "execute resulted in Col 1-column result", qeQuery = "INSERT INTO category (label) VALUES ('Deck Screws') returning id"}</code></p>
</blockquote>
<p>And last but not least, any sql errors from postgres, will come back as <a href="https://hackage.haskell.org/package/postgresql-simple-0.7.0.0/docs/Database-PostgreSQL-Simple.html#t:SqlError"><code>SqlError</code></a>:</p>
<pre><code class="language-haskell">let result :: IO [BasicProduct] = query_ connection "select I have no idea what I'm doing"
</code></pre>
<blockquote>
<p><code>Wrong sql: SqlError {sqlState = "42601", sqlExecStatus = FatalError, sqlErrorMsg = "syntax error at or near \"no\"", sqlErrorDetail = "", sqlErrorHint = ""}</code></p>
</blockquote>
<p>The errors are pretty good but still not the most descriptive — if you try to write big queries, you have to concentrate on projecting the error information to the query.</p>
<h3>Resources</h3>
<p>The docs are also simple; the library covers all the primary blocks, describes the functions, and provides some examples. Outside, a few blog posts cover similar things, mainly targeting beginners.</p>
<p>And you don’t need more than that — if you know how to write one simple query, you know how to write them all.</p>
<h3>Migrations</h3>
<p>The library has a companion package, <a href="https://hackage.haskell.org/package/postgresql-migration"><code>postgresql-migration</code></a>.</p>
<blockquote>
<p>🗂️ This is a fork of the archived <a href="https://hackage.haskell.org/package/postgresql-simple-migration"><code>postgresql-simple-migration</code></a>.</p>
</blockquote>
<h3>In summary</h3>
<p><a href="https://hackage.haskell.org/package/postgresql-simple">postgresql-simple</a> is a library for all levels and a great option if you love writing sql by hand and don’t need reusability.</p>
<p>It doesn’t parse or validate the queries, so we must pay attention to what we write: sql queries, haskell types (type-safety is our responsibility), the order of parameters, and so on.</p>
<h2><code>hasql</code></h2>
<p>The next “obvious” step is to add more type-safety.</p>
<p>According to the readme, <em><a href="https://github.com/nikita-volkov/hasql">Hasql</a> “is a highly efficient PostgreSQL driver for Haskell with a typesafe yet flexible mapping API; it is production-ready, actively maintained, and the API is pretty stable. It's used by many companies and most notably by the <a href="https://postgrest.org/">Postgrest</a> project.“</em></p>
<p>Hasql is an <a href="https://github.com/nikita-volkov/hasql#ecosystem">ecosystem</a> of libraries. To keep it simple, let’s limit ourselves to core <code>hasql</code>, <a href="https://github.com/nikita-volkov/hasql-transaction"><code>hasql-transaction</code></a>, and <a href="https://github.com/nikita-volkov/hasql-th"><code>hasql-th</code></a>. We’re using <code>hasql</code> <code>1.6.3.2</code> published in 2023.</p>
<p>We’ll also use <a href="https://hackage.haskell.org/package/contravariant-extras">contravariant-extras</a>, <a href="https://hackage.haskell.org/package/vector">vector</a>, <a href="https://hackage.haskell.org/package/profunctors">profunctors</a>, and <a href="https://hackage.haskell.org/package/tuple">tuple</a> packages to make a few things tidier (this isn’t required; it’s all copy-paste anyway).</p>
<blockquote>
<p>💡 (It’s not very important, but) We assume you’ve seen the part on <code>postgresql-simple</code>, which covers the same topics but at a slower pace.</p>
</blockquote>
<h3>How to connect to a database</h3>
<p>First, we get a connection:</p>
<pre><code class="language-haskell">Right connection <- getConnection
</code></pre>
<pre><code class="language-haskell">getConnection :: IO (Either ConnectionError Connection)
getConnection =
acquire $ settings Hardcoded.host Hardcoded.portNumber Hardcoded.user Hardcoded.password Hardcoded.database
</code></pre>
<p>Note the <code>Either</code>. But for now, let’s just pattern-match and not worry about possible errors…</p>
<p>In reality/production, we should probably use <a href="https://hackage.haskell.org/package/hasql-pool"><code>hasql-pool</code></a> to work with a pool of connections.</p>
<h3>How to modify data</h3>
<p>Let’s see the leading players through the clean-up query:</p>
<pre><code class="language-haskell">cleanUp :: Connection -> IO (Either QueryError ())
cleanUp connection = run cleanUpSession connection
where
cleanUpSession :: Session ()
cleanUpSession = statement () cleanUpStatement
cleanUpStatement :: Statement () ()
cleanUpStatement = Statement rawSql E.noParams D.noResult True
rawSql = "truncate warehouse, product_category, product, category"
</code></pre>
<ul>
<li><code>Session</code> is a batch of actions to be executed in the context of a connection (a query).</li>
<li><code>Statement</code> is a specification of a strictly single-statement query, which can be parameterized and prepared (how to make a query).</li>
<li><code>Statement</code> consists of SQL template, params encoder, result decoder, and a flag that determines whether it’s prepared.</li>
<li><code>statement</code> creates a <code>Session</code> from a <code>Statement</code> and input parameters.</li>
<li><code>run</code> executes a bunch of commands (statements) on the provided connection.</li>
</ul>
<blockquote>
<p>💡 Remember that you can see the complete code in the <a href="https://github.com/Zelenya/elephants">repo</a>.</p>
</blockquote>
<p>We have a simple query with no parameters and no result — we don’t need to encode or decode anything. That’s what <code>E.noParams D.noResult</code> for. If we want to pass parameters, we need to supply a decoder.</p>
<p>The first option, is tuples of primitive types and manually written decoders:</p>
<pre><code class="language-haskell">insertProductSql = "insert into product (label, description) values ($1, $2)"
</code></pre>
<pre><code class="language-haskell">insertProduct1 :: Statement (Text, Maybe Text) Int64
insertProduct1 = Statement insertProductSql rawParams D.rowsAffected True
rawParams =
(fst >$< E.param (E.nonNullable E.text))
<> (snd >$< E.param (E.nullable E.text))
</code></pre>
<pre><code class="language-haskell">statement ("Wood Screw Kit 1", Just "245-pieces") insertProduct1
</code></pre>
<p><code>rawParams</code> is the encoder for our parameters. We use <a href="https://hackage.haskell.org/package/base-4.18.0.0/docs/Data-Functor-Contravariant.html#v:contramap"><code>contramap</code></a> operator (<code>>$<</code>) and append (<code><></code>) to compose multiple parameters. <code>D.rowsAffected</code> is the decoder for the result when we want to return the number of affected rows.</p>
<blockquote>
<p>💡 Instead of <a href="https://hackage.haskell.org/package/base-4.16.3.0/docs/Data-Tuple.html#v:fst"><code>fst</code></a> and <a href="https://hackage.haskell.org/package/base-4.16.3.0/docs/Data-Tuple.html#v:snd"><code>snd</code></a>, you can use the <code>contrazip</code> family of functions from the <code>contravariant-extras</code> package to reduce boilerplate.</p>
</blockquote>
<p>Another option, is using records:</p>
<pre><code class="language-haskell">insertProduct2 :: Statement BasicProduct Int64
insertProduct2 = Statement insertProductSql basicProductParams D.rowsAffected True
basicProductParams :: E.Params BasicProduct
basicProductParams =
((.label) >$< E.param (E.nonNullable E.text))
<> ((.description) >$< E.param (E.nullable E.text))
</code></pre>
<pre><code class="language-haskell">statement (BasicProduct "Wood Screw Kit 2" Nothing) insertProduct2
</code></pre>
<p>If we want to modify multiple rows, we have to use the postgres <code>unnest</code> function:</p>
<pre><code class="language-haskell">insertManyCategories :: Statement (Vector Category) Int64
insertManyCategories = Statement insertManyCategoriesSql categoryParams D.rowsAffected True
insertManyCategoriesSql = "insert into category (label) select * from unnest ($1)"
categoryParams :: E.Params (Vector Category)
categoryParams =
E.param
$ E.nonNullable
$ E.array
$ E.dimension List.foldl'
$ categoryArray
categoryArray :: E.Array Category
categoryArray = (.label) >$< (E.element $ E.nonNullable E.text)
</code></pre>
<p><code>categoryParams</code> is an encoder that allows us to pass a vector of categories to insert.</p>
<pre><code class="language-haskell">let categories = [Category "Screws", Category "Wood Screws", Category "Concrete Screws"]
statement (fromList categories) insertManyCategories
</code></pre>
<blockquote>
<p>Note that <code>unnest</code> is more efficient than executing a single-row insert statement multiple times.</p>
</blockquote>
<h3>How to query data</h3>
<p>Querying data is similar:</p>
<pre><code class="language-haskell">session1 :: Session [(Int64, Text, Maybe Text)]
session1 =
statement ()
$ Statement
"select id, label, description from product"
E.noParams
decoder1
True
decoder1 =
D.rowList
$ (,,)
<$> D.column (D.nonNullable D.int8)
<*> D.column (D.nonNullable D.text)
<*> D.column (D.nullable D.text)
</code></pre>
<p>We need to provide a decoder for the result (to specify how each row results maps into the expected type). If this sounds tedious, we can ask Template Haskell to do the work for us:</p>
<p>In this case, we use <code>singletonStatement</code> that expects one result. There are other variants that we’ll see later.</p>
<pre><code class="language-haskell">session2 :: Session (Text, Maybe Text)
session2 = statement () statement2
statement2 :: Statement () (Text, Maybe Text)
statement2 =
[singletonStatement|
select label :: text, description :: text? from product limit 1
|]
</code></pre>
<p>We write the query and specify the types, <code>hasql-th</code> handles the codecs for us.</p>
<p>But we still need to handle the conversions if we use custom types instead of tuples. The result of the statement has a <code>Profunctor</code> instance, which allows us to modify (input) parameters and (output) results. In other words, we use <code>lmap</code> to map parameters, <code>rmap</code> — result, and <code>dimap</code> — both. For example, let’s return <code>BasicProduct</code>:</p>
<pre><code class="language-haskell">session3 :: Session (Maybe BasicProduct)
session3 = statement "Wood Screw Kit 2" statement3
statement3 :: Statement Text (Maybe BasicProduct)
statement3 =
rmap
(fmap (uncurryN BasicProduct))
[maybeStatement|
select label :: text, description :: text?
from product
where label = $1 :: text
|]
</code></pre>
<hr>
<p>💡 <code>(fmap (uncurryN BasicProduct))</code> is a concise way to write the following (using <code>tuples</code> package):</p>
<pre><code class="language-haskell">(\result -> fmap (\(a, b) -> (BasicProduct a b)) result)
</code></pre>
<hr>
<p><code>hasql</code> doesn’t have "special support" for an array as a parameter for the <code>IN</code> operator, we should use <a href="https://hackage.haskell.org/package/hasql-1.6.3.2/docs/Hasql-Statement.html#g:3">Any</a>:</p>
<pre><code class="language-haskell">session4 :: Session (Vector BasicProduct)
session4 = statement (fromList ["Wood Screw Kit 1", "Wood Screw Kit 2"]) statement4
statement4 :: Statement (Vector Text) (Vector BasicProduct)
statement4 =
rmap
(fmap (uncurryN BasicProduct))
[vectorStatement|
select label :: text, description :: text?
from product
where label = ANY($1 :: text[])
|]
</code></pre>
<h3>How to use transactions</h3>
<p>We can use <code>returning</code> to get <code>id</code>s of created rows:</p>
<pre><code class="language-haskell">insertProduct :: Statement (Text, Maybe Text) Int64
insertProduct =
[singletonStatement|
insert into product (label, description) values ($1 :: text, $2 :: text?) returning id :: int8
|]
</code></pre>
<p>To wrap multiple queries in a transaction, we can use <code>hasql-transaction</code>. First, we compose the statements:</p>
<pre><code class="language-haskell">insertAll :: FullProduct -> Transaction Int64
insertAll listing = do
productId <- Transaction.statement (listing.label, listing.description) insertProduct
categoryId <- Transaction.statement listing.category insertCategory
_ <- Transaction.statement (productId) insertListing
ids <- Transaction.statement (productId, categoryId) insertMapping
pure ids
insertProduct :: Statement (Text, Maybe Text) Int64
insertCategory :: Statement Text Int64
insertListing :: Statement Int64 ()
insertMapping :: Statement (Int64, Int64) Int64
</code></pre>
<p>Then we run the transaction using the relevant isolation level and mode:</p>
<pre><code class="language-haskell">insertWithTransaction :: Connection -> IO ()
insertWithTransaction connection = do
let listing = FullProduct "Drywall Screws Set" (Just "8000pcs") "Drywall Screws"
mapping <- run (transaction Serializable Write $ insertAll listing) connection
putStrLn $ "Insert with transaction: " <> show mapping
</code></pre>
<h3>How to query using joins</h3>
<p>We can query these tables using a few joins. There should be nothing unexpected here:</p>
<pre><code class="language-haskell">listings :: Statement Int32 (Vector Listing)
listings =
rmap
(fmap (uncurryN Listing))
[vectorStatement|
select
w.quantity :: int,
p.label :: text,
p.description :: text?,
c.label :: text?
from warehouse as w
inner join product as p on w.product_id = p.id
left outer join product_category as pc on p.id = pc.product_id
left outer join category as c on c.id = pc.category_id
where w.quantity > $1 :: int4
|]
</code></pre>
<h3>Errors</h3>
<p>We’ve been neglecting this until now, but all error reporting is explicit and is presented using <code>Either</code>.</p>
<hr>
<p>💡 Just a reminder, <strong>don’t ignore errors</strong>. And don’t pattern match only on <code>Right</code>, or you will end up with this:</p>
<pre><code class="language-haskell">user error (Pattern match failure in 'do' block at ...)
</code></pre>
<hr>
<p>The other good thing is that the <code>hasql-th</code> parser is pretty good at error reporting and catching typos at compile time (and most of the time, it’s more explicit than postgres’ <code>syntax error at or near</code>). This won’t compile:</p>
<pre><code class="language-haskell">[singletonStatement|
select I have no idea what I'm doing
|]
</code></pre>
<p>The library doesn’t accept (doesn’t compile) if you forget to specify one of the types. For instance, if we omit type of <code>label</code>, we get a somewhat generic error:</p>
<pre><code class="language-haskell">[singletonStatement|
select label, description :: text? from product
|]
</code></pre>
<blockquote>
<p><code>Result expression is missing a typecast</code></p>
</blockquote>
<p>This ensures that most input and result type (including nullability) mismatches are caught in the compile time. For example, if we forget an input type and return a wrong result type:</p>
<pre><code class="language-haskell">statement :: Statement () (Text, Int32)
statement =
[singletonStatement|
select label :: text, description :: text?
-- ^^^^^
-- Couldn't match type ‘Int32’ with ‘Maybe Text’
from product where label = $1 :: text
-- ^^^^
-- Couldn't match type ‘Text’ with ‘()’
|]
</code></pre>
<p>However, we’re not safe from programming errors. We should use correct statement functions not to get a runtime error. For example, if we use <code>singletonStatement</code> for statements that might not return a result (instead of <code>maybeStatement</code>):</p>
<pre><code class="language-haskell">do
failure <- run (statement () failsBecauseNoResults) connection
putStrLn $ "Wrong statement function: " <> show failure
where
failsBecauseNoResults :: Statement () (Text)
failsBecauseNoResults =
[singletonStatement|
select label :: text from product where 1 = 0
|]
</code></pre>
<blockquote>
<p><code>Wrong statement function: Left (QueryError "SELECT label :: text FROM product WHERE 1 = 0" [] (ResultError (UnexpectedAmountOfRows 0)))</code></p>
</blockquote>
<p>Or if we use <code>singletonStatement</code> with <code>()</code> result (instead of <code>resultlessStatement</code>):</p>
<pre><code class="language-haskell">do
failure <- run (statement () failsBecauseResultless) connection
putStrLn $ "Wrong statement function: " <> show failure
where
failsBecauseResultless :: Statement () ()
failsBecauseResultless =
[singletonStatement|
insert into product (label) values ('this insert fails')
|]
</code></pre>
<blockquote>
<p><code>Wrong statement function: Left (QueryError "INSERT INTO product (label) VALUES ('this insert fails')" [] (ResultError (UnexpectedResult "Unexpected result status: CommandOk")))</code></p>
</blockquote>
<p>In case of runtime sql error, for instance, if we violate a constraint, we get a similar error:</p>
<pre><code class="language-haskell">inserProduct :: Statement Text ()
inserProduct =
[singletonStatement|
insert into product (label) values ($1 :: text)
|]
</code></pre>
<pre><code class="language-haskell">run (statement "Duplicate screw" inserProduct) connection
>> run (statement "Duplicate screw" inserProduct) connection
</code></pre>
<blockquote>
<p><code>Wrong statement function (Left): QueryError "INSERT INTO product (label) VALUES ('Duplicate')" [] (ResultError (ServerError "23505" "duplicate key value violates unique constraint \"product_label_key\"" (Just "Key (label)=(Duplicate screw) already exists.") Nothing Nothing))</code></p>
</blockquote>
<h3>Resources</h3>
<p>Core readme has a good overview and example. The library has simple docs, a couple of tutorials, and talks from the author.</p>
<h3>Migrations</h3>
<p><a href="https://github.com/tvh/hasql-migration">hasql-migrations</a> tool is a port of <code>postgresql-simple-migration</code> for use with <code>hasql</code>.</p>
<h3>In summary</h3>
<p>Overall, <code>hasql</code> is a great choice for writing raw sql queries with more type safety and compile-time syntax checks. The ecosystem comes with other whistles like connection pools and transactions.</p>
<p>The TemplateHaskell module and compile-time checks are optional — if you want, you can deal with the encoders and decoders yourself.</p>
<p>The library requires basic/intermediate knowledge of Haskell and ecosystems. To be comfortable and productive, you must be familiar with vectors, contravariant functors, etc. Other than that, the library is relatively straightforward.</p>
<h2><code>persistent</code> + <code>esqueleto</code></h2>
<p><em>If that was not enough, it’s time to move to the type level.</em></p>
<p>According to the readme, <em>”<a href="https://github.com/yesodweb/persistent">Persistent's</a> goal is to catch every possible error at compile-time, and it comes close to that.</em> It is also <em>designed to be adaptable to any datastore”</em>. As a result, <em>”a major limitation for SQL databases is that the persistent library does not directly provide joins”</em>.</p>
<p>However, we can use <a href="http://hackage.haskell.org/package/esqueleto">Esqueleto</a> (<em>”a bare bones, type-safe EDSL for SQL queries”</em>) with Persistent's serialization to write type-safe SQL queries. It’s unlikely that you want to use Persistent by itself with SQL, so let’s use and review them together.</p>
<p>We’re using <a href="https://hackage.haskell.org/package/persistent"><code>persistent</code></a> (<code>2.14.5.1</code>), <a href="https://hackage.haskell.org/package/persistent-postgresql"><code>persistent-postgresql</code></a> (<code>2.13.5.2</code>), and <a href="https://hackage.haskell.org/package/esqueleto"><code>esqueleto</code></a> (<code>3.5.10.1</code>), all published in 2023. Additionally, we’ll use the <strong>experimental</strong> style, which will become the new "default" in <code>esqueleto-4.0.0.0</code>.</p>
<p>We’ll also use <code>mtl</code>, <code>monad-logger</code>, <code>unliftio-core</code>, <code>time</code>, and <code>exceptions</code>.</p>
<p>The libraries require additional extensions: <code>DataKinds</code>, <code>GADTs</code>, <code>TypeFamilies</code>, and <code>UndecidableInstances</code>.</p>
<blockquote>
<p>💡 (It’s not very important, but) We assume you’ve seen the part on <code>postgresql-simple</code>, which covers the same topics but at a slower pace.</p>
</blockquote>
<h3>How to connect to a database</h3>
<p><code>Database.Persist.Postgresql</code> provides various ways to connect to postgres with and without a connection pool.</p>
<p>First, we need a <code>libpq</code> connection string, which looks like this <code>"host=localhost port=5432 user=postgres dbname=warehouse password=password"</code>.</p>
<p>We create the pool and run actions on it using <code>withPostgresqlPool</code> and passing the connection string, number of connections, and action(s) to be executed. We use <code>liftSqlPersistMPool</code> to run an action/transaction on a pool. And “finally”, use <code>runNoLoggingT</code> (<code>runStdoutLoggingT</code>, or alternative) to run with appropriate logging.</p>
<pre><code class="language-haskell">runNoLoggingT $ P.withPostgresqlPool Hardcoded.connectionString 3 $ \pool -> do
le runWithPool = flip liftSqlPersistMPool pool
runWithPool transaction1
runWithPool transaction2
...
</code></pre>
<blockquote>
<p>💡 We can use <code>runStdoutLoggingT</code> to see what sql queries get executed.</p>
</blockquote>
<h3>How to define tables</h3>
<p>Persistent takes care of creating and matching Haskell datatypes and <code>PersistEntity</code> instances; we need to declare the entities by passing them to <code>mkPersist</code>:</p>
<pre><code class="language-haskell">mkPersist
sqlSettings
[persistLowerCase|
Product
label Text
description Text Maybe
UniqueLabel label
deriving Eq Show
Category
label Text
UniqueCategory label
deriving Eq Show
ProductCategory
productId ProductId
categoryId CategoryId
Primary productId categoryId
deriving Eq Show
Warehouse
productId ProductId
quantity Int
created UTCTime default=CURRENT_TIME
modified UTCTime default=CURRENT_TIME
deriving Eq Show
|]
</code></pre>
<p><code>persistLowerCase</code> states that <code>SomeTable</code> corresponds to the SQL table <code>some_table</code>.</p>
<h3>How to modify data</h3>
<p>Even though it’s not encouraged, we can always execute raw sql; for example, we can truncate tables with <a href="https://hackage.haskell.org/package/esqueleto-3.5.10.3/docs/Database-Esqueleto-Experimental.html#v:rawExecute"><code>rawExecute</code></a>:</p>
<pre><code class="language-haskell">cleanUp :: (MonadIO m) => SqlPersistT m ()
cleanUp = rawExecute "truncate warehouse, product_category, product, category" []
</code></pre>
<p>What’s <code>SqlPersistT m ()</code>? Let’s say it’s something that can be executed with <code>runWithPool</code> and returns <code>()</code>.</p>
<hr>
<p>💡 Note that we can also use <code>deleteWhere</code> to delete all the records from a table:</p>
<pre><code class="language-haskell">deleteWhere ([] :: [Filter Product]))
</code></pre>
<hr>
<p>Because we’ve done all the groundwork, we use records right away (no tuples):</p>
<pre><code class="language-haskell">insertStuff :: (MonadIO m) => SqlPersistT m ()
insertStuff = do
newId <- insert $ Product "Wood Screw Kit 1" (Just "245-pieces")
liftIO $ putStrLn $ "Insert 1: " <> show newId
newIds <- insertMany [Category "Screws", Category "Wood Screws", Category "Concrete Screws"]
liftIO $ putStrLn $ "Insert 2: " <> show newIds
</code></pre>
<p>That’s it! Persistent is concise when it comes to inserts. Note that <code>insert</code> returns the id, and <code>insertMany</code> returns multiple ids.</p>
<p>We can use <code>liftIO</code> to execute <code>IO</code> operations like printing “inside” <code>SqlPersistT</code>.</p>
<h3>How to query data</h3>
<p>This is the part where <code>esqueleto</code> comes in.</p>
<p>The first query takes a label and returns a list of product entities:</p>
<pre><code class="language-haskell">query1 :: Text -> SqlPersistT m [Entity Product]
query1 label = select $ do
aProduct <- from $ table @Product
where_ (aProduct.label ==. val label)
pure aProduct
</code></pre>
<p>It returns an <code>Entity</code> instead of a value — an <code>Entity</code> combines a database id and a value.</p>
<p>This is an experimental syntax that mimics sql. We use the <code>TypeApplications</code> extensions to make the table explicit, <code>OverloadedRecordDot</code> to select the field/column value, the <code>==.</code> operator to check for equality, and <code>val</code> to “lift” haskell value into “sql query land”.</p>
<blockquote>
<p>💡 Note that there are other alternatives for field projections (instead of <code>OverloadedRecordDot</code>), such as the <code>(^.)</code> operator and <code>OverloadedLabels</code>.</p>
</blockquote>
<p>We can select multiple labels using <code>in_</code>:</p>
<pre><code class="language-haskell">query2 :: [Text] -> SqlPersistT m [Entity Product]
query2 lables = select $ do
aProduct <- from $ table @Product
where_ $ aProduct.label `in_` valList lables
pure aProduct
</code></pre>
<h3>How to use transactions</h3>
<p>We’ve been kind-of using transactions all this time. Everything inside a <strong>single call</strong> to <code>liftSqlPersistMPool</code> (and other versions, with and without pooling) runs in a <strong>single transaction</strong>.</p>
<pre><code class="language-haskell">insertWithTransaction :: (MonadIO m, MonadCatch m) => SqlPersistT m ()
insertWithTransaction = handle (\(SomeException _) -> pure ()) $ do
productId <- insert $ Product "Drywall Screws Set" (Just "8000pcs")
categoryId <- insert $ Category "Drywall Screws"
time <- liftIO getCurrentTime
_ <- insert_ $ Warehouse productId 10 time time
_ <- insert_ $ ProductCategory productId categoryId
liftIO $ putStrLn $ "Insert with transaction"
</code></pre>
<p>This time, we handle exceptions (any <code>SomeException</code>).</p>
<blockquote>
<p>💡 We generally want to split the queries into transactions and catch exceptions on each transaction. We dive deeper into error handling in the errors section.</p>
</blockquote>
<h3>How to query using joins</h3>
<p>And this is the part where experimental syntax comes in handy:</p>
<pre><code class="language-haskell">query quantity = select $ do
(warehouse :& aProduct :& _ :& category) <-
from
$ table @Warehouse
`innerJoin` table @Product
`on` do \(w :& p) -> w.productId ==. p.id
`LeftOuterJoin` table @ProductCategory
`on` do \(_ :& p :& pc) -> just p.id ==. pc.productId
`LeftOuterJoin` table @Category
`on` do \(_ :& _ :& pc :& c) -> pc.categoryId ==. c.id
where_ (warehouse.quantity >. val quantity)
pure $ (warehouse.quantity, aProduct.label, aProduct.description, category.label)
</code></pre>
<p>The <a href="https://hackage.haskell.org/package/esqueleto-3.5.10.3/docs/Database-Esqueleto-Experimental.html#v:on"><code>on</code></a> clauses are attached directly to the relevant join. The <code>ON</code> clause lambda has all the available tables — only the tables we have already joined into are in scope.</p>
<p>We use the <a href="https://hackage.haskell.org/package/esqueleto-3.5.10.3/docs/Database-Esqueleto-Experimental.html#t::-38-"><code>:&</code></a> operator to pattern match against the joined tables. We use <code>_</code> placeholder to ignore the previous references to the table.</p>
<p>This generates this query:</p>
<pre><code class="language-sql">SELECT
"warehouse"."quantity",
"product"."label",
"product"."description",
"category"."label"
FROM
"warehouse"
INNER JOIN "product" ON "warehouse"."product_id" = "product"."id"
LEFT OUTER JOIN "product_category" ON "product"."id" = "product_category"."product_id"
LEFT OUTER JOIN "category" ON "product_category"."category_id" = "category"."id"
WHERE
"warehouse"."quantity" > ?
</code></pre>
<h3>Errors</h3>
<p>It’s possible to write type-checked queries that fail at runtime, but most typical sql errors are caught as compile-time errors.</p>
<p>Sometimes, mistakes in queries will result in error messages that refer to library internals (for example, you might see <code>PersistUniqueRead backend0</code>, <code>Database.Esqueleto.Internal.Internal.SqlExpr</code>, <code>PersistRecordBackend backend val</code>, <code>‘BaseBackend backend0’</code>, <code>‘SqlBackend’</code>). This takes some time to get used to. Help the type inference, and it will help you.</p>
<p>Nobody is safe from runtime sql errors. For example, if we violate the uniqueness constraint, we get an exception that we need to deal with:</p>
<pre><code class="language-haskell">errors :: (MonadIO m, MonadCatch m) => SqlPersistT m ()
errors = do
let duplicateScrew = Product "Duplicate screw" Nothing
void $ insert duplicateScrew
(void $ insert duplicateScrew)
`catch` (\(SomeException err) -> liftIO $ putStrLn $ "Caught SQL Error: " <> displayException err)
</code></pre>
<blockquote>
<p><code>Caught SQL Error: SqlError {sqlState = "23505", sqlExecStatus = FatalError, sqlErrorMsg = "duplicate key value violates unique constraint \"product_label_key\"", sqlErrorDetail = "Key (label)=(Duplicate screw) already exists.", sqlErrorHint = ""}</code></p>
</blockquote>
<p>Note that we use the <a href="https://hackage.haskell.org/package/exceptions">exceptions</a> package to handle exceptions. (We don’t use the exceptions from <a href="https://hackage.haskell.org/package/base-4.16.3.0/docs/Control-Exception.html">Control.Exception</a> as we did in <code>postgresql-simple</code> because we don’t want to be limited to <code>IO</code>).</p>
<h3>Resources</h3>
<p><code>persistent</code> is well documented as part of the <a href="https://www.yesodweb.com/book/persistent">yesod book</a>, and <code>esqueleto</code> has good readme and docs. The catch is that you have to keep an eye on multiple packages simultaneously.</p>
<p>On top of that, (currently) <code>esqueleto</code> supports legacy and experimental syntax, and you have to be aware that some tutorials and examples use less safe legacy syntax (or a mix of both) — the good news is that the compiler will warn you if you’re on the wrong path.</p>
<h3>Migrations</h3>
<p><code>persistent</code> can automatically create tables and do migrations. However, the <a href="https://www.yesodweb.com/book/persistent#persistent_migrations">book</a> discourages that:</p>
<blockquote>
<p><em>“Using automated database migrations is only recommended in development environments. Allowing your application to modify your database schema in a production environment is very strongly discouraged.”</em></p>
</blockquote>
<h3>In summary</h3>
<p>You should consider <code>persistent</code> with <code>esqueleto</code> if you mainly have a lot of simple queries, are tired of writing raw sql, but want moderately more type-safe and composable sql.</p>
<p>The <code>persistent</code> is a (very) generalized library, meaning you should be comfortable using abstractions. And you should be familiar with <code>mtl</code>, <code>monad-logger</code>, lifting/unlifting IO, and so on.</p>
<blockquote>
<p><em>“Most kinds of errors committed when writing SQL are caught as compile-time errors — although it is possible to write type-checked <code>esqueleto</code> queries that fail at runtime”</em></p>
</blockquote>
<hr>
<p>If you look around, some tutorials and comparisons might say that <code>esqueleto</code> joins might lead to to runtime errors. Don’t worry — this refers to legacy syntax — use new/experimental syntax.</p>
<h2><code>beam</code></h2>
<p><em>Tired of sql and Template Haskell?</em></p>
<p><a href="https://haskell-beam.github.io/beam/">Beam</a> “<em>is a highly-general library for accessing any kind of database with Haskell”.</em> Beam makes extensive use of GHC's Generics mechanism — no Template Haskell.</p>
<p>First, install <a href="https://hackage.haskell.org/package/beam-core"><code>beam-core</code></a> (<code>0.10.1.0</code> released in 2023) and <a href="https://hackage.haskell.org/package/beam-postgres"><code>beam-postgres</code></a>(<code>0.5.3.1</code>).</p>
<p>A few additional extensions: <code>GADTs</code> and <code>TypeFamilies</code>.</p>
<p><code>beam-postgres</code> is built on top of <code>postgresql-simple</code>, which is used for connection management, transaction support, serialization, and deserialization.</p>
<blockquote>
<p>💡 We assume that you’ve seen the part on <code>postgresql-simple</code>.</p>
</blockquote>
<h3>How to connect to a database</h3>
<p>We use <code>postgresql-simple</code> straight away. Reminder:</p>
<pre><code class="language-haskell">connectionInfo :: ConnectInfo
connectionInfo =
defaultConnectInfo
{ connectHost = Hardcoded.host
, connectDatabase = Hardcoded.database
, connectUser = Hardcoded.user
, connectPassword = Hardcoded.password
}
</code></pre>
<pre><code class="language-haskell">Simple.withConnect connectionInfo $ \connection -> do
doFoo connection
doBar connection
</code></pre>
<h3>How to define tables</h3>
<p>Let’s look at the definition of the <strong>product</strong> table:</p>
<pre><code class="language-haskell">data ProductT f = Product
{ id :: Columnar f Int64
, label :: Columnar f Text
, description :: Columnar f (Maybe Text)
}
deriving (Generic)
deriving anyclass (Beamable)
type Product = ProductT Identity
deriving instance Show Product
instance Table ProductT where
data PrimaryKey ProductT f = ProductId (Columnar f Int64)
deriving (Generic)
deriving anyclass (Beamable)
primaryKey = ProductId . (.id)
</code></pre>
<p><code>ProductT</code> is a beam table. All beam tables must implement the <code>Beamable</code> typeclass (derived via generics) and the <code>Table</code> typeclass. The <code>Table</code> instance declares the type of primary keys for the table and a function that extracts them. We can use <code>Product</code> to construct values of type <code>Product</code>.</p>
<blockquote>
<p>💡 For details, see <a href="https://haskell-beam.github.io/beam/tutorials/tutorial1/">beam tutorial</a>.</p>
</blockquote>
<p>All the other tables look quite similar; see the <a href="https://github.com/Zelenya/elephants">repo</a> for the rest of the boilerplate. One interesting bit is foreign keys / referencing other primary keys; for example, <code>product_id</code> and <code>category_id</code> in the mapping table look like are defined as <code>PrimaryKey ProductT f</code> (not <code>Columnar f Int64</code>):</p>
<pre><code class="language-haskell">data ProductCategoryT f = ProductCategory
{ product_id :: PrimaryKey ProductT f
, category_id :: PrimaryKey CategoryT f
}
deriving (Generic)
deriving anyclass (Beamable)
</code></pre>
<p>After declaring all the tables, we describe our database:</p>
<pre><code class="language-haskell">data WarehouseDb f = WarehouseDb
{ product :: f (TableEntity ProductT)
, category :: f (TableEntity CategoryT)
, product_category :: f (TableEntity ProductCategoryT)
, warehouse :: f (TableEntity WarehouseT)
}
deriving (Generic)
deriving anyclass (Database Postgres)
warehouseDb :: DatabaseSettings Postgres WarehouseDb
warehouseDb =
defaultDbSettings
`withDbModification` dbModification
{ product_category =
modifyTableFields
tableModification
{ category_id = CategoryId (fieldNamed "category_id")
, product_id = ProductId (fieldNamed "product_id")
}
, warehouse =
modifyTableFields @WarehouseT
tableModification
{ product_id = ProductId (fieldNamed "product_id")
}
}
</code></pre>
<p><code>WarehouseDb</code> needs to define all the tables and an instance of <code>Database _</code>.</p>
<blockquote>
<p>💡 Note that you don’t need to hardcode <code>Postgres</code> and can keep the database more generic.</p>
</blockquote>
<p>If you don’t have an existing database, you might get away with only <code>defaultDbSettings</code> as <code>DatabaseSettings</code>. Beam can guess a lot about the tables if we follow their conventions. But we need to override a few generated table fields in our case.</p>
<p>Remember that we have a couple of foreign keys? Beam adds a suffix <code>__id</code> to these, meaning if we have a record field <code>product_id</code>, generated queries will try to use the column <code>product_id__id</code>. So, we must override these in the <em>product_category</em>* mapping and <strong>warehouse</strong> tables.</p>
<blockquote>
<p>💡 See <a href="https://haskell-beam.github.io/beam/user-guide/models/#defaults">beam defaults</a> for more information.</p>
</blockquote>
<h3>How to modify data</h3>
<p>For raw queries, we can use <code>postgresql-simple</code>:</p>
<pre><code class="language-haskell">cleanUp :: Connection -> IO ()
cleanUp connection =
void $ Simple.execute_ connection "truncate warehouse, product_category, product, category"
</code></pre>
<p>Let’s insert some products:</p>
<pre><code class="language-haskell">insert1 :: Connection -> IO ()
insert1 connection =
runBeamPostgres connection
$ runInsert
$ insert (warehouseDb.product)
$ insertValues
[ Product 1 "Wood Screw Kit 1" (Just "245-pieces")
, Product 2 "Wood Screw Kit 2" Nothing
]
</code></pre>
<p>We construct the statement using <code>insert</code>, which accepts a table and values. We use <code>insertValues</code> to supply concrete values (including ids). <code>runInsert</code> runs the statement (in <a href="https://hackage.haskell.org/package/beam-core-0.10.1.0/docs/Database-Beam-Backend-SQL.html#t:MonadBeam"><code>MonadBeam</code></a>), which <code>runBeamPostgres</code> executes using the given connection.</p>
<blockquote>
<p>💡 Note that we can use <code>runBeamPostgresDebug putStrLn</code> instead of <code>runBeamPostgres</code> to see what sql queries get executed.</p>
</blockquote>
<p><code>runInsert</code> doesn’t return anything (no affected rows, no ids, nothing). When we want some confirmation back, we can use <a href="https://hackage.haskell.org/package/beam-core-0.10.1.0/docs/Database-Beam-Backend-SQL-BeamExtensions.html#v:runInsertReturningList"><code>runInsertReturningList</code></a>:</p>
<pre><code class="language-haskell">insert2 :: Connection -> IO ()
insert2 connection = do
result :: [Category] <-
runBeamPostgres connection
$ runInsertReturningList
$ insert (warehouseDb.category)
$ insertExpressions
[ Category default_ "Screws"
, Category default_ "Wood Screws"
, Category default_ "Concrete Screws"
]
putStrLn $ "Inserted categories: " <> show result
</code></pre>
<p>We can use <code>insertExpressions</code> function to insert arbitrary sql expressions. In this case, we pass <code>default_</code> to ask the database to give us default ids.</p>
<h3>How to query data</h3>
<p>Instead of talking about <code>Q</code> monads and <code>MonadBeam</code>, let’s look at the examples. First, query all the products:</p>
<pre><code class="language-haskell">query1 :: (MonadBeam Postgres m) => m [Product]
query1 = do
let allProducts = all_ (warehouseDb.product)
runSelectReturningList $ select allProducts
</code></pre>
<pre><code class="language-haskell">runBeamPostgres connection query
</code></pre>
<p>Important bits:</p>
<ul>
<li>build a query;</li>
<li>pass it into <code>select</code>;</li>
<li>run it in <code>MonadBeam</code> (using <code>runSelectReturningList</code>, <code>runSelectReturningOne</code>, etc);</li>
<li>execute using <code>runBeamPostgres connection</code>.</li>
</ul>
<p>For example, to build a query, we can use <code>all_</code> to introduce all entries of a table together with <code>guard_</code> to filter the results:</p>
<pre><code class="language-haskell">query2 label = runSelectReturningList $ select $ do
aProduct <- all_ warehouseDb.product
guard_ (aProduct.label ==. val_ label)
pure (aProduct.label, aProduct.description)
</code></pre>
<p><code>filter_</code> is built on top of <code>guard_</code> and allows us to use the <code>in_</code> clause:</p>
<pre><code class="language-haskell">query3 labels =
runSelectReturningList
$ select
$ filter_ (\p -> p.label `in_` predicate)
$ all_ warehouseDb.product
where
predicate = val_ <$> labels
</code></pre>
<p>Note that we use <code>val_</code> to “lift” haskell values into “sql query land”.</p>
<h3>How to use transactions</h3>
<p>We use <code>postgresql-simple</code> for transactions:</p>
<pre><code class="language-haskell">insertWithTransaction :: Connection -> IO ()
insertWithTransaction connection = Simple.withTransaction connection $ do
[newProduct] :: [Product] <-
runBeamPostgres connection
$ runInsertReturningList
$ insert (warehouseDb.product)
$ insertExpressions [Product default_ "Drywall Screws Set" (just_ "8000pcs")]
[newCategory] <-
runBeamPostgres connection
$ runInsertReturningList
$ insert (warehouseDb.category)
$ insertExpressions [Category default_ "Drywall Screws"]
runBeamPostgresDebug putStrLn connection
$ runInsert
$ insert (warehouseDb.product_category)
$ insertValues [ProductCategory (pk newProduct) (pk newCategory)]
runBeamPostgres connection
$ runInsert
$ insert (warehouseDb.warehouse)
$ insertExpressions [Warehouse default_ (val_ (pk newProduct)) 10 currentTimestamp_ currentTimestamp_]
putStrLn $ "Insert with transaction"
</code></pre>
<p>We use <code>currentTimestamp_</code> to ask the database for the current time and <code>pk</code> to get the entity's primary key. For example, we pass <code>pk newProduct</code> into the <code>ProductCategory</code> mapping.</p>
<h3>How to query using joins</h3>
<p>There are various ways to get data from multiple tables using Beam.</p>
<p>For example, we can use <code>related_</code> to get all entries of the given table referenced by the given primary key and <code>leftJoin_</code> to introduce a table using a left join:</p>
<pre><code class="language-haskell">query1 quantity = runBeamPostgres connection
$ runSelectReturningList
$ select
$ do
warehouse <- all_ warehouseDb.warehouse
aProduct <- related_ warehouseDb.product warehouse.product_id
mapping <-
leftJoin_
(all_ warehouseDb.product_category)
(\pc -> pc.product_id ==. primaryKey aProduct)
category <-
leftJoin_
(all_ warehouseDb.category)
(\c -> just_ (primaryKey c) ==. mapping.category_id)
guard_ (warehouse.quantity >. quantity)
pure (warehouse.quantity, aProduct.label, aProduct.description, category.label)
</code></pre>
<p>Which generates the following query:</p>
<pre><code class="language-haskell">SELECT
"t0"."quantity" AS "res0",
"t1"."label" AS "res1",
"t1"."description" AS "res2",
"t3"."label" AS "res3"
FROM
"warehouse" AS "t0"
INNER JOIN "product" AS "t1" ON ("t0"."product_id") = ("t1"."id")
LEFT JOIN "product_category" AS "t2" ON ("t2"."product_id") = ("t1"."id")
LEFT JOIN "category" AS "t3" ON ("t3"."id") IS NOT DISTINCT
FROM
("t2"."category_id")
WHERE
("t0"."quantity") > (3)
</code></pre>
<p>We can also use the <a href="https://haskell-beam.github.io/beam/user-guide/queries/relationships/#many-to-many"><code>manyToMany_</code></a> construct to fetch sides of a many-to-many relationship.</p>
<pre><code class="language-haskell">productCategoryRelationship :: ManyToMany Postgres WarehouseDb ProductT CategoryT
productCategoryRelationship =
manyToMany_ (warehouseDb.product_category) (.product_id) (.category_id)
</code></pre>
<pre><code class="language-haskell">query2 quantity = runBeamPostgres connection
$ runSelectReturningList
$ select
$ do
warehouse <- all_ warehouseDb.warehouse
products <- related_ warehouseDb.product warehouse.product_id
categories <- all_ warehouseDb.category
(aProduct, category) <- productCategoryRelationship (pure products) (pure categories)
guard_ (warehouse.quantity >. quantity)
pure (warehouse.quantity, aProduct.label, aProduct.description, category.label)
</code></pre>
<p>Which generates the following query:</p>
<pre><code class="language-haskell">SELECT
"t0"."quantity" AS "res0",
"t1"."label" AS "res1",
"t1"."description" AS "res2",
"t2"."label" AS "res3"
FROM
"warehouse" AS "t0"
INNER JOIN "product" AS "t1" ON ("t0"."product_id") = ("t1"."id")
CROSS JOIN "category" AS "t2"
INNER JOIN "product_category" AS "t3" ON (
("t3"."product_id") = ("t1"."id")
)
AND (
("t3"."category_id") = ("t2"."id")
)
WHERE
("t0"."quantity") > (3)
</code></pre>
<h3>Errors</h3>
<p>It’s not possible to write an invalid sql query, but this comes at a cost — compile-time errors.</p>
<p>For example, once we forgot to pass a parameter, and this resulted in:</p>
<pre><code class="language-haskell">Couldn't match expected type: Q Postgres
WarehouseDb
QBaseScope
a0
with actual type: Q Postgres
WarehouseDb
s0
(ProductT (QExpr Postgres s0))
-> Q Postgres WarehouseDb s0 (CategoryT (QExpr Postgres s0))
-> Q Postgres
WarehouseDb
s0
(ProductT (QExpr Postgres s0),
CategoryT (QExpr Postgres s0))
</code></pre>
<p>Runtime sql errors are still there, re-exported from <code>postgresql-simple</code>. Review the relevant error section if you need a reminder.</p>
<pre><code class="language-haskell">errors :: Connection -> IO ()
errors connection = do
insertDuplicateScrew
insertDuplicateScrew
`catch` (\err@SqlError{} -> putStrLn $ "Caught SQL Error: " <> displayException err)
where
insertDuplicateScrew =
runBeamPostgres connection
$ runInsert
$ insert (warehouseDb.product)
$ insertExpressions [Product default_ "Duplicate screw" nothing_]
</code></pre>
<blockquote>
<p><code>Caught SQL Error: SqlError {sqlState = "23505", sqlExecStatus = FatalError, sqlErrorMsg = "duplicate key value violates unique constraint \"product_label_key\"", sqlErrorDetail = "Key (label)=(Duplicate screw) already exists.", sqlErrorHint = ""}</code></p>
</blockquote>
<h3>Resources</h3>
<p>Beam has you covered — it comes with an overview, quick-start guide, tutorial, user guide, and hackage docs.</p>
<p><em>Spoiler alert: Beam is likely the best-documented library reviewed in this tutorial.</em></p>
<h3>Migrations</h3>
<p>The <code>beam-migrate</code> package provides a migrations framework.</p>
<blockquote>
<p><em>“The <code>beam-migrate</code> tool can generate a beam schema from a pre-existing database, manage migrations for several production databases, automatically generate migrations between two schemas, and much more.”</em></p>
</blockquote>
<h3>In summary</h3>
<p><code>beam</code> states that if the query compiles, it will generate proper code. Beam uses the GHC Haskell type system and nothing else — no Template Haskell. You don’t have to write raw sql or sql like code. After defining some boilerplate, you write and compose queries in a straightforward Haskell style and get valid SQL.</p>
<p>Regarding complexity, let the types do the talking:</p>
<pre><code class="language-haskell"> manyToMany_
:: ( Database be db, Table joinThrough
, Table left, Table right
, Sql92SelectSanityCheck syntax
, IsSql92SelectSyntax syntax
, SqlEq (QExpr (Sql92SelectExpressionSyntax syntax) s) (PrimaryKey left (QExpr (Sql92SelectExpressionSyntax syntax) s))
, SqlEq (QExpr (Sql92SelectExpressionSyntax syntax) s) (PrimaryKey right (QExpr (Sql92SelectExpressionSyntax syntax) s)) )
=> DatabaseEntity be db (TableEntity joinThrough)
-> (joinThrough (QExpr (Sql92SelectExpressionSyntax syntax) s) -> PrimaryKey left (QExpr (Sql92SelectExpressionSyntax syntax) s))
-> (joinThrough (QExpr (Sql92SelectExpressionSyntax syntax) s) -> PrimaryKey right (QExpr (Sql92SelectExpressionSyntax syntax) s))
-> Q syntax db s (left (QExpr (Sql92SelectExpressionSyntax syntax) s)) -> Q syntax db s (right (QExpr (Sql92SelectExpressionSyntax syntax) s))
-> Q syntax db s (left (QExpr (Sql92SelectExpressionSyntax syntax) s), right (QExpr (Sql92SelectExpressionSyntax syntax) s))
</code></pre>
<h2><code>squeal</code></h2>
<p><em>Okay, what if we did something quite similar but quite different?</em></p>
<p><a href="https://hackage.haskell.org/package/squeal-postgresql">Squeal</a> <em>“is a type-safe embedding of PostgreSQL in Haskell”</em>, which means <em>“that Squeal embeds both SQL terms and SQL types into Haskell at the term and type levels respectively. This leads to a very high level of type-safety”.</em></p>
<p>Install <a href="https://hackage.haskell.org/package/squeal-postgresql"><code>squeal-postgresql</code></a> (<code>0.9.1.3</code> released in 2023) and <a href="https://hackage.haskell.org/package/generics-sop"><code>generics-sop</code></a>, which the library uses for generic encodings of Haskell tuples and records.</p>
<p>Enable: <code>DataKinds</code>, <code>GADTs</code>, and <code>OverloadedLabels</code></p>
<blockquote>
<p>💡 (It’s not very important, but) We assume you’ve seen the part on postgresql-simple, which covers the same topics but at a slower pace.</p>
</blockquote>
<h3>How to connect to a database</h3>
<p>We pass <code>libpq</code> connection string (e.g., <code>"host=localhost port=5432 user=postgres dbname=warehouse password=password"</code>) to <code>withConnection</code>:</p>
<pre><code class="language-haskell">withConnection Hardcoded.connectionString $
doFoo
& pqThen doBar
& pqThen doBaz
</code></pre>
<p>We can also create a connection pool using <a href="https://hackage.haskell.org/package/squeal-postgresql-0.9.1.3/docs/Squeal-PostgreSQL-Session-Pool.html#v:createConnectionPool"><code>createConnectionPool</code></a> and use the pool with <a href="https://hackage.haskell.org/package/squeal-postgresql-0.9.1.3/docs/Squeal-PostgreSQL-Session-Pool.html#v:usingConnectionPool"><code>usingConnectionPool</code></a>.</p>
<h3>How to define tables</h3>
<p>First, we define table columns and constraints:</p>
<pre><code class="language-haskell">type ProductColumns =
'[ "id" ::: 'Def :=> 'NotNull 'PGint4
, "label" ::: 'NoDef :=> 'NotNull 'PGtext
, "description" ::: 'NoDef :=> 'Null 'PGtext
]
type ProductConstraints = '["pk_product" ::: 'PrimaryKey '["id"]]
</code></pre>
<p><code>'Def</code> means that <code>DEFAULT</code> is available for inserts and updates, <code>'NoDef</code> — unavailable. We specify nullability with <code>'NotNull</code> and <code>'Null</code> and the primary key with <code>'PrimaryKey</code>.</p>
<p>We use the <code>:::</code> type operators to pair a <code>Symbol</code> with schema types, constraints, column types, etc. We use <code>:=></code> to specify constraints as well as optionality.</p>
<p>All the other tables look pretty similar (with additional <code>'ForeignKey</code> constraints here and there); see the <a href="https://github.com/Zelenya/elephants">repo</a> for the rest of the boilerplate.</p>
<p>Then, we define a schema:</p>
<pre><code class="language-haskell">type Schema =
'[ "product" ::: 'Table (ProductConstraints :=> ProductColumns)
, "category" ::: 'Table (CategoryConstraints :=> CategoryColumns)
, "product_category" ::: 'Table (ProductCategoryConstraints :=> ProductCategoryColumns)
, "warehouse" ::: 'Table (WarehouseConstraints :=> WarehouseColumns)
]
type DB = Public Schema
</code></pre>
<p>We use generics to convert between Haskell and PostgreSQL values:</p>
<pre><code class="language-haskell">import qualified Generics.SOP as SOP
import qualified GHC.Generics as GHC
</code></pre>
<pre><code class="language-haskell">data BasicProduct = BasicProduct {label :: Text, description :: Maybe Text}
deriving stock (Show, GHC.Generic)
deriving anyclass (SOP.Generic, SOP.HasDatatypeInfo)
</code></pre>
<p>The <code>SOP.Generic</code> and <code>SOP.HasDatatypeInfo</code> instances allow us to encode and decode <code>BasicProduct</code>s.</p>
<h3>How to modify data</h3>
<p>We can execute raw statements:</p>
<pre><code class="language-haskell">cleanUp :: PQ DB DB IO ()
cleanUp =
execute_ teardown
where
teardown :: Statement db () ()
teardown = manipulation $ UnsafeManipulation "truncate warehouse, product_category, product, category"
</code></pre>
<p><code>Manipulation</code> represents update, insert, and delete statements.</p>
<p>We can specify the schema changes by using concrete <code>PQ</code>; when the schema doesn't change, we can use <code>MonadPQ</code> constraint (e.g., <code>cleanUp :: (MonadPQ DB m) => m ())</code>. In the end, we’ll turn either into <code>IO</code>:</p>
<pre><code class="language-haskell">withConnection Hardcoded.connectionString
$ cleanUp
</code></pre>
<p>Let’s insert a product:</p>
<pre><code class="language-haskell">insertProduct :: Statement DB BasicProduct ()
insertProduct =
manipulation
$ insertInto_
#product
(Values_ (Default `as` #id :* Set (param @1) `as` #label :* Set (param @2) `as` #description))
</code></pre>
<p>A <a href="https://hackage.haskell.org/package/squeal-postgresql-0.9.1.3/docs/Squeal-PostgreSQL-Session-Statement.html#t:Statement"><code>Statement</code></a> is either a <a href="https://hackage.haskell.org/package/squeal-postgresql-0.9.1.3/docs/Squeal-PostgreSQL-Statement.html#v:Manipulation"><code>Manipulation</code></a> or a <a href="https://hackage.haskell.org/package/squeal-postgresql-0.9.1.3/docs/Squeal-PostgreSQL-Session-Statement.html#v:Query"><code>Query</code></a> that can be run in a <a href="https://hackage.haskell.org/package/squeal-postgresql-0.9.1.3/docs/Squeal-PostgreSQL-Session-Monad.html#v:MonadPQ"><code>MonadPQ</code></a>.</p>
<p>We use <code>manipulation</code> and <code>insertInto_</code> to construct an insert. We pass a table and what to insert. <code>Values_</code> describes a single <a href="https://hackage.haskell.org/package/squeal-postgresql-0.9.1.3/docs/Squeal-PostgreSQL-Type-List.html#t:NP">n-ary product</a>, where we must match all the columns. We can use <code>Default</code> value for id and set the rest using relevant parameters.</p>
<p>And then, we use <a href="https://hackage.haskell.org/package/squeal-postgresql-0.9.1.3/docs/Squeal-PostgreSQL-Session-Monad.html#v:executePrepared_"><code>executePrepared_</code></a> to run a statement that returns nothing. The function prepares the statement and runs it on each element.</p>
<pre><code class="language-haskell">insertStuff :: (MonadPQ DB m) => m ()
insertStuff = do
executePrepared_
insertProduct
[ BasicProduct "Wood Screw Kit 1" (Just "245-pieces")
, BasicProduct "Wood Screw Kit 2" Nothing
]
</code></pre>
<p><code>insertInto_</code> is a specialized version of <code>insertInto</code> with <a href="https://hackage.haskell.org/package/squeal-postgresql-0.9.1.3/docs/Squeal-PostgreSQL-Manipulation-Insert.html#v:OnConflictDoRaise"><code>OnConflictDoRaise</code></a> (what to do in case of conflict) and no <a href="https://hackage.haskell.org/package/squeal-postgresql-0.9.1.3/docs/Squeal-PostgreSQL-Manipulation.html#t:ReturningClause"><code>ReturningClause</code></a> (what to return). <code>ReturningClause</code> returns a value based on each row; for example, we can use it to return the created <code>id</code>:</p>
<pre><code class="language-haskell">insertCategory :: Statement DB Category (Only Int32)
insertCategory =
manipulation
$ insertInto
#category
(Values_ (Default `as` #id :* Set (param @1) `as` #label))
OnConflictDoRaise
(Returning_ (#id `as` #fromOnly))
</code></pre>
<p>Note that we have to use <code>Only</code> and <code>#fromOnly</code>, because we can’t use primitive types (because they don’t have named labels that the library relies on).</p>
<p>This time we have to use <code>executePrepared</code>, which returns a list of results:</p>
<pre><code class="language-haskell">insertStuff :: (MonadPQ DB m, MonadIO m) => m ()
insertStuff = do
result :: [Result (Only Int32)] <-
executePrepared insertCategory [Category "Screws", Category "Wood Screws", Category "Concrete Screws"]
rows <- traverse getRows result
liftIO $ putStrLn $ "Inserted categories: " <> show rows
</code></pre>
<p>We use <code>getRows</code> to get all rows from a <code>Result</code>.</p>
<h3>How to query data</h3>
<p>To retrieve data, we also write <code>Statement</code>s, this time using <code>query</code> and <code>select_</code>:</p>
<pre><code class="language-haskell">query1 :: Statement DB () BasicProduct
query1 =
query
$ select_
(#product ! #label :* #product ! #description)
(from (table #product))
</code></pre>
<p>The query returns all the products from the table.</p>
<blockquote>
<p>💡 Note that we can use <code>printSQL</code> to print statements and see what sql queries get executed.</p>
</blockquote>
<hr>
<p>💡 We <strong>can’t</strong> return tuples or primitive types because they don't have named fields. You must define a new datatype and derive Squeal typeclasses to return something new.</p>
<p>If you try using tuples, you get an error:</p>
<pre><code>The type `(Text, Text)' is not a record type.
It has no labelled fields.
</code></pre>
<hr>
<p>And then we <code>execute</code> the query:</p>
<pre><code class="language-haskell">insertStuff :: (MonadPQ DB m, MonadIO m) => m ()
insertStuff = do
result1 <- execute query1
rows1 <- getRows result1
liftIO $ putStrLn $ "Query 1: " <> show rows1
</code></pre>
<p>We can select specific fields and narrow down the results:</p>
<pre><code class="language-haskell">query2 :: Statement DB (Only Text) BasicProduct
query2 =
query
$ select_
(#product ! #label :* #product ! #description)
(from (table #product) & where_ (#product ! #label .== (param @1)))
</code></pre>
<p>We use <code>where_</code> to filter the rows and <code>.==</code> to compare for equality.</p>
<p>This time, we use <code>executeParams</code> to pass the parameters into the statement:</p>
<pre><code class="language-haskell">queryData :: PQ DB DB IO ()
queryData = do
result2 <- executeParams query2 (Only "Wood Screw Kit 1") >>= getRows
liftIO $ putStrLn $ "Query 2: " <> show result2
</code></pre>
<p>We can also use <code>in_</code>:</p>
<pre><code class="language-haskell">query3 labels =
query
$ select_
(#product ! #label :* #product ! #description)
(from (table #product) & where_ (#product ! #label `in_` labels))
</code></pre>
<pre><code class="language-haskell">do
(result3 :: [BasicProduct]) <- execute (query3 ["Wood Screw Kit 2", "Wood Screw Kit 3"]) >>= getRows
liftIO $ putStrLn $ "Query 3: " <> show result3
</code></pre>
<h3>How to use transactions</h3>
<p>We can wrap computation in <code>transactionally_</code>:</p>
<pre><code class="language-haskell">insertWithTransaction :: PQ DB DB IO ()
insertWithTransaction =
transactionally_
( do
result1 <- executePrepared insertProduct [BasicProduct "Drywall Screws Set" (Just "8000pcs")]
productIds <- join <$> traverse getRows result1
result2 <- executePrepared insertCategory [Category "Drywall Screws"]
categoryIds <- join <$> traverse getRows result2
case (productIds, categoryIds) of
([Only productId], [Only categoryId]) -> do
executePrepared_ insertProductCategory [(productId, categoryId)]
executePrepared_ insertListing [(productId, 10)]
_ ->
throwM $ userError "Failed to insert product/category"
)
>> liftIO (putStrLn $ "Insert with transaction")
</code></pre>
<p>In case of exception, it rollbacks the transaction and rethrows the exception.</p>
<h3>How to query using joins</h3>
<p>We use <code>innerJoin</code> and <code>leftOuterJoin</code> to join the tables:</p>
<pre><code class="language-haskell">query1 :: Statement DB (Only Int32) Listing
query1 =
query
$ select_
(#w ! #quantity `as` #quantity :* #p ! #label `as` #label :* #p ! #description `as` #description :* #c ! #label `as` #category)
( from
( table (#warehouse `as` #w)
& innerJoin
(table (#product `as` #p))
(#w ! #product_id .== #p ! #id)
& leftOuterJoin
(table (#product_category `as` #pc))
(#pc ! #product_id .== #p ! #id)
& leftOuterJoin
(table (#category `as` #c))
(#c ! #id .== #pc ! #category_id)
)
& where_ (#w ! #quantity .> (param @1))
)
</code></pre>
<p>Which generates:</p>
<pre><code class="language-sql">SELECT "w"."quantity" AS "quantity",
"p"."label" AS "label",
"p"."description" AS "description",
"c"."label" AS "category"
FROM "warehouse" AS "w"
inner join "product" AS "p"
ON ( "w"."product_id" = "p"."id" )
left outer join "product_category" AS "pc"
ON ( "pc"."product_id" = "p"."id" )
left outer join "category" AS "c"
ON ( "c"."id" = "pc"."category_id" )
WHERE ( "w"."quantity" > ( $1 :: int4 ) )
</code></pre>
<h3>Errors</h3>
<p>If you forget or mistype anything, most of the time, the error messages are rarely simple.</p>
<p>Sometimes, they overwhelm:</p>
<pre><code class="language-haskell">_ :: NP
(Aliased
(Optional
(Expression
'Ungrouped
'[]
'[]
'["public"
::: '["product" ::: 'Table (ProductConstraints :=> ProductColumns),
"category" ::: 'Table (CategoryConstraints :=> CategoryColumns),
"product_category"
::: 'Table (ProductCategoryConstraints :=> ProductCategoryColumns),
"warehouse"
::: 'Table (WarehouseConstraints :=> WarehouseColumns)]]
'[ 'NotNull 'PGtext, 'Null 'PGtext]
from0)))
'["description" ::: ('NoDef :=> 'Null 'PGtext)]
Where: ‘from0’ is an ambiguous type variable
</code></pre>
<p>Sometimes, they leak:</p>
<pre><code class="language-haskell">Couldn't match type: TupleOf (TupleCodeOf Text (SOP.Code Text))
with: null10 'PGtext : xs0
</code></pre>
<pre><code class="language-haskell">Ambiguous type variable ‘y0’ arising from a use of ‘manipulation’
prevents the constraint ‘(SOP.Generic y0)’ from being solved.
</code></pre>
<pre><code class="language-haskell">Couldn't match type: '["description"
::: ('NoDef :=> 'Null 'PGtext)]
with: '[]
</code></pre>
<p>Sometimes, they <strong>really</strong> leak:</p>
<pre><code class="language-haskell">Couldn't match type: records-sop-0.1.1.1:Generics.SOP.Record.ExtractTypesFromRecordCode
(records-sop-0.1.1.1:Generics.SOP.Record.ToRecordCode_Datatype
y (SOP.DatatypeInfoOf y) (SOP.Code y))
with: records-sop-0.1.1.1:Generics.SOP.Record.GetSingleton
(SOP.Code y)
arising from a use of ‘manipulation’
</code></pre>
<p>But when it comes to runtime SQL errors, the library provides a convenient <code>SquealException</code> for exceptions that Squeal can throw and a nice API for working with them built on top of <code>exceptions</code>. For example, we can use <code>catchSqueal</code>:</p>
<pre><code class="language-haskell">errors :: PQ DB DB IO ()
errors = do
insertDuplicateScrew
insertDuplicateScrew
`catchSqueal` (\err -> liftIO $ putStrLn $ "Caught Squeal/SQL Error: " <> displayException err)
where
insertDuplicateScrew = executePrepared_ insertProduct [BasicProduct "Duplicate screw" Nothing]
insertProduct =
manipulation
$ insertInto_
#product
(Values_ (Default `as` #id :* Set (param @1) `as` #label :* Set (param @2) `as` #description))
</code></pre>
<h3>Resources</h3>
<p>The library comes with a quickstart and <a href="https://github.com/morphismtech/squeal/raw/dev/squeal-core-concepts-handbook.md">Core Concepts Handbook</a>.</p>
<h3>Migrations</h3>
<p>The library has a <a href="https://hackage.haskell.org/package/squeal-postgresql-0.9.1.3/docs/Squeal-PostgreSQL-Session-Migration.html#t:Migration"><code>Migration</code></a> module to change the database schema over time. They support linear, pure or impure, one-way or rewindable migrations.</p>
<h3>In summary</h3>
<p>Squeal is another type-safe postgres library not suitable for beginners. You should be comfortable working on the type level, reading generic-related errors, etc. The library uses generic encodings (<a href="https://hackage.haskell.org/package/generics-sop"><code>generics-sop</code></a>) of records/tuples, which keep getting into the error messages.</p>
<h2><code>opaleye</code></h2>
<p><em>Okay, what if we did something quite similar but quite different?</em></p>
<p>Opaleye is <em>“an SQL-generating DSL targeting PostgreSQL. Allows Postgres queries to be written within Haskell in a typesafe and composable fashion”</em>.</p>
<p>Install <a href="https://hackage.haskell.org/package/opaleye"><code>opaleye</code></a> (<code>0.10.1.0</code> released in 2023) and <code>product-profunctors</code>, which the library uses under the hood.</p>
<p><code>opaleye</code> is built on top of <code>postgresql-simple</code>, which is used for connection management, transaction support, serialization, and deserialization.</p>
<blockquote>
<p>💡 We assume you’ve seen the part on <code>postgresql-simple</code>.</p>
</blockquote>
<h3>How to connect to a database</h3>
<p>We use <code>postgresql-simple</code> straight away. Reminder:</p>
<pre><code class="language-haskell">connectionInfo :: ConnectInfo
connectionInfo =
defaultConnectInfo
{ connectHost = Hardcoded.host
, connectDatabase = Hardcoded.database
, connectUser = Hardcoded.user
, connectPassword = Hardcoded.password
}
</code></pre>
<pre><code class="language-haskell">Simple.withConnect connectionInfo $ \connection -> do
doFoo connection
doBar connection
</code></pre>
<h3>How to define tables</h3>
<p>We define a table using the <code>table</code> function — specify the table name and the type of fields.</p>
<pre><code class="language-haskell">warehouseTable ::
Table
(Maybe (Field SqlInt4), ProductIdField, Field SqlInt4, Maybe (Field SqlTimestamp), Maybe (Field SqlTimestamp))
(Field SqlInt4, ProductIdField, Field SqlInt4, Field SqlTimestamp, Field SqlTimestamp)
warehouseTable =
table "warehouse"
$ p5
( tableField "id"
, pProductId (ProductId (tableField "product_id"))
, tableField "quantity"
, tableField "created"
, tableField "modified"
)
</code></pre>
<p><code>Table</code> takes <strong>write fields</strong> and <strong>view fields</strong>; for example, the first parameter (<code>id</code>) is auto-generated, so it’s optional on write (so we specify <code>Maybe (Field SqlInt4))</code> but always there on view/read (so we specify <code>Field SqlInt4</code>).</p>
<p><code>p5</code> is a tiny glue function from <code>product-profunctors</code>; the number corresponds to the tuple arity (number of columns). <em>We don’t need to know more than that.</em></p>
<p><code>tableField</code> infers a required or an optional field depending on the write type.</p>
<p><em>(We’ll cover <code>ProductId</code> a bit later)</em></p>
<p>We can also use records instead of tuples; for example, for product:</p>
<pre><code class="language-haskell">data Product' a b c = Product {pId :: a, pLabel :: b, pDescription :: c}
type Product = Product' ProductId Text (Maybe Text)
deriving instance Show Product
type ProductFieldWrite = Product' (ProductId' (Maybe (Field SqlInt4))) (Field SqlText) (FieldNullable SqlText)
type ProductField = Product' (ProductIdField) (Field SqlText) (FieldNullable SqlText)
</code></pre>
<p><em>Note that we prefix field names because we’ll have some derivable code that can’t handle duplicate record fields.</em></p>
<p><code>Product'</code> is polymorphic in all its fields. We’ll use <code>Product</code> in “normal” code and <code>ProductField</code> when interacting with a database. Because <strong>id</strong> is optional on write, we distinguish between <code>ProductFieldWrite</code> and <code>ProductField</code>.</p>
<p>We indicate nullable fields with <code>FieldNullable</code>, which will be converted into <code>Maybe</code> when executed.</p>
<p>We need some typeclass instances, which we can get with Template Haskell:</p>
<pre><code class="language-haskell">$(makeAdaptorAndInstance "pProduct" ''Product')
</code></pre>
<hr>
<p>💡 If you’d rather write these by hand, see <a href="https://hackage.haskell.org/package/product-profunctors/docs/Data-Profunctor-Product-TH.html">Data.Profunctor.Product.TH</a>.</p>
<hr>
<p>And then, we define the table:</p>
<pre><code class="language-haskell">productTable :: Table ProductFieldWrite ProductField
productTable =
table "product"
$ pProduct
Product
{ pId = pProductId $ ProductId $ tableField "id"
, pLabel = tableField "label"
, pDescription = tableField "description"
}
</code></pre>
<p>Note that instead of <code>pN</code>, we use <code>pProduct</code>, which we just generated with TH.</p>
<p>The library’s basic tutorial suggests using newtypes for ids. For example, we use one for the product id:</p>
<pre><code class="language-haskell">newtype ProductId' a = ProductId a
$(makeAdaptorAndInstance "pProductId" ''ProductId')
type ProductId = ProductId' Int
deriving instance Show ProductId
type ProductIdField = ProductId' (Field SqlInt4)
</code></pre>
<p><em>See the <a href="https://github.com/Zelenya/elephants">repo</a> for the rest of the boilerplate.</em></p>
<h3>How to modify data</h3>
<p>For raw queries, we can use <code>postgresql-simple</code>:</p>
<pre><code class="language-haskell">cleanUp :: Connection -> IO ()
cleanUp connection =
void $ Simple.execute_ connection "truncate warehouse, product_category, product, category"
</code></pre>
<p>Otherwise, we create an insert by using <code>Insert</code>:</p>
<pre><code class="language-haskell">insert1 :: Insert [ProductId]
insert1 =
Insert
{ iTable = productTable
, iRows =
[ Product (ProductId Nothing) "Wood Screw Kit 1" (maybeToNullable Nothing)
, Product (ProductId Nothing) "Wood Screw Kit 2" (maybeToNullable (Just "245-pieces"))
]
, iReturning = rReturning (\(p :: ProductField) -> p.pId)
, iOnConflict = Nothing
}
</code></pre>
<p>We specify the tables, rows to be inserted, conflict-handling strategy, and what to return. In this case, we return product id using <code>rReturning</code>.</p>
<p>And then we run the insert with <code>runInsert</code>:</p>
<pre><code class="language-haskell">insertStuff :: Connection -> IO ()
insertStuff connection = do
result1 <- runInsert connection insert1
putStrLn $ "Inserted products: " <> show result1
</code></pre>
<p>If we want to return the number of affected rows, we can use <code>rCount</code>:</p>
<pre><code class="language-haskell">insert2 :: Insert Int64
insert2 =
Insert
{ iTable = categoryTable
, iRows = [Category (CategoryId 1) "Screws", Category (CategoryId 2) "Wood Screws", Category (CategoryId 3) "Concrete Screws"]
, iReturning = rCount
, iOnConflict = Nothing
}
</code></pre>
<h3>How to query data</h3>
<p>The basic select is simple:</p>
<pre><code class="language-haskell">selectProduct :: Select ProductField
selectProduct = selectTable productTable
</code></pre>
<blockquote>
<p>💡 Note that we can use <code>showSql</code> to print <code>Select</code> and see what sql queries get executed.</p>
</blockquote>
<p>We run a select with <code>runSelect</code>:</p>
<pre><code class="language-haskell">queryData :: Connection -> IO ()
queryData connection = do
result1 :: [Product] <- runSelect connection selectProduct
putStrLn $ "Query 1: " <> show result1
</code></pre>
<p><code>runSelect</code> “<em>converts a "record" of Opaleye fields to a list of "records" of Haskell values.”</em> We must specify the return type (<code>[Product]</code>) to help type inference.</p>
<p>We can select specific fields and narrow down the results:</p>
<pre><code class="language-haskell">select2 :: Select (Field SqlText, FieldNullable SqlText)
select2 = do
(Product _ aLabel description) <- selectProduct
where_ (aLabel .== "Wood Screw Kit 2")
pure (aLabel, description)
</code></pre>
<pre><code class="language-haskell">result2 :: [(Text, Maybe Text)] <- runSelect connection select2
</code></pre>
<p>We use <code>where_</code> to filter the rows and <code>.==</code> to compare for equality. We can also use <code>in_</code>:</p>
<pre><code class="language-haskell">select3 :: Select (Field SqlText)
select3 = do
p <- selectProduct
where_ $ in_ ["Wood Screw Kit 2", "Wood Screw Kit 3"] p.pLabel
pure (p.pLabel)
</code></pre>
<pre><code class="language-haskell">result3 :: [Text] <- runSelect connection select3
</code></pre>
<h3>How to use transactions</h3>
<p>We use <code>postgresql-simple</code> for transactions:</p>
<pre><code class="language-haskell">insertWithTransaction :: Connection -> IO ()
insertWithTransaction connection = Simple.withTransaction connection $ do
[newProduct] :: [ProductId] <-
runInsert connection
$ Insert
{ iTable = productTable
, iRows = [Product (ProductId Nothing) "Drywall Screws Set" (maybeToNullable $ Just "8000pcs")]
, iReturning = rReturning (\(p :: ProductField) -> p.pId)
, iOnConflict = Nothing
}
[newCategory] :: [CategoryId] <-
runInsert connection
$ Insert
{ iTable = categoryTable
, iRows = [Category (CategoryId 123) "Drywall Screws"]
, iReturning = rReturning (.cId)
, iOnConflict = Nothing
}
void
$ runInsert connection
$ Insert
{ iTable = productCategoryTable
, iRows = [Mapping (toFields newProduct) (toFields newCategory)]
, iReturning = rCount
, iOnConflict = Nothing
}
void
$ runInsert connection
$ Insert
{ iTable = warehouseTable
, iRows = [(Nothing, (toFields newProduct), 10, Nothing, Nothing)]
, iReturning = rCount
, iOnConflict = Nothing
}
putStrLn $ "Insert with transaction"
</code></pre>
<h3>How to query using joins</h3>
<p>Opaleye provides a couple of APIs for joins. They recommend using <a href="https://hackage.haskell.org/package/opaleye-0.10.0.0/docs/Opaleye-Operators.html#v:where_"><code>where_</code></a> directly for inner joins and <a href="https://hackage.haskell.org/package/opaleye-0.10.0.0/docs/Opaleye-Join.html#v:optional"><code>optional</code></a> for left/right joins. Which gives us something like this:</p>
<pre><code class="language-haskell">join :: Select (Field SqlInt4, Field SqlText, FieldNullable SqlText, MaybeFields (Field SqlText))
join = do
(_, wProductId, quantity, _, _) <- selectTable warehouseTable
p <- selectTable productTable
mpc <- optional $ do
pc <- selectTable productCategoryTable
where_ $ pc.productId .=== p.pId
pure pc
mc <- optional $ do
c <- selectTable categoryTable
where_ $ isJustAnd mpc $ \pc -> c.cId .=== pc.categoryId
pure c
where_ $ wProductId .=== p.pId
where_ $ quantity .> 3
let category = cLabel <$> mc
pure (quantity, p.pLabel, p.pDescription, category)
</code></pre>
<blockquote>
<p>💡 Note that we use <code>isJustAnd</code> that will be added to Opaleye in the future.</p>
<pre><code class="language-haskell">isJustAnd :: MaybeFields a -> (a -> Field SqlBool) -> Field SqlBool
isJustAnd ma cond = matchMaybe ma $ \case
Nothing -> sqlBool False
Just a -> cond a
</code></pre>
</blockquote>
<p>Which generates:</p>
<pre><code class="language-SQL">SELECT
"quantity2_1" as "result1_7",
"label1_2" as "result2_7",
"description2_2" as "result3_7",
NOT (("rebind0_6") IS NULL) as "result4_7",
"label1_5" as "result5_7"
FROM (SELECT
*
FROM (SELECT *
FROM
(SELECT *
FROM
(SELECT
*
FROM (SELECT
"id" as "id0_1",
"product_id" as "product_id1_1",
"quantity" as "quantity2_1",
"created" as "created3_1",
"modified" as "modified4_1"
FROM "warehouse" as "T1") as "T1",
LATERAL
(SELECT
"id" as "id0_2",
"label" as "label1_2",
"description" as "description2_2"
FROM "product" as "T1") as "T2") as "T1"
LEFT OUTER JOIN
LATERAL
(SELECT
TRUE as "rebind0_4",
*
FROM (SELECT
*
FROM (SELECT
"product_id" as "product_id0_3",
"category_id" as "category_id1_3"
FROM "product_category" as "T1") as "T1"
WHERE (("product_id0_3") = ("id0_2"))) as "T1") as "T2"
ON
TRUE) as "T1"
LEFT OUTER JOIN
LATERAL
(SELECT
TRUE as "rebind0_6",
*
FROM (SELECT
*
FROM (SELECT
"id" as "id0_5",
"label" as "label1_5"
FROM "category" as "T1") as "T1"
WHERE (CASE WHEN NOT (("rebind0_4") IS NULL) THEN ("id0_5") = ("category_id1_3") ELSE CAST(FALSE AS boolean) END)) as "T1") as "T2"
ON
TRUE) as "T1"
WHERE (("quantity2_1") > (CAST(3 AS integer))) AND (("product_id1_1") = ("id0_2"))) as "T1"
</code></pre>
<h3>Errors</h3>
<p>Once again, type-safety and query validation equal compilation errors.</p>
<p>But because there isn’t much “type-level magic”, we only need to occasionally help the compiler with type inference. And it’s mainly about input and return types — not intermediate/internal library structures. For example, <code>[Product]</code> in this snippet:</p>
<pre><code class="language-haskell">result :: [Product] <- runSelect connection selectProduct
where
selectProduct = selectTable productTable
</code></pre>
<p>Sometimes, if you don’t specify enough types, profunctors show up:</p>
<pre><code class="language-haskell">Ambiguous type variable ‘haskells0’ arising from a use of ‘runSelect’
prevents the constraint ‘(Default
FromFields fields0 Product)’ from being solved.
Probable fix: use a type annotation to specify what ‘haskells0’ should be.
</code></pre>
<p>Runtime sql errors are again from <code>postgresql-simple</code>. Review the relevant error section if you need a reminder.</p>
<pre><code class="language-haskell">errors :: Connection -> IO ()
errors connection = do
insertDuplicateScrew
insertDuplicateScrew
`catch` (\err@SqlError{} -> putStrLn $ "Caught SQL Error: " <> displayException err)
where
insertDuplicateScrew =
void
$ runInsert connection
$ Insert
{ iTable = productTable
, iRows = [Product (ProductId Nothing) "Duplicate screw" (maybeToNullable Nothing)]
, iReturning = rCount
, iOnConflict = Nothing
}
</code></pre>
<h3>Resources</h3>
<p>There are a couple of basic tutorials in the repo and some external ones.</p>
<p>One thing to remember: sometimes, the library provides multiple ways of doing things (for example, left joins using <code>optional</code> vs. deprecated <code>leftJoin</code> or monadic vs. arrow syntax), and documentation/tutorials can do it one way or even deprecated way.</p>
<h3>Migrations</h3>
<p>Opaleye assumes a database already exists — no support for migrations or creating tables and databases.</p>
<h3>In summary</h3>
<p>Opaleye allows us to define tables and write type-safe postgres queries using Haskell code.</p>
<p>The library uses <code>product-profunctors</code> and typeclasses. Both only come up in copy-pasteable boilerplate and when you under-specify the return types. No deep knowledge is required.</p>
<h2><code>rel8</code></h2>
<p><em>Okay, what if we did something quite similar but quite different?</em></p>
<p>Rel8 “<em>is a Haskell library for interacting with PostgreSQL databases”</em>, which aims to be concise, inferrable, and familiar.</p>
<p>For the database connection, instead of <code>postgresql-simple</code>, <code>rel8</code> uses Hasql.</p>
<p>Install <code>rel8</code> (<code>1.4.1.0</code> released in 2023), <code>hasql</code>, and <code>hasql-transaction</code>.</p>
<p>We bring back the <code>TypeFamilies</code> extension and (in case you haven’t already) <code>DuplicateRecordFields</code>. The latter is required to disambiguate the record fields when working with inserts, updates, and deletes…</p>
<blockquote>
<p>💡 We assume you’ve seen the parts on <code>postgresql-simple</code>, <code>hasql</code>, and <code>opaleye</code>.</p>
</blockquote>
<h3>How to connect to a database</h3>
<p>We use Hasql. Reminder:</p>
<pre><code class="language-haskell">Right connection <- getConnection
</code></pre>
<pre><code class="language-haskell">getConnection :: IO (Either ConnectionError Connection)
getConnection =
acquire $ settings Hardcoded.host Hardcoded.portNumber Hardcoded.user Hardcoded.password Hardcoded.database
</code></pre>
<h3>How to define tables</h3>
<p>First, we describe the structural mapping of the tables. Take for instance <code>Product</code>:</p>
<pre><code class="language-haskell">newtype ProductId = ProductId Int64
deriving newtype (DBEq, DBType, Eq, Show)
data Product f = Product
{ id :: Column f ProductId
, label :: Column f Text
, description :: Column f (Maybe Text)
}
deriving (Generic)
deriving anyclass (Rel8able)
deriving stock instance (f ~ Result) => Show (Product f)
</code></pre>
<p>We define fields with <code>Column</code> and derive the <code>Rel8able</code> instance. We also declare a newtype for product id with a few instances.</p>
<p>Imagine that the last line is just <code>deriving (Show)</code>.</p>
<p>Then, we describe a <code>TableSchema</code> for each table. The relevant table looks like this:</p>
<pre><code class="language-haskell">productSchema :: TableSchema (Product Name)
productSchema =
TableSchema
{ name = "product"
, schema = Nothing
, columns =
Product
{ id = "id"
, label = "label"
, description = "description"
}
}
</code></pre>
<p>Note that defining columns looks repetitive — we can use some generics machinery to get that information from the <code>Rel8able</code>:</p>
<pre><code class="language-haskell">productSchema :: TableSchema (Product Name)
productSchema =
TableSchema
{ name = "product"
, schema = Nothing
, columns = namesFromLabels @(Product Name)
}
</code></pre>
<blockquote>
<p>💡 <code>namesFromLabels</code> generates a table schema where every column name corresponds precisely to the field's name. Alternatively, we can use <code>namesFromLabelsWith</code>.</p>
</blockquote>
<p>See the <a href="https://github.com/Zelenya/elephants">repo</a> for the rest of the boilerplate.</p>
<h3>How to modify data</h3>
<p>For raw queries, we can use Hasql:</p>
<pre><code class="language-haskell">cleanUp :: Connection -> IO (Either QueryError ())
cleanUp connection = run cleanUpSession connection
where
cleanUpSession = statement () $ Statement rawSql E.noParams D.noResult True
rawSql = "truncate warehouse, product_category, product, category"
</code></pre>
<p>Otherwise, we create <code>Insert</code>:</p>
<pre><code class="language-haskell">insert1 :: Statement () [ProductId]
insert1 =
insert
$ Insert
{ into = productSchema
, rows =
values
[ Product unsafeDefault "Wood Screw Kit 1" null
, Product unsafeDefault "Wood Screw Kit 2" (lit $ Just "245-pieces")
]
, returning = Projection (.id)
, onConflict = Abort
}
</code></pre>
<p>We’ve seen this in Opaleye’s insert: the table, rows to insert, conflict-handling strategy, and what to return.</p>
<p>We use <code>unsafeDefault</code> for sql <code>DEFAULT</code>, <a href="https://hackage.haskell.org/package/rel8-1.4.1.0/docs/Rel8.html#v:lit"><code>lit</code></a> to turn Haskell values into expressions, and <a href="https://hackage.haskell.org/package/rel8-1.4.1.0/docs/Rel8.html#v:values"><code>values</code></a> to construct a query out of the given rows.</p>
<hr>
<p>💡 Note that <a href="https://hackage.haskell.org/package/rel8-1.4.1.0/docs/Rel8.html#v:unsafeDefault"><code>unsafeDefault</code></a> is named unsafe for a reason; see the docs.</p>
<hr>
<p>And run this like any other Hasql statement:</p>
<pre><code class="language-haskell">result1 <- run (statement () insert1) connection
</code></pre>
<p>If we want to return the number of affected rows, we can use <code>NumberOfRowsAffected</code>:</p>
<pre><code class="language-haskell">Insert
{ into = categorySchema
, rows =
values
[ Category unsafeDefault "Screws"
, Category unsafeDefault "Wood Screws"
, Category unsafeDefault "Concrete Screws"
]
, returning = NumberOfRowsAffected
, onConflict = Abort
}
</code></pre>
<h3>How to query data</h3>
<p>We build select statements using <code>Query</code>. We select all rows from a table using <code>each</code> and turn (run) the query into <code>Statement</code> using <code>select</code>:</p>
<pre><code class="language-haskell">select1 :: Statement () [Product Result]
select1 = select $ each productSchema
</code></pre>
<blockquote>
<p>💡 Note that we can use <code>showQuery</code> to print sql queries that will be executed.</p>
</blockquote>
<p>And once again we run the statement:</p>
<pre><code class="language-haskell">result1 <- run (statement () select1) connection
</code></pre>
<p>We can select specific fields and narrow down the results:</p>
<pre><code class="language-haskell">select2 :: Statement () [(Text, Maybe Text)]
select2 = select $ do
p <- each productSchema
where_ $ p.label ==. "Wood Screw Kit 2"
pure (p.label, p.description)
</code></pre>
<p>We use <code>where_</code> to filter the rows and <code>==.</code> to compare for equality. We can also use <code>in_</code>:</p>
<pre><code class="language-haskell">select3 :: Statement () [Text]
select3 = select $ do
p <- each productSchema
where_ $ p.label `in_` ["Wood Screw Kit 2", "Wood Screw Kit 3"]
pure p.label
</code></pre>
<p><em>Note that the order of parameters is different from Opaleye.</em></p>
<h3>How to use transactions</h3>
<p>We use Hasql for transactions:</p>
<pre><code class="language-haskell">insertWithTransaction :: Connection -> IO ()
insertWithTransaction connection = do
result <- run (transaction Serializable Write insertAll) connection
putStrLn $ "Insert with transaction: " <> show result
where
insertAll = do
productIds <-
Transaction.statement ()
$ insert
$ Insert
{ into = productSchema
, rows = values [Product unsafeDefault "Drywall Screws Set" (lit $ Just "8000pcs")]
, returning = Projection (.id)
, onConflict = Abort
}
-- insert category
-- insert mapping
-- insert warehouse listing
</code></pre>
<h3>How to query using joins</h3>
<p>Rel8 doesn’t have a specific join operation — we use <code>where_</code> (or <code>filter</code>) to filter the results and <code>optional</code> to do what outer joins do.</p>
<pre><code class="language-haskell">queryWithJoins :: Connection -> IO ()
queryWithJoins connection = do
result1 <- run (statement () join) connection
putStrLn $ "Query with join: " <> show result1
where
join :: Statement () [(Int32, Text, Maybe Text, Maybe Text)]
join = select joinQuery
joinQuery = do
w <- each warehouseSchema
p <- productsInWarehouse w
pc <- optional $ mappingsForProduct p
c <- traverseMaybeTable categoriesForMapping pc
where_ $ w.quantity >. 3
let category = maybeTable null (nullify . (.label)) c
pure (w.quantity, p.label, p.description, category)
productsInWarehouse :: Warehouse Expr -> Query (Product Expr)
productsInWarehouse w =
each productSchema >>= filter (\p -> p.id ==. w.product_id)
mappingsForProduct :: Product Expr -> Query (ProductCategory Expr)
mappingsForProduct p = do
each productCategorySchema >>= filter (\pc -> pc.product_id ==. p.id)
categoriesForMapping :: ProductCategory Expr -> Query (Category Expr)
categoriesForMapping pc =
each categorySchema >>= filter (\c -> c.id ==. pc.category_id)
</code></pre>
<p>We extract “each join” into a specialized function to make the code cleaner (according to the Rel8 tutorials). We use <code>optional</code> and <code>traverseMaybeTable</code> to account for the partiality of queries. <code>MaybeTable</code> results from an outer join, which we unwrap with <code>maybeTable</code>.</p>
<p><code>filter</code> is an alternative way to write <code>where</code> clauses.</p>
<p>The generated query:</p>
<pre><code class="language-haskell">SELECT
CAST("quantity2_1" AS int4) as "_1",
CAST("label1_3" AS text) as "_2",
CAST("description2_3" AS text) as "_3",
CAST(CASE WHEN ("rebind0_8") IS NULL THEN CAST(NULL AS text) ELSE "label1_12" END AS text) as "_4"
FROM (SELECT
*
FROM (SELECT *
FROM
(SELECT *
FROM
(SELECT
*
FROM (SELECT
"id" as "id0_1",
"product_id" as "product_id1_1",
"quantity" as "quantity2_1",
"created" as "created3_1",
"modified" as "modified4_1"
FROM "warehouse" as "T1") as "T1",
LATERAL
(SELECT
"id" as "id0_3",
"label" as "label1_3",
"description" as "description2_3"
FROM "product" as "T1") as "T2"
WHERE (("id0_3") = ("product_id1_1"))) as "T1"
LEFT OUTER JOIN
LATERAL
(SELECT
TRUE as "rebind0_8",
*
FROM (SELECT
*
FROM (SELECT
"product_id" as "product_id0_6",
"category_id" as "category_id1_6"
FROM "product_category" as "T1") as "T1"
WHERE (("product_id0_6") = ("id0_3"))) as "T1") as "T2"
ON
TRUE) as "T1"
LEFT OUTER JOIN
LATERAL
(SELECT
TRUE as "rebind0_14",
*
FROM (SELECT
*
FROM (SELECT
0) as "T1",
LATERAL
(SELECT
"id" as "id0_12",
"label" as "label1_12"
FROM "category" as "T1") as "T2"
WHERE (("id0_12") = ("category_id1_6")) AND (("rebind0_8") IS NOT NULL)) as "T1") as "T2"
ON
TRUE) as "T1"
WHERE (("quantity2_1") > (CAST(3 AS int4))) AND (((("rebind0_14") IS NULL) AND (("rebind0_8") IS NULL)) OR ((("rebind0_14") = ("rebind0_8")) AND (COALESCE(("rebind0_14") = ("rebind0_8"),FALSE))))) as "T1"
</code></pre>
<p>Which looks similar to the relevant Opaleye query in the previous section.</p>
<h3>Errors</h3>
<p>On top of type-safety, according to the docs, <em>“Rel8 aims to have excellent and predictable type inference”</em>. And they deliver — type inference rarely needs any guidance, and the compilation errors are pretty good.</p>
<p>Although it’s possible to introduce runtime errors using unsafe operations like unsafeDefault, the name is explicit, well documented, and has proper alternatives.</p>
<p>Runtime errors come from Hasql — all error-reporting is explicit and is presented using <code>Either</code>. As a reminder, violating the constraint returns a familiar error:</p>
<pre><code class="language-haskell">errors :: Connection -> IO ()
errors connection = do
Left failure <-
run insertDuplicateScrew connection
>> run insertDuplicateScrew connection
putStrLn $ "Constraint violation (Left): " <> show failure
where
insertDuplicateScrew =
statement ()
$ insert
$ Insert
{ into = productSchema
, rows = values [Product unsafeDefault "Duplicate screw" null]
, returning = NumberOfRowsAffected
, onConflict = Abort
}
</code></pre>
<blockquote>
<p><code>Constraint violation (Left): QueryError "INSERT INTO \"product\" (\"id\",\n \"label\",\n \"description\")\nVALUES\n(DEFAULT,CAST(E'Duplicate screw' AS text),CAST(NULL AS text))" [] (ResultError (ServerError "23505" "duplicate key value violates unique constraint \"product_label_key\"" (Just "Key (label)=(Duplicate screw) already exists.") Nothing Nothing))</code></p>
</blockquote>
<h3>Resources</h3>
<p>Rel8 has the Getting Started tutorial, the Concepts documentation, the cookbook, and good API docs. This would have been one of the best coverages, but unfortunately, some basic snippets (like running selects or constructing inserts) aren’t valid anymore.</p>
<p>Also, you have to keep in mind <code>hasql</code>.</p>
<h3>Migrations</h3>
<p>Rel8 assumes a database already exists — no support for migrations or creating tables and databases.</p>
<h3>In summary</h3>
<p>Rel8 also allows us to write type-safe postgres queries using <em>concise</em>, <em>inferrable</em>, and <em>familiar</em> Haskell code. It builds on top of <code>opaleye</code> and <code>hasql</code>, and you must be somewhat familiar with the latter.</p>
<h2><code>selda</code></h2>
<p><em>Okay, what if we did something quite similar but quite different?</em></p>
<p><a href="https://selda.link/">Selda</a> <em>“is a Haskell library for interacting with SQL-based relational databases”</em> (PostgreSQL or SQLite). <em>“The library was inspired by <a href="https://en.wikipedia.org/wiki/Language_Integrated_Query">LINQ</a> and <a href="http://hackage.haskell.org/package/opaleye">Opaleye</a>.”</em></p>
<p>Install <code>selda</code> (<code>0.5.2.0</code> released in 2022) and <code>selda-postgresql</code>.</p>
<p>Enable <code>OverloadedLabels</code>.</p>
<h3>How to connect to a database</h3>
<p>Create connection info:</p>
<pre><code class="language-haskell">connectionInfo :: PGConnectInfo
connectionInfo =
PGConnectInfo
{ pgHost = Hardcoded.host
, pgPort = Hardcoded.portNumber
, pgDatabase = Hardcoded.database
, pgUsername = Just Hardcoded.user
, pgPassword = Just Hardcoded.password
, pgSchema = Nothing
}
</code></pre>
<p>And use it with <code>withPostgreSQL</code>:</p>
<pre><code class="language-haskell">withPostgreSQL connectionInfo $ do
doFoo
doBar
</code></pre>
<h3>How to define tables</h3>
<p>First, we declare normal types and derive <code>SqlRow</code>, for example, for product:</p>
<pre><code class="language-haskell">data Product = Product
{ id :: ID Product
, label :: Text
, description :: Maybe Text
}
deriving (Generic, Show)
deriving anyclass (SqlRow)
</code></pre>
<p>Then, we use table to declare a table:</p>
<pre><code class="language-haskell">productTable :: Table Product
productTable = table "product" [#id :- autoPrimary]
</code></pre>
<p>We specify constraints by linking selectors of the table to the definitions. We use <code>autoPrimary</code> for auto-incrementing primary keys, <code>primary</code> for regular primary keys, and <code>foreignKey</code> for foreign keys:</p>
<pre><code class="language-haskell">mappingTable :: Table ProductCategory
mappingTable =
table
"product_category"
[ #product_id :- foreignKey productTable #id
, #category_id :- foreignKey categoryTable #id
]
</code></pre>
<p><em>See the <a href="https://github.com/Zelenya/elephants">repo</a> for the rest of the boilerplate.</em></p>
<h3>How to modify data</h3>
<p>We can use <code>rawStm</code> from <code>Database.Selda.Unsafe</code> to execute raw queries:</p>
<pre><code>cleanUp :: SeldaM PG ()
cleanUp =
rawStm "truncate warehouse, product_category, product, category"
</code></pre>
<p><a href="https://hackage.haskell.org/package/selda-0.5.2.0/docs/Database-Selda.html#t:SeldaM"><code>SeldaM</code></a> is an alias for <code>SeldaT IO</code>, <code>SeldaT</code> is a Selda computation — a concrete implementation (of <code>MonadSelda</code>) with Selda SQL capabilities.</p>
<p>At the end we’ll turn it into <code>IO</code>:</p>
<pre><code class="language-haskell">withPostgreSQL connectionInfo $ do
cleanUp
</code></pre>
<p>To insert data, we can use <code>insert_</code> that doesn’t return anything, <code>insert</code> that returns the number of inserted rows, and <code>insertWithPK</code> that returns the primary key of the last inserted row.</p>
<pre><code class="language-haskell">insertStuff :: SeldaM PG ()
insertStuff = do
productId <-
insertWithPK
productTable
[ Product def "Wood Screw Kit 1" (Just "245-pieces")
, Product def "Wood Screw Kit 2" Nothing
]
liftIO $ putStrLn $ "Inserted product with id: " <> show productId
</code></pre>
<pre><code class="language-haskell"> rows <-
insert
categoryTable
[Category def "Screws", Category def "Wood Screws", Category def "Concrete Screws"]
liftIO $ putStrLn $ "Inserted categories: " <> show rows
</code></pre>
<p>We use <code>def</code> when we want to use the default value, which is the case with ids.</p>
<h3>How to query data</h3>
<p>We can get all the rows from the given table using <code>select</code>:</p>
<pre><code class="language-haskell"> selectProduct :: Query t (Row t Product)
selectProduct = select productTable
</code></pre>
<blockquote>
<p>💡 Note that we can use <code>compile</code> from <code>Database.Selda.Debug</code> to print sql queries that will be executed.</p>
</blockquote>
<p>And execute the query with <code>query</code>:</p>
<pre><code class="language-haskell">queryData :: SeldaT PG IO ()
queryData = do
result1 <- query selectProduct
liftIO $ putStrLn $ "Query 1: " <> show result1
</code></pre>
<hr>
<p>🤷 Somehow, here, Selda didn’t want to read/parse back the ids it just inserted:</p>
<blockquote>
<p><code>elephants-exe: [SELDA BUG] fromSql: RowID column with non-int value: SqlInt32...</code></p>
</blockquote>
<p>If we change the type from <code>ID Foo</code> to <code>Int32</code>, the select works, but then insert with auto-incremental primary keys and other functionality doesn’t 🤷 </p>
<p><em>So let’s ignore this for now because other queries work fine.</em></p>
<hr>
<p>We can select specific fields and narrow down the results:</p>
<pre><code class="language-haskell">select2 :: Query t (Col t Text :*: Col t (Maybe Text))
select2 = do
p <- selectProduct
restrict (p ! #label .== "Wood Screw Kit 2")
pure (p ! #label :*: p ! #description)
</code></pre>
<p><code>Query</code> is parameterized over a scope parameter <code>t</code>, ensuring that queries are always well-scoped, but we don’t have to worry about it now.</p>
<p>We use <code>!</code> with selectors to extract a column, <code>restrict</code> to filter the rows, and <code>.==</code> to compare for equality. A result is an inductive tuple — one or more values separated by the <code>:*:</code> data constructor.</p>
<p>We can also use <code>isIn</code>:</p>
<pre><code class="language-haskell">select3 = do
p <- selectProduct
restrict (p ! #label `isIn` ["Wood Screw Kit 2", "Wood Screw Kit 3"])
pure (p ! #label)
</code></pre>
<h3>How to use transactions</h3>
<p>We use <code>transaction</code>:</p>
<pre><code class="language-haskell">insertWithTransaction :: SeldaT PG IO ()
insertWithTransaction = transaction $ do
productId <- insertWithPK productTable [Product def "Drywall Screws Set" (Just "8000pcs")]
categoryId <- insertWithPK categoryTable [Category def "Drywall Screws"]
insert_ mappingTable [ProductCategory productId categoryId]
insert_ warehouseTable [Warehouse def productId 10 def def]
liftIO $ putStrLn $ "Insert with transaction"
</code></pre>
<h3>How to query using joins</h3>
<p>We use <code>restrict</code> and <code>leftJoin</code> to query with joins:</p>
<pre><code class="language-haskell">join :: Query s (Col s Int32 :*: (Col s Text :*: (Col s (Maybe Text) :*: Col s (Coalesce (Maybe Text)))))
join = do
w <- select warehouseTable
p <- select productTable
restrict (w ! #product_id .== p ! #id)
pc <- leftJoin (\pc -> pc ! #product_id .== p ! #id) (select mappingTable)
c <- leftJoin (\c -> just (c ! #id) .== pc ? #category_id) (select categoryTable)
pure (w ! #quantity :*: p ! #label :*: p ! #description :*: c ? #label)
</code></pre>
<p>We use <code>?</code> to extract a column from the nullable row.</p>
<p>The generated query:</p>
<pre><code class="language-haskell">SELECT
"quantity_2",
"label_6",
"description_7",
"label_13_15"
FROM
(
SELECT
"id_12_14",
"label_13_15",
"category_id_9_11",
"label_6",
"description_7",
"quantity_2"
FROM
(
SELECT
"product_id_8_10",
"category_id_9_11",
"id_5",
"label_6",
"description_7",
"quantity_2"
FROM
(
SELECT
"id_5",
"label_6",
"description_7",
"product_id_1",
"quantity_2"
FROM
(
SELECT
"product_id" AS "product_id_1",
"quantity" AS "quantity_2"
FROM
"warehouse"
) AS q0,
(
SELECT
"id" AS "id_5",
"label" AS "label_6",
"description" AS "description_7"
FROM
"product"
) AS q1
WHERE
("product_id_1" = "id_5")
) AS q3
LEFT JOIN (
SELECT
"product_id_8" AS "product_id_8_10",
"category_id_9" AS "category_id_9_11"
FROM
(
SELECT
"product_id" AS "product_id_8",
"category_id" AS "category_id_9"
FROM
"product_category"
) AS q2
) AS q4 ON "product_id_8_10" = "id_5"
) AS q6
LEFT JOIN (
SELECT
"id_12" AS "id_12_14",
"label_13" AS "label_13_15"
FROM
(
SELECT
"id" AS "id_12",
"label" AS "label_13"
FROM
"product"
) AS q5
) AS q7 ON (
Cast("id_12_14" AS INT)
) = "category_id_9_11"
) AS q8
</code></pre>
<h3>Errors</h3>
<p>From Selda’s tutorial: <em>“While the types keep queries nice and safe, Haskell's type errors can be a bit daunting even under the best circumstances.”</em> In practice, type inference rarely needed guidance, and the compilation errors were relatively clear.</p>
<p>The only problem we’ve encountered was the mismatch of <code>ID</code> and <code>SqlInt32</code>.</p>
<p>All Selda functions may throw <a href="https://hackage.haskell.org/package/selda-0.5.2.0/docs/Database-Selda.html#t:SeldaError"><code>SeldaError</code></a>:</p>
<pre><code class="language-haskell">errors :: SeldaM PG ()
errors = do
insertDuplicateScrew
insertDuplicateScrew
`catch` (\(err :: SeldaError) -> liftIO $ putStrLn $ "Caught Selda Error: " <> displayException err)
where
insertDuplicateScrew = insert_ productTable [Product def "Duplicate screw" Nothing]
</code></pre>
<blockquote>
<p><code>elephants-exe: SqlError "error executing query INSERT INTO \"product_category\" (\"product_id\", \"category_id\") VALUES ($1, $2)': ERROR: insert or update on table \"product_category\" violates foreign key constraint \"product_category_category_id_fkey\"\nDETAIL: Key (category_id)=(748) is not present in table \"category\".\n"</code></p>
</blockquote>
<h3>Resources</h3>
<p>Selda comes with a simple overview and example. There is also a <a href="https://selda.link/tutorial/">tutorial</a>.</p>
<h3>Migrations</h3>
<p>The library has a <a href="https://hackage.haskell.org/package/selda-0.5.2.0/docs/Database-Selda-Migrations.html"><code>Migrations</code></a> module for upgrading a table from one schema to another.</p>
<h3>In summary</h3>
<p>Selda allows us to write type-safe queries in a <em>linear</em>, <em>natural</em> style.</p>
<p>Depending on your experience and situation, you can use SeldaM straight, or you may need to get familiar with mtl, exceptions, lifting/unlifting IO, etc.</p>
<h2>Honorable mentions</h2>
<p>At some point, I ran out of steam and didn’t have the energy to make these things work.</p>
<p>I didn’t manage to connect to the database using <a href="https://hackage.haskell.org/package/postgresql-typed">postgresql-typed</a>. And I didn’t manage to build <a href="http://khibino.github.io/haskell-relational-record/">Haskell Relational Record</a> and <a href="https://hackage.haskell.org/package/groundhog">groundhog</a> with <code>ghc 9.4.5</code>. Neither had releases this year. Also, there are <a href="https://github.com/hdbc/hdbc">hdbc</a> and <a href="https://github.com/haskellari/postgresql-libpq">postgresql-libpq</a> (you might have noticed the <code>libpq</code> connection string we used here and there).</p>
<p><em>All of these sound fun. But we had enough for now. Maybe we’ll revisit and extend it later.</em></p>
<h2>Okay, so which PostgreSQL library should I use with Haskell?</h2>
<p><em>I can’t tell you which library to use. I don’t know myself. But I can tell you the questions you (and your team) should consider:</em></p>
<ul>
<li>Do you want to write raw sql queries? or query builder? or use some sort of ORM? Do you want to learn a new DSL?</li>
<li>How type-safe do you want to be? How readable/optimizable the generated queries should be?</li>
<li>Do you need bells and whistles, like built-in connection pools or migrations?</li>
<li>How comfortable are you with Haskell and type-level? Is this something you can afford?</li>
<li>Do you need to be database agnostic?</li>
</ul>
<p>Also, this is just the tip of the iceberg; we haven’t discussed specific features, performance, compilation speed… And spoiler alert: generics, template haskell, and type-families don’t come for free.</p>
<p>We aren’t really at the point where people care to compare the performance. But you don’t know unless you measure. Feel free to explore and get some community karma.</p>
<p>Another excellent contribution opportunity is documentation and tutorials, especially if you have a favorite library and want to convince others to consider it.</p>
<hr>
<p>Wait, is it actually bad that we have so many libraries?</p>
+
+
+ vrthra/markdown-ieee-pdf
+ 2023-10-11T01:30:48Z
+ tag:github.com,2023-10-11:/vrthra/markdown-ieee-pdf
+
+ <p>A skeletal project to convert a paper written in markdown format to IEEE style paper submission in pdf.</p><hr><h1>README</h1>
<h2>Introduction</h2>
<p>This repository contains materials to generate a paper in pdf in ieee standard.</p>
<h2>Layout</h2>
<h3>src</h3>
<p>This directory contains the source code in <a href="http://johnmacfarlane.net/pandoc/">pandoc</a> markdown wiki format.</p>
<ul>
<li> <p>src/paper.md The paper itself in markdown.</p> </li>
<li> <p>src/read.md The references used in the paper.</p> </li>
<li> <p>src/meta The meta information such as title, author etc.</p> </li>
<li> <p>src/req The ieee format specific files for generating pdf from pandoc markdown.</p> </li>
</ul>
<h3>build</h3>
<p>This directory contains the generated pdf output.</p>
<h2>Building</h2>
<h3>Requirements</h3>
<p>You will need pandoc to process the files. If pdf generation is intented, pandoc internally uses latex to generate the pdf files.</p>
<p>If you are on ubuntu, these can be accomplished with</p>
<blockquote>
<p>sudo apt-get install pandoc</p>
</blockquote>
<blockquote>
<p>sudo apt-get install texlive-full</p>
</blockquote>
<h3>Generate</h3>
<p>Run "make" from the top directory to generate build/ieee_jrnl.pdf</p>
<h3>Settings</h3>
<p>Ensure that these are run in your terminal.</p>
<blockquote>
<p>git config --global diff.tool vimdiff git config --global difftool.prompt false git config --global alias.d difftool</p>
</blockquote>
+
+
+ tydar/yahmdp
+ 2023-10-11T01:30:48Z
+ tag:github.com,2023-10-11:/tydar/yahmdp
+
+ <p>Yet Another Haskell Markdown Parser</p><hr><h1>Yet Another Haskell Markdown Parser</h1>
<p>And not a very good one. Deviates from the specification in some ways, some features are not implemented. I'll document these shortcomings more extensively soon.</p>
<h1>Usage</h1>
<p>showProcessed $ parseMarkdown "test string"</p>
<p>Actual input/output hopefully coming soon.</p>
<h1>Shortcomings</h1>
<ul>
<li>No links or images yet.</li>
<li>No nested lists, or block-type Markdown in lists.</li>
<li>Unordered lists can only begin with a +, no - or *.</li>
<li>No escaping of characters, only limited encoding.</li>
<li>May not give the correct parse every time. I don't have a test suite yet, so.</li>
<li>Probably a lot of other things I haven't seen because I haven't tested extextensively. But I did it. I wrote a Markdown parser-ish using only ReadP combinators. That was a bad idea.</li>
</ul>
+
\ No newline at end of file
diff --git a/haxe/daily/index.xml b/haxe/daily/index.xml
index 272b0bcf886..74a651f6527 100644
--- a/haxe/daily/index.xml
+++ b/haxe/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Haxe Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:57Z
+ 2023-10-11T01:31:08Z
Daily Trending of Haxe in GitHub
\ No newline at end of file
diff --git a/hcl/daily/index.xml b/hcl/daily/index.xml
index b3682cd1ff7..7e656807c49 100644
--- a/hcl/daily/index.xml
+++ b/hcl/daily/index.xml
@@ -1,14 +1,21 @@
GitHub HCL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:57Z
+ 2023-10-11T01:31:08Z
Daily Trending of HCL in GitHub
- weka/terraform-azure-weka
- 2023-10-10T01:30:57Z
- tag:github.com,2023-10-10:/weka/terraform-azure-weka
-
- <p>Create weka cluster on Azure using TF</p><hr>
+ lacework/terraform-aws-agentless-scanning
+ 2023-10-11T01:31:08Z
+ tag:github.com,2023-10-11:/lacework/terraform-aws-agentless-scanning
+
+ <p>Terraform module for configuring an integration with Lacework and AWS for agentless scanning</p><hr>
+
+
+ nsbno/terraform-aws-alarm-setup
+ 2023-10-11T01:31:08Z
+ tag:github.com,2023-10-11:/nsbno/terraform-aws-alarm-setup
+
+ <p>Setup your alarms to redirect to the right places</p><hr>
\ No newline at end of file
diff --git a/hiveql/daily/index.xml b/hiveql/daily/index.xml
index 092919f0bbb..87de0acafec 100644
--- a/hiveql/daily/index.xml
+++ b/hiveql/daily/index.xml
@@ -1,7 +1,7 @@
GitHub HiveQL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:52Z
+ 2023-10-11T01:31:05Z
Daily Trending of HiveQL in GitHub
\ No newline at end of file
diff --git a/hlsl/daily/index.xml b/hlsl/daily/index.xml
index a66fbdeec0f..fd8ee2cfe2f 100644
--- a/hlsl/daily/index.xml
+++ b/hlsl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub HLSL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:54Z
+ 2023-10-11T01:31:03Z
Daily Trending of HLSL in GitHub
\ No newline at end of file
diff --git a/holyc/daily/index.xml b/holyc/daily/index.xml
index 6920b0b7cd2..f6377617adf 100644
--- a/holyc/daily/index.xml
+++ b/holyc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub HolyC Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:01Z
+ 2023-10-11T01:31:11Z
Daily Trending of HolyC in GitHub
\ No newline at end of file
diff --git a/hoon/daily/index.xml b/hoon/daily/index.xml
index b94cccf3166..bf5caea66f1 100644
--- a/hoon/daily/index.xml
+++ b/hoon/daily/index.xml
@@ -1,7 +1,7 @@
GitHub hoon Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:30:59Z
+ 2023-10-11T01:31:13Z
Daily Trending of hoon in GitHub
\ No newline at end of file
diff --git a/html+ecr/daily/index.xml b/html+ecr/daily/index.xml
index 693dc0eb987..b25da5e7d5b 100644
--- a/html+ecr/daily/index.xml
+++ b/html+ecr/daily/index.xml
@@ -1,7 +1,7 @@
GitHub HTML+ECR Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:04Z
+ 2023-10-11T01:31:16Z
Daily Trending of HTML+ECR in GitHub
\ No newline at end of file
diff --git a/html+eex/daily/index.xml b/html+eex/daily/index.xml
index 0c7614c23da..b6ac151de55 100644
--- a/html+eex/daily/index.xml
+++ b/html+eex/daily/index.xml
@@ -1,7 +1,7 @@
GitHub HTML+EEX Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:03Z
+ 2023-10-11T01:31:15Z
Daily Trending of HTML+EEX in GitHub
\ No newline at end of file
diff --git a/html+erb/daily/index.xml b/html+erb/daily/index.xml
index 7341a9cece0..8d7c15f8f04 100644
--- a/html+erb/daily/index.xml
+++ b/html+erb/daily/index.xml
@@ -1,7 +1,7 @@
GitHub HTML+ERB Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:20Z
+ 2023-10-11T01:31:34Z
Daily Trending of HTML+ERB in GitHub
\ No newline at end of file
diff --git a/html+php/daily/index.xml b/html+php/daily/index.xml
index eae51da7528..c843664885f 100644
--- a/html+php/daily/index.xml
+++ b/html+php/daily/index.xml
@@ -1,7 +1,7 @@
GitHub HTML+PHP Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:22Z
+ 2023-10-11T01:31:35Z
Daily Trending of HTML+PHP in GitHub
\ No newline at end of file
diff --git a/html+razor/daily/index.xml b/html+razor/daily/index.xml
index 8fdfb578f74..9930ca91bad 100644
--- a/html+razor/daily/index.xml
+++ b/html+razor/daily/index.xml
@@ -1,7 +1,7 @@
GitHub HTML+Razor Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:21Z
+ 2023-10-11T01:31:33Z
Daily Trending of HTML+Razor in GitHub
\ No newline at end of file
diff --git a/html/daily/index.xml b/html/daily/index.xml
index 45a4d88581d..b7a1e48e922 100644
--- a/html/daily/index.xml
+++ b/html/daily/index.xml
@@ -1,21 +1,28 @@
GitHub HTML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:07Z
+ 2023-10-11T01:31:20Z
Daily Trending of HTML in GitHub
- CanciuCostin/android-spyware
- 2023-10-10T01:31:07Z
- tag:github.com,2023-10-10:/CanciuCostin/android-spyware
-
- <p>Rails c&c web application for spying Android devices</p><hr><p><a href="https://github.com/CanciuCostin/android-spyware/graphs/contributors"><img src="https://img.shields.io/badge/rails-v6.0.2.2-green" alt="Rails"></a> <a href="https://github.com/CanciuCostin/android-spyware/graphs/contributors"><img src="https://img.shields.io/github/contributors/CanciuCostin/android-spyware.svg?style=flat-square" alt="Contributors"></a> <a href="https://github.com/CanciuCostin/android-spyware/issues"><img src="https://img.shields.io/github/issues/CanciuCostin/android-spyware.svg?style=flat-square" alt="Issues"></a> <a href="https://github.com/CanciuCostin/android-spyware/raw/master/LICENSE.md"><img src="https://img.shields.io/github/license/othneildrew/Best-README-Template.svg?style=flat-square" alt="MIT License"></a> <a href="https://ro.linkedin.com/in/costin-canciu-b3572a105"><img src="https://img.shields.io/badge/-LinkedIn-black.svg?style=flat-square&logo=linkedin&colorB=555" alt="LinkedIn"></a></p>
<!-- PROJECT LOGO -->
<br>
<p align="center"> <a href="https://github.com/CanciuCostin/android-spyware"> <img src="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/images/logo.png" alt="Logo" width="80" height="80"> </a> </p>
<h3 align="center">Android Spyware</h3>
<p align="center"> <a href="https://github.com/CanciuCostin/android-spyware/issues">Report Bug</a> · <a href="https://github.com/CanciuCostin/android-spyware/issues">Request Feature</a> </p>
<p></p>
<h2>Support The Project</h2>
<p>I'm already working full time, so there isn't much time left for this project.</p>
<ul>
<li> <p><a href="https://www.paypal.com/paypalme/canciucostin?v=1&utm_source=unp&utm_medium=email&utm_campaign=RT000269&utm_unptid=8179359e-cbd0-11ed-981f-ac1f6bdb081c&ppid=RT000269&cnac=RO&rsta=en_US%28en-RO%29&cust=ZQ79GPJVPJB7L&unptid=8179359e-cbd0-11ed-981f-ac1f6bdb081c&calc=f804341d8e5ec&unp_tpcid=ppme-social-user-profile-created&page=main%3Aemail%3ART000269&pgrp=main%3Aemail&e=cl&mchn=em&s=ci&mail=sys&appVersion=1.155.0&xt=104038%2C127632">Support the project on PAYPAL</a></p> </li>
<li> <p><a href="https://www.patreon.com/CostinCanciu">Support the project on PATREON</a></p> </li>
</ul>
<!-- TABLE OF CONTENTS -->
<h2>Table of Contents</h2>
<ul>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#about-the-project">About the Project</a>
<ul>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#disclaimer">Disclaimer</a></li>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#built-with">Built With</a></li>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#features">Features</a></li>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#roadmap">Roadmap</a></li>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#license">License</a></li>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#contact">Contact</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#getting-started">Getting Started</a>
<ul>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#prerequisites">Prerequisites</a></li>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#installation">Installation</a></li>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#deployment">Deployment</a></li>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#usage">Usage</a></li>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#debugging-issues">Debugging Issues</a></li>
<li><a href="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/#build">Build</a></li>
</ul> </li>
</ul>
<!-- ABOUT THE PROJECT -->
<h2>About The Project</h2>
<p><a href="https://github.com/CanciuCostin/android-spyware"><img src="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/images/dashboard.png" alt="Dashboard Screen Shot"></a></p>
<p>Educational purpose, command & control, web GUI based Android spyware built around Metasploit & ADB.</p>
<p>The tool:</p>
<ul>
<li>Uses Docker containers to simulate a Kali Linux environment with the metasploit framework</li>
<li>Uses RPC calls to communicate with the Metasploit framework API</li>
<li>Uses ADB to install the payload on the target device & implement additional functionalities (the device must be in the same LAN)</li>
</ul>
<h3>Disclaimer</h3>
<p>This software is for educational purposes only. Using the tool for spying real devices is strictly illegal. USE THE SOFTWARE AT YOUR OWN RISK. THE AUTHOR ASSUMES NO RESPONSIBILITY FOR YOUR USAGE.</p>
<p>We strongly recommend you to have coding and Docker knowledge. Do not hesitate to read the source code and understand the mechanism of the tool.</p>
<h3>Built With</h3>
<ul>
<li><a href="https://getbootstrap.com">Bootstrap</a></li>
<li><a href="https://jquery.com">JQuery</a></li>
<li><a href="https://rubyonrails.org/">Rails</a></li>
<li><a href="https://www.metasploit.com/">Metasploit</a></li>
<li><a href="https://activeadmin.info/">ActiveAdmin</a></li>
<li><a href="https://www.docker.com/">Docker</a></li>
<li><a href="https://developer.android.com/studio/command-line/adb">Android Debug Bridge</a></li>
</ul>
<h3>Features</h3>
<p><strong>Available actions using Metasploit framework</strong></p>
<ul>
<li><input type="checkbox" checked disabled> Dump System Info</li>
<li><input type="checkbox" checked disabled> Dump Location</li>
<li><input type="checkbox" checked disabled> Live Webcam Stream</li>
<li><input type="checkbox" checked disabled> Dump Messages</li>
<li><input type="checkbox" checked disabled> Change Audio Mode</li>
<li><input type="checkbox" checked disabled> Dump Call Logs</li>
<li><input type="checkbox" checked disabled> Dump Local Time</li>
<li><input type="checkbox" checked disabled> Microphone Recording - Only working for Android < 9.0</li>
<li><input type="checkbox" checked disabled> Unistall App</li>
<li><input type="checkbox" checked disabled> List Installed Apps</li>
<li><input type="checkbox" checked disabled> Send Message</li>
<li><input type="checkbox" checked disabled> Dump Contacts</li>
<li><input type="checkbox" checked disabled> Lock/Unlock Screen</li>
<li><input type="checkbox" checked disabled> Run Shell Command</li>
<li><input type="checkbox" checked disabled> Webcam Snap</li>
<li><input type="checkbox" checked disabled> Open App</li>
<li><input type="checkbox" checked disabled> Install App</li>
<li><input type="checkbox" checked disabled> Device Info</li>
<li><input type="checkbox" checked disabled> Hide/Show payload app icon</li>
</ul>
<p><strong>Additional actions via ADB</strong></p>
<ul>
<li><input type="checkbox" checked disabled> <del>Dump Whatsapp conversations from backup DB</del> (disabled for safety reasons)</li>
<li><input type="checkbox" checked disabled> Dump Wi-Fi Information</li>
<li><input type="checkbox" checked disabled> Screen Snap</li>
<li><input type="checkbox" checked disabled> Upload File</li>
<li><input type="checkbox" checked disabled> Record Screen</li>
<li><input type="checkbox" checked disabled> Pull File</li>
<li><input type="checkbox" checked disabled> Start Monero crypto miner in background</li>
</ul>
<!-- GETTING STARTED -->
<h2>Getting Started</h2>
<h3>Prerequisites</h3>
<ul>
<li><a href="https://www.docker.com/products/docker">Docker</a></li>
<li><a href="https://chocolatey.org/install">Chocolatey</a></li>
</ul>
<h3>Installation</h3>
<ol>
<li>Install ADB via Chocolatey. From an elevated powershell prompt (Run as administrator):</li>
</ol>
<pre><code>choco install adb --version=1.0.39
</code></pre>
<ol start="2">
<li>Create a project directory, and download docker-compose file. You can use curl:</li>
</ol>
<pre><code>curl https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/docker/docker-compose.yml -o docker-compose.yml
</code></pre>
<ol start="3">
<li>Download required images:</li>
</ol>
<pre><code>docker-compose pull
</code></pre>
<h3>Deployment</h3>
<ol>
<li>Start ADB server from a command prompt:</li>
</ol>
<pre><code>adb server
</code></pre>
<ol start="2">
<li>Optional, set your Google MAPS API Key in docker-compose file for dashboard widget</li>
<li>Start the container (inside the project directory):</li>
</ol>
<pre><code>docker-compose up
</code></pre>
<ol start="4">
<li>Wait for the containers to initialize, and access the application in the browser via <a href="http://localhost/admin">http://localhost/admin</a> The files directory will be created. It will contain the payloads and the actions outputs.</li>
</ol>
<h3>Usage</h3>
<ol>
<li>Ensure USB Debugging is enabled on your Android device <a href="https://www.embarcadero.com/starthere/xe5/mobdevsetup/android/en/enabling_usb_debugging_on_an_android_device.html">tutorial HERE</a></li>
<li>Optional: Plug-in your Android device to the laptop via USB - Otherwise you won't be able to use ADB functions and you will have to install the malware manually</li>
<li>Open the rails app in the browser: <a href="http://localhost/admin">http://localhost/admin</a> and login. Default credentials:</li>
</ol>
<p>User: <strong><a href="mailto:admin@example.com">admin@example.com</a></strong></p>
<p>Password: <strong>password</strong></p>
<ol start="4">
<li>Generate APK</li>
</ol>
<ul>
<li>Check your machine IP address on LAN. For windows you can use</li>
</ul>
<pre><code>ipconfig
</code></pre>
<p><a href="https://github.com/CanciuCostin/android-spyware"><img src="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/images/ipconfig.PNG" alt="Ipconfig Screen Shot"></a></p>
<ul>
<li>Go to Payloads (<a href="http://localhost/admin/apk_payloads">http://localhost/admin/apk_payloads</a>) and Create New</li>
<li>Select port 4444, input the machine IP address and give a name for the APK</li>
<li>The APK payload will be generated in [project path]/files/payloads</li>
</ul>
<ol start="5">
<li>Install APK</li>
</ol>
<ul>
<li>Go to APK Installations (<a href="http://localhost/admin/apk_installations">http://localhost/admin/apk_installations</a>) and Create New</li>
<li>Select your previously generated apk from the list and leave the target as usb</li>
<li>You might have to approve a prompt on the device</li>
</ul>
<ol start="6">
<li>Run Actions</li>
</ol>
<ul>
<li>Go to Remote (<a href="http://localhost/admin/remote">http://localhost/admin/remote</a>)</li>
<li>Open the installed app on your device. You should see green light for your MSF connectivity right after. The ADB should also turn green if your device is plugged via USB</li>
<li>Run actions by clicking on the app-looking icons on the device widget. The output will be displayed in the terminal widget, and the output will be stored in [project path]/files/dumps <a href="https://github.com/CanciuCostin/android-spyware"><img src="https://raw.githubusercontent.com/CanciuCostin/android-spyware/master/images/remote.png" alt="Remote Screen Shot"></a></li>
</ul>
<h3>Debugging Issues</h3>
<p><strong>MSF/ADB connection issues (green light not appearing in Remote page)</strong></p>
<ul>
<li>Ensure you generated the apk with correct machine IP</li>
<li>Ensure connection from smartphone to your machine is not blocked by local firewall. Otherwise you should allow connection on ports 2222, 3333, 4444. To check that, you can try to access http://[your machine IP]:2222 . You should be able to access the MSF container file system via http server</li>
<li>Ensure Docker container - HOST connectivity is working. Host machine is accessed via <strong>gateway.docker.internal</strong>, which is set in docker-compose file. If that doesn't work for you, you can also try to replace it with <strong>docker.host.internal</strong></li>
<li>For ADB connection, you can try to restart the local server:</li>
</ul>
<pre><code>adb kill-server
adb server
</code></pre>
<ul>
<li>For ADB connection, ensure USB debugging is enabled</li>
</ul>
<h3>Build</h3>
<p><strong>Software requirements</strong></p>
<ul>
<li><a href="https://www.docker.com/products/docker">Docker</a></li>
<li><a href="https://nodejs.org/en/download/">NodeJS & npm</a></li>
<li><a href="https://rubyinstaller.org/downloads/archives/">Ruby 2.6.6</a></li>
</ul>
<p>Rails Server build steps:</p>
<pre><code>git clone https://github.com/CanciuCostin/android-spyware.git
cd android-spyware
gem install bundler:2.1.4
bundle
npm install yarn -g
yarn install --check-files
</code></pre>
<p>Ensure the following environment variables are set:</p>
<pre><code>ANDROIDSPYWARE_DATABASE_HOST=localhost
ADB_HOST=localhost
RAILS_HOST=127.0.0.1
</code></pre>
<p>Run the server:</p>
<pre><code>rails server
</code></pre>
<ul>
<li>Note: local postgresql database can also be used as alternative, but you will need to run the rake scripts for initialization:</li>
</ul>
<pre><code>rake db:create //alternatively run createdb android_spyware_[developmen|test|production]
rake db:schema:load
rake db:seed /too add mock data required for start-up
</code></pre>
<h2>Roadmap</h2>
<ul>
<li><input type="checkbox" disabled> Implement "Instructions" page</li>
<li><input type="checkbox" disabled> Implement option for persistence script (connection is lost after reboot)</li>
<li><input type="checkbox" disabled> Implement option for public IP handler (either ngrok or cloud solution) to be able to track device outside of LAN</li>
</ul>
<h2>License</h2>
<p>Distributed under the MIT License. See <code>LICENSE</code> for more information.</p>
<!-- CONTACT -->
<h2>Contact</h2>
<p><a href="mailto:costin.canciu@gmail.com">costin.canciu@gmail.com</a></p>
<!-- MARKDOWN LINKS & IMAGES -->
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->
+ PacktPublishing/Machine-Learning-Engineering-with-Python-Second-Edition
+ 2023-10-11T01:31:20Z
+ tag:github.com,2023-10-11:/PacktPublishing/Machine-Learning-Engineering-with-Python-Second-Edition
+
+ <p></p><hr><h1>Machine-Learning-Engineering-with-Python-Second-Edition</h1>
<p>This is the code repository for the <a href="https://www.packtpub.com/product/machine-learning-engineering-with-python-second-edition/9781837631964">Second Edition of Machine Learning Engineering with Python</a>, published by Packt.</p>
<p>More details are below, pick up <a href="https://a.co/d/8EQvHH2">your copy</a> today!</p>
<p><strong>Manage the production life cycle of machine learning models using MLOps with practical examples</strong></p>
<p>The author of this book is - <a href="https://www.linkedin.com/in/andrew-p-mcmahon/">Andrew Peter McMahon</a></p>
<h2>About the book</h2>
<p>The Second Edition of Machine Learning Engineering with Python is the practical guide that MLOps and ML engineers need to build solutions to real-world problems. It will provide you with the skills you need to stay ahead in this rapidly evolving field. The book takes an examples-based approach to help you develop your skills and covers the technical concepts, implementation patterns, and development methodologies you need. You'll explore the key steps of the ML development lifecycle and create your own standardized "model factory" for training and retraining models. You'll learn to employ concepts like CI/CD and how to detect different types of drift. Get hands-on with the latest in deployment architectures and discover methods for scaling up your solutions. This edition goes deeper into all aspects of ML engineering and MLOps, with an emphasis on the latest open-source and cloud-based technologies. This includes a completely revamped approach to advanced pipelining and orchestration techniques. With a new chapter on deep learning, generative AI, and LLMOps, you will learn to use tools like LangChain, PyTorch, and Hugging Face to leverage LLMs for supercharged analysis. You will explore AI assistants like GitHub Copilot to become more productive, then dive deep into the engineering considerations of working with deep learning.</p>
<h2>Key Takeaways</h2>
<ul>
<li>Plan and manage end-to-end ML development projects</li>
<li>Explore deep learning, LLMs, and LLMOps to leverage generative AI</li>
<li>Use Python to package your ML tools and scale up your solutions</li>
<li>Get to grips with Apache Spark, Kubernetes, and Ray</li>
<li>Build and run ML pipelines with Apache Airflow, ZenML, and Kubeflow</li>
<li>Detect drift and build retraining mechanisms into your solutions</li>
<li>Improve error handling with control flows and vulnerability scanning</li>
<li>Host and build ML microservices and batch processes running on AWS</li>
</ul>
<h2>What's New</h2>
<p>This second edition goes deeper into ML engineering and MLOps to provide a solid foundation as well as hands-on examples. As well as covering traditional package managers, conda and pip, the second edition shows you how to manage complex dependencies with Poetry. You’ll go beyond creating general ML pipelines with Airflow by building advanced pipelines with ZenML and Kubeflow. The second edition introduces you to Ray, a Python native distributed computing framework, to help ML engineers meet the needs of massive data and massively scalable ML systems. There is a new chapter on <strong>Large Language Models</strong> (<strong>LLMs</strong>), generative AI, and <strong>LLM Operations</strong> (<strong>LLMOps</strong>), using PyTorch, Hugging Face, and GitHub Copilot and consume an LLM via an API using LangChain.</p>
<h2>Outline and Chapter Summary</h2>
<p>The book covers a wide variety of <strong>ML Engineering</strong> (<strong>MLE</strong>) and <strong>ML Operations</strong> (<strong>MLOps</strong>) topics to help you understand the tools, techniques, and processes you can apply to engineer your ML solutions, with an emphasis on introducing the key concepts so that you can build on them in your future work. The aim is to develop fundamentals and a broad understanding that will stand the test of time. We cover everything from how to organize your ML team, to software development methodologies and best practices, to automating model building through to packaging your ML code, how to deploy your ML pipelines to a variety of different targets, and then how to scale your workloads for large batch runs. We also discuss, in an entirely new chapter for this second edition, the exciting world of applying ML engineering and MLOps to deep learning and generative AI, including how to start building solutions using LLMs and the new field of LLMOps. Although a far greater emphasis has been placed on using open-source tooling, many examples will also leverage services and solutions from <strong>Amazon Web Services</strong> (<strong>AWS</strong>). Machine Learning Engineering with Python, Second Edition will help you to navigate the challenges of taking ML to production and give you the confidence to start applying MLOps in your projects. I hope you enjoy it!</p>
<ol>
<li><a href="https://github.com/PacktPublishing/Machine-Learning-Engineering-with-Python-Second-Edition/tree/main/Chapter01">Introduction to ML Engineering</a></li>
<li><a href="https://github.com/PacktPublishing/Machine-Learning-Engineering-with-Python-Second-Edition/tree/main/Chapter02">The Machine Learning Development Process</a></li>
<li><a href="https://github.com/PacktPublishing/Machine-Learning-Engineering-with-Python-Second-Edition/tree/main/Chapter03">From Model to Model Factory</a></li>
<li><a href="https://github.com/PacktPublishing/Machine-Learning-Engineering-with-Python-Second-Edition/tree/main/Chapter04">Packaging Up</a></li>
<li><a href="https://github.com/PacktPublishing/Machine-Learning-Engineering-with-Python-Second-Edition/tree/main/Chapter05">Deployment Patterns and Tools</a></li>
<li><a href="https://github.com/PacktPublishing/Machine-Learning-Engineering-with-Python-Second-Edition/tree/main/Chapter06">Scaling Up</a></li>
<li><a href="https://github.com/PacktPublishing/Machine-Learning-Engineering-with-Python-Second-Edition/tree/main/Chapter07">Deep Learning, Generative AI, and LLMOps</a></li>
<li><a href="https://github.com/PacktPublishing/Machine-Learning-Engineering-with-Python-Second-Edition/tree/main/Chapter08">Building an Example ML Microservice</a></li>
<li><a href="https://github.com/PacktPublishing/Machine-Learning-Engineering-with-Python-Second-Edition/tree/main/Chapter09">Building an Extract, Transform, Machine Learning Use Case</a></li>
</ol>
<h3>Chapter 01, Introduction to ML Engineering</h3>
<p>Chapter 1 of "Machine Learning Engineering with Python, Second Edition" provides a comprehensive introduction to the realm of ML engineering and operations. It begins by elucidating the core concepts of ML engineering and MLOps and underscores their importance in the dynamic landscape of ML. The chapter delves into the roles within ML teams and lays out the challenges inherent in ML engineering and MLOps. Moreover, it acknowledges the rapid evolution of ML, with advancements in modeling techniques and technology stacks, necessitating a more profound exploration of various topics to effectively navigate this complex field.</p>
<p>The chapter's primary goal is to equip readers with essential tools and techniques for creating production-ready ML systems in Python. It promises to cover fundamental areas like project management, Python ML package development, and the creation and deployment of reusable training and monitoring pipelines. In addition, it discusses modern tooling, deployment architectures, and scalability using AWS and cloud-agnostic tools. It also introduces readers to transformers and LLMs, exemplified through Hugging Face and OpenAI APIs. Ultimately, the chapter aims to empower readers with a robust foundation for confidently tackling the challenges of ML engineering, regardless of their chosen tools, encouraging further exploration and self-study in pursuit of a successful career in ML engineering.</p>
<h4>Key Insights:</h4>
<ul>
<li><strong>Dynamic Nature of ML</strong> : The chapter highlights how the field of machine learning has evolved significantly in recent years, with the emergence of more powerful modeling techniques, complex technology stacks, and new frameworks. This evolution underscores the importance of staying up-to-date with the latest trends and tools in ML engineering.</li>
<li><strong>ML Engineering Foundation</strong> : The chapter emphasizes the importance of building a strong foundation in ML engineering. It introduces the core topics that readers will explore in the book, such as project management, Python ML package development, and the creation of training and monitoring pipelines. This foundation is crucial for building production-ready ML systems.</li>
<li><strong>Role of ML Teams</strong> : It provides insights into the various roles within ML teams and explains how these roles complement each other. Understanding these roles is essential for assembling well-resourced teams that can effectively tackle ML projects.</li>
<li><strong>Challenges in Real-World ML</strong> : The chapter discusses the challenges of building ML products within real-world organizations. It underscores the need to estimate value reasonably and communicate effectively with stakeholders, highlighting the practical aspects of ML engineering beyond just technical skills.</li>
<li><strong>High-Level System Design</strong> : Readers are introduced to the concept of high-level ML system design for common business problems. This sets the stage for the technical details to be covered in later chapters and provides a glimpse into what ML solutions should look like from a design perspective.</li>
<li><strong>Motivation for Exploration</strong> : The chapter serves as a motivation for readers to engage with the material in the book and encourages them to embark on a path of exploration and self-study. It emphasizes that a solid conceptual foundation is essential for a successful career as an ML engineer.</li>
</ul>
<h3>Chapter 02, The Machine Learning Development Process</h3>
<p>Chapter 2, "The Machine Learning Development Process," is a comprehensive exploration of organizing and executing successful ML engineering projects. It begins by discussing various development methodologies like Agile, Scrum, and CRISP-DM. The chapter introduces a project methodology developed by the author, which is referred to throughout the book. It also covers essential concepts like <strong>continuous integration/continuous deployment</strong> (<strong>CI/CD</strong>) and developer tools. The chapter's central focus is on delineating how to divide the work for a prosperous ML software engineering project, offering insights into the process, workflow, and necessary tools, accompanied by real ML code examples. It places a particular emphasis on the "four-step" methodology proposed by the author, encompassing the steps of discovery, playing, development, and deployment, comparing it with the popular CRISP-DM methodology in data science.</p>
<p>The chapter provides detailed guidance on setting up tools, version control strategies, CI/CD for ML projects, and potential execution environments for ML solutions. By the chapter's end, readers are well-prepared for Python ML engineering projects, laying the foundation for subsequent chapters. Additionally, it highlights that the concepts discussed here can be applied not only to ML projects but also to other Python software engineering endeavors, emphasizing the versatility of the knowledge presented. Overall, this chapter establishes a robust groundwork for the development and deployment of ML solutions while offering a broader perspective on software engineering practices in Python.</p>
<h4>Key Insights:</h4>
<ul>
<li><strong>Organizing ML Projects</strong> : The chapter emphasizes the importance of structuring and organizing ML projects effectively. It outlines a four-step methodology (Discover, Play, Develop, Deploy) that serves as a framework for managing ML projects.</li>
<li><strong>Development Methodologies</strong> : It introduces various development methodologies such as Agile, Scrum, and CRISP-DM. The focus is on understanding how these methodologies can be adapted to suit the unique challenges of ML engineering.</li>
<li><strong>Continuous Integration and Deployment</strong> (<strong>CI/CD</strong>): The chapter discusses CI/CD practices, highlighting their significance in ML projects. It provides practical guidance on setting up CI/CD pipelines, including automated model validation, using tools like GitHub Actions.</li>
<li><strong>Tooling and Version Control</strong> : It covers essential tools for ML project development and version control strategies. This includes setting up tools for code development, change tracking, and managing ML projects efficiently.</li>
<li><strong>Project Management Methodologies</strong> : The chapter introduces the CRISP-DM methodology, widely used in data science. It compares this methodology with Agile and Waterfall, offering insights into when and how to apply them in ML projects.</li>
<li><strong>Versatility of Concepts</strong> : It underscores that the principles discussed are not limited to ML projects alone but can be applied to various Python software engineering endeavors. This highlights the broader applicability of the knowledge presented.</li>
<li><strong>Testing and Automation</strong> : The chapter delves into the importance of testing ML code and how to automate testing as part of CI/CD pipelines. It extends the concept to continuous model performance testing and continuous model training.</li>
<li><strong>Project Setup</strong> : Practical steps for setting up tools, environment management, and DevOps and MLOps workflows are detailed. Readers are equipped with the knowledge needed to prepare for Python ML engineering projects.</li>
</ul>
<h3>Chapter 03, From Model to Model Factory,</h3>
<p>Chapter 3, titled "From Model to Model Factory," dives into the critical process of standardizing, systematizing, and automating ML model training and deployment. The chapter introduces the concept of the "model factory," a methodology designed for repeatable model creation and validation. It underscores the importance of automating and scaling the challenging task of model training and fine-tuning for production systems. The chapter covers fundamental theoretical concepts necessary for understanding ML models, explores various types of drift detection, and discusses criteria for triggering model retraining.</p>
<p>The chapter begins by emphasizing the central question: How can the intricate process of model training and fine-tuning be automated, reproduced, and scaled for production? It proceeds to provide a comprehensive overview of training different ML models, combining both theoretical and practical insights. The motivation for model retraining, driven by the concept of model performance drift, is elucidated. Additionally, the chapter delves into feature engineering, a crucial aspect of ML tasks, and explains the optimization problems at the heart of ML. It presents various tools for tackling these optimization problems, such as manual model definition, hyperparameter tuning, and <strong>automated ML</strong> (<strong>AutoML</strong>). The chapter also guides readers on interfacing with MLflow APIs for model management and introduces the concept of pipelines to streamline model training steps. Ultimately, the chapter lays the groundwork for understanding how to assemble these components into a cohesive solution, setting the stage for subsequent chapters on packaging and deployment.</p>
<h4>Key Insights:</h4>
<ul>
<li><strong>The Model Factory Concept</strong> : The chapter introduces the concept of the "model factory," emphasizing the need for a systematic and automated approach to model training and deployment. This approach aims to make the process repeatable and scalable for production systems.</li>
<li><strong>Model Retraining for Drift</strong> : It highlights the importance of model retraining due to the phenomenon of model performance drift. ML models won't perform well indefinitely, and retraining is essential to maintain their effectiveness over time.</li>
<li><strong>Feature Engineering</strong> : The chapter explores the critical role of feature engineering in ML tasks. Feature engineering involves transforming raw data into a format that ML models can understand and learn from effectively.</li>
<li><strong>Understanding Model Training</strong> : Readers gain insights into the technical details of training ML models, including an in-depth look at how ML models learn. The chapter breaks down the complexity of model training into comprehensible components.</li>
<li><strong>Automating Model Training</strong> : It discusses various levels of abstraction for automating the model training process, from manual model definition to hyperparameter tuning and AutoML. Examples of libraries and tools for these tasks are provided.</li>
<li><strong>Drift Detection</strong> : The chapter covers the concept of drift detection, which involves monitoring how ML models and the data they use evolve over time. It includes practical examples of drift detection using packages like Alibi Detect and Evidently.</li>
<li>Model Persistence** : It addresses the persistence of ML models, which is crucial for saving and serving models in production systems.</li>
<li><strong>MLflow Model Registry</strong> : The chapter introduces the use of MLflow's Model Registry for programmatically managing the staging of ML models.</li>
<li><strong>Defining Training Pipelines</strong> : It explains how to define training pipelines using libraries like Scikit-Learn and Spark ML. Pipelines are essential for organizing and automating the model training workflow.</li>
<li><strong>Foundation for Deployment</strong> : The chapter establishes a solid foundation for understanding how to package and deploy ML models effectively, setting the stage for subsequent chapters.</li>
</ul>
<h3>Chapter 04, Packaging Up</h3>
<p>Chapter 4, "Packaging Up," delves into the practical aspects of programming in Python, specifically focusing on how to code effectively and package your code for reuse across multiple projects, including those involving ML. It emphasizes that the techniques and methodologies discussed can be applied to various Python development activities throughout an ML project's life cycle. The chapter begins with a recap of fundamental Python programming concepts and moves on to address coding standards, quality code writing, and the distinction between object-oriented and functional programming in Python. It also highlights the importance of testing, logging, error handling, and not reinventing the wheel in the development process. The chapter offers insights into how to package and distribute your code across different platforms and use cases.</p>
<p>This chapter essentially serves as a guide to best practices when creating Python packages for ML solutions. It covers key principles of Python programming, coding standards, and various techniques to ensure high-quality code. The discussion extends to packaging code for distribution, testing, and robust error handling. The chapter culminates by stressing the significance of reusing existing functionality rather than duplicating efforts. As it sets the stage for the next chapter on deployment, it equips readers with the necessary knowledge to prepare their code for deployment on appropriate infrastructure and tools.</p>
<h4>Key Insights:</h4>
<ul>
<li><strong>Coding Best Practices</strong> : The chapter emphasizes the importance of coding best practices in Python. It highlights the need for writing clean, high-quality code that is both readable and maintainable, regardless of the specific project, including ML tasks.</li>
<li><strong>Coding Standards</strong> : It discusses the significance of adhering to coding standards and guidelines. Consistency in code style and structure, often enforced through tools like linters, contributes to code quality and collaboration.</li>
<li><strong>Object-Oriented vs. Functional Programming</strong> : The chapter explores the differences between object-oriented and functional programming paradigms in Python. It discusses where each approach can be leveraged effectively in ML projects.</li>
<li><strong>Package Development</strong> : It delves into the process of packaging code for reuse across multiple platforms and projects. Readers learn about various tools and setups for packaging code, including Makefiles and Poetry.</li>
<li><strong>Testing and Error Handling</strong> : The chapter underscores the importance of robust testing, logging, and error handling. These are essential components of code that not only function correctly but are also diagnosable when issues arise.</li>
<li><strong>Avoiding Redundancy</strong> : It emphasizes the principle of not reinventing the wheel. Instead of recreating functionality that already exists in the Python ecosystem, developers should leverage existing libraries and packages to streamline their work.</li>
<li><strong>Preparation for Deployment</strong> : The chapter serves as a foundational guide for preparing code for deployment. It lays the groundwork for the next chapter, which will focus on deploying scripts, packages, libraries, and apps on appropriate infrastructure and tools.</li>
</ul>
<h3>Chapter 05, Deployment Patterns and Tools</h3>
<p>Chapter 5, "Deployment Patterns and Tools," delves into the crucial process of deploying ML solutions into real-world production environments. This chapter serves as a bridge between the development of ML models and their practical implementation. It highlights the challenges and importance of transitioning from proof-of-concept to scalable and impactful ML solutions. The chapter begins by focusing on fundamental concepts related to system design and architecture, providing insights into how to build solutions that can be easily scaled and extended. It then introduces the concept of containerization and its role in abstracting application code from specific infrastructure, enhancing portability. A practical example of deploying an ML microservice on AWS is presented. The chapter subsequently returns to the topic of building robust pipelines for end-to-end ML solutions, expanding on the discussion from the previous chapter. It introduces tools like Apache Airflow, ZenML, and Kubeflow for building and orchestrating ML pipelines, offering readers a comprehensive understanding of deployment possibilities.</p>
<p>This chapter equips readers with the knowledge and tools necessary to navigate the complexities of deploying ML solutions effectively. It covers key concepts related to system architecture, containerization, cloud deployment, and pipeline orchestration. By the end of the chapter, readers gain confidence in their ability to deploy and orchestrate complex ML solutions using a variety of software tools. The chapter emphasizes the practical aspects of turning ML models into impactful, production-ready systems that can generate real value.</p>
<h4>Key Insights:</h4>
<ul>
<li><strong>Deployment Challenges</strong> : The chapter underscores that deploying ML solutions is a challenging but crucial step in the ML development lifecycle. Successful deployment can make the difference between creating value and mere hype.</li>
<li><strong>System Design and Architecture</strong> : It emphasizes the significance of designing and architecting ML systems effectively. Understanding how to develop solutions that can be seamlessly scaled and extended is a fundamental aspect of deployment.</li>
<li><strong>Containerization</strong> : The chapter introduces containerization as a key concept. It explains how containerization abstracts application code from specific infrastructure, enabling portability across various environments.</li>
<li><strong>AWS Microservice Deployment</strong> : A practical example demonstrates how to deploy an ML microservice on AWS. This offers readers insight into the practical aspects of cloud-based ML deployment.</li>
<li><strong>Pipeline Orchestration</strong> : Building on the previous chapter, the discussion on pipeline orchestration continues. Tools like Apache Airflow, ZenML, and Kubeflow are introduced for orchestrating data engineering, ML, and MLOps pipelines.</li>
<li><strong>Scalability</strong>: The chapter sets the stage for scaling ML solutions to handle large volumes of data and high-throughput calculations, hinting at future considerations for ML scalability.</li>
<li><strong>Practical Application</strong> : Throughout the chapter, the practical application of deployment concepts and tools is highlighted, ensuring that readers can apply their knowledge effectively in real-world ML projects.</li>
<li><strong>Value Creation</strong>: Successful deployment is framed as the bridge between ML development and creating real value for customers or colleagues. It emphasizes that the deployment phase is where ML solutions have a tangible impact.</li>
</ul>
<h3>Chapter 06, Scaling Up</h3>
<p>Chapter 6, "Scaling Up," addresses the critical challenge of developing ML solutions that can handle large datasets and high-frequency computations. It recognizes that while running simple ML models on a small scale is suitable for initial exploration and proof of concept, it's inadequate when dealing with massive volumes of data or numerous models. The chapter introduces Apache Spark and Ray frameworks, explaining their inner workings and how to leverage them for scalable ML solutions. It emphasizes the importance of adopting a different approach, mindset, and toolkit for such scenarios. Practical examples illustrate the use of these frameworks for processing large batches of data, and there's an introduction to serverless applications for scaling inference endpoints and containerized ML applications with Kubernetes. The chapter equips readers with the knowledge and tools needed to scale ML solutions to handle larger datasets effectively.</p>
<p>The key takeaways from this chapter are a deeper understanding of Apache Spark and Ray frameworks for distributed computing, including coding patterns and syntax, the significance of <strong>User-Defined Functions</strong> (<strong>UDFs</strong>) for scalable ML workflows, and insights into scaling ML solutions through serverless architectures, containerization, and parallel computing with Ray. The chapter sets the stage for future discussions on scaling ML models, particularly deep learning models and large language models, and emphasizes the importance of these scaling concepts for the rest of the book.</p>
<h4>Key Insights:</h4>
<ul>
<li><strong>Challenges of Large-Scale Data</strong> : The chapter acknowledges the limitations of running simple machine learning models on small datasets and highlights the challenges of dealing with large volumes of data and high-frequency computations.</li>
<li><strong>Importance of Scalability</strong> : It underscores the importance of adopting a different approach and toolkit when scaling up ML solutions to handle massive datasets or numerous models.</li>
<li><strong>Apache Spark and Rayv</strong> : The chapter provides a detailed exploration of two popular frameworks, Apache Spark, and Ray, for distributed computing. It covers coding patterns, syntax, and the use of UDFs for scalable ML workflows.</li>
<li><strong>Cloud-Based Scaling</strong> : Readers gain insights into using Apache Spark on the cloud, specifically through AWS Elastic MapReduce (EMR), to scale ML solutions.</li>
<li><strong>Serverless Architectures</strong> : The chapter introduces the concept of serverless architectures and demonstrates how to build an ML model serving services using AWS Lambda, emphasizing scalability.</li>
<li><strong>Containerization and Kubernetes</strong> : It discusses horizontal scaling of ML pipelines using containerization and Kubernetes, providing an overview of these tools' benefits and their role in real-time workloads.</li>
<li><strong>Ray Parallel Computing</strong> : Readers learn about the Ray parallel computing framework and its ability to scale compute on heterogeneous clusters for supercharging ML workflows.</li>
<li><strong>Preparation for Future Chapters</strong> : The chapter sets the stage for upcoming discussions on scaling deep learning models, including LLMs, and highlights the importance of the scaling concepts covered in this chapter for the rest of the book.</li>
<li><strong>Prerequisites for Scaling</strong> : It emphasizes that the knowledge and techniques discussed in this chapter are prerequisites for understanding and effectively utilizing the concepts presented in subsequent chapters.</li>
</ul>
<h3>Chapter 07, Deep Learning, Generative AI, and LLMOps</h3>
<p>In Chapter 7, "Deep Learning, Generative AI and LLMOps," the book delves into the rapidly evolving landscape of machine learning and artificial intelligence. It acknowledges the profound changes in the ML and AI realms, with the proliferation of generative artificial intelligence (generative AI or GenAI) tools and large LLMs like ChatGPT, Bing AI, Google Bard, and DALL-E. The chapter aims to guide aspiring ML engineers through this dynamic landscape, providing a comprehensive understanding of the core concepts and foundations necessary to navigate this brave new world effectively.</p>
<p>The chapter commences by revisiting the fundamental algorithmic approach of deep learning, exploring its theoretical underpinnings, and offering insights into building and hosting deep learning models. It then shifts its focus to GenAI and, more specifically, LLMs, such as ChatGPT. It deep dives into the workings and approaches behind these powerful text models, setting the stage for understanding the unique challenges and opportunities they bring. Additionally, the chapter introduces the concept of LLMOps, emphasizing how ML engineering and MLOps principles can be applied to LLMs and highlighting the nascent state of best practices in this domain. Overall, this chapter equips readers with a strong foundation in deep learning, GenAI, LLMs, and the evolving field of LLMOps, positioning them to navigate this transformative landscape confidently.</p>
<h4>Key Insights:</h4>
<ul>
<li><strong>The Rapid Evolution of AI and ML</strong> : The chapter highlights the rapid pace of development in the AI and ML field. It acknowledges the introduction of generative AI and LLMs like ChatGPT, reflecting the ongoing innovation and growth in AI technology.</li>
<li><strong>Foundational Knowledge</strong> : It emphasizes the importance of building a strong foundation in core AI and ML concepts. Readers are guided through the theoretical aspects of deep learning, ensuring they have a solid understanding of the fundamental principles underpinning these technologies.</li>
<li><strong>Focus on LLMs</strong> : The chapter gives special attention to LLMs, such as ChatGPT, and explores their significance in the AI landscape. It discusses their design principles, behaviors, and practical applications, providing valuable insights for ML engineers.</li>
<li><strong>Introduction to LLMOps</strong> : LLMOps, the application of ML engineering and MLOps to LLMs, is introduced as an emerging field. The chapter outlines its core components and emerging best practices, highlighting that this area is still evolving.</li>
<li><strong>Preparation for Real-World Applications</strong> : By offering a deep understanding of deep learning, GenAI, and LLMs, the chapter prepares ML engineers for real-world applications of these technologies. It equips them to harness the potential of AI and ML in their projects effectively.</li>
<li><strong>Nurturing a Learning Mindset</strong> : The chapter emphasizes that the AI and ML landscape is continually evolving. ML engineers are encouraged to adopt a learning mindset to keep up with the rapid advancements and contribute to the field's growth.</li>
</ul>
<h3>Chapter 08, Building an Example ML Microservice</h3>
<p>Chapter 8, "Building an Example ML Microservice," serves as a practical culmination of the concepts and techniques covered throughout the book. It focuses on creating a machine learning microservice for a forecasting solution, using tools like FastAPI, Docker, and Kubernetes to bring together the knowledge acquired earlier.</p>
<p>The chapter begins by introducing the forecasting problem, emphasizing the importance of understanding the scenario and making key decisions to address it. It then delves into the design of the forecasting service, highlighting the complexities that may arise in real-world ML engineering projects. The selection of appropriate tools is discussed, considering factors like task suitability and developer familiarity. The chapter proceeds to cover training at scale, serving models using FastAPI, and containerizing and deploying the solution to Kubernetes. Each topic provides a practical walk-through, offering readers a valuable reference for tackling similar challenges in their own ML microservices projects. By the end of the chapter, readers gain a clear understanding of how to leverage the tools and techniques acquired throughout the book to build robust ML microservices for diverse business problems, bridging the gap between theory and real-world application.</p>
<h4>Key Insights:</h4>
<ul>
<li><strong>Realistic Problem Solving</strong> : The chapter demonstrates the importance of understanding the business problem thoroughly before designing a solution. It highlights the need for engineers to make informed decisions that align with the problem's requirements, which often involve dynamically triggered forecasting algorithms.</li>
<li><strong>Tool Selection</strong> : A critical aspect of solving real-world ML problems is selecting the right tools for the job. The chapter discusses the criteria for choosing appropriate tools, considering factors like task suitability and developer familiarity. This insight helps readers make informed choices when building ML solutions.</li>
<li><strong>Microservice Architecture</strong> : The chapter guides readers through the design of a microservice architecture to handle various aspects of ML solutions, such as event handling, model training, storage, and predictions. This architectural approach addresses the complexities of real-world ML engineering projects.</li>
<li><strong>Practical Implementation</strong> : The practical walk-through provided for training models at scale, serving models with FastAPI, and containerizing and deploying the solution to Kubernetes offers readers a concrete example of applying ML engineering concepts and tools to build a robust microservice.</li>
</ul>
<h3>Chapter 09, Building an Extract, Transform, Machine Learning Use Case</h3>
<p>Chapter 9, "Building an Extract, Transform, Machine Learning Use Case," extends the book's lessons by providing a detailed example of a batch-processing ML system. This use case integrates standard ML algorithms with LLMs and LLMOps, demonstrating the application of these concepts in a real-world scenario. The chapter revolves around clustering taxi ride data and performing <strong>natural language processing</strong> (<strong>NLP</strong>) on contextual text data using the <strong>Extract, Transform, Machine Learning</strong> (<strong>ETML</strong>) pattern. It explores the decision-making process, tool selection, and execution of the solution, offering readers practical insights into tackling complex batch ML engineering challenges.</p>
<p>By examining the integration of concepts from previous chapters, such as the ML development process, model packaging, deployment patterns, and orchestration with tools like Apache Airflow, readers gain a holistic understanding of how to approach real-world ML engineering projects. This chapter empowers ML engineers with the knowledge and skills needed to apply ETML patterns, making it an invaluable resource for building robust, batch-processing ML solutions.</p>
<h4>Key Insights:</h4>
<ul>
<li><strong>ETML Pattern</strong> : The chapter introduces the ETML pattern, which is a common approach in ML solutions. It emphasizes the importance of structuring ML projects to efficiently retrieve, preprocess, and apply machine learning to data in a batch-processing manner. ETML helps in dealing with complex tasks like clustering taxi ride data and performing NLP on textual data.</li>
<li><strong>Integration of Concepts</strong> : Chapter 9 integrates concepts and techniques from earlier chapters, showcasing how ML engineers can leverage the knowledge gained throughout the book. It combines elements from the ML development process, packaging models, deployment patterns, and orchestration using Apache Airflow. This integration highlights the importance of a comprehensive approach to solving real-world ML engineering challenges.</li>
<li><strong>Advanced Tooling</strong> : The chapter delves into the selection of tools and methodologies for building ML solutions effectively. It discusses the use of libraries like Scikit-learn, AWS boto3, and OpenAI APIs for complex functionality. Moreover, it explores advanced features of Apache Airflow, illustrating how to orchestrate ML tasks in a resilient manner.</li>
<li><strong>Real-World Problem Solving</strong> : Through the example scenario of clustering taxi ride data and applying NLP, the chapter demonstrates how to address practical ML engineering challenges. It emphasizes the importance of understanding business requirements and translating them into technical solutions.</li>
<li><strong>Completion of Book</strong> : Chapter 9 marks the conclusion of the book, summarizing the wide range of topics covered in the field of ML engineering. It encourages readers to embrace the exciting opportunities in this evolving field and highlights the growing demand for ML engineering skills.</li>
</ul>
<h2>Software and hardware list</h2>
<table>
<thead>
<tr>
<th>Chapter</th>
<th>Software required</th>
<th>Free/Proprietary</th>
<th>Can code testing be performed using a trial?</th>
<th>Cost of the software</th>
<th>Download Links to the software</th>
<th>Hardware specifications</th>
<th>OS required</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Anaconda (>=v22.0) or Miniconda (>=v22.0)</td>
<td>Free</td>
<td>N/A</td>
<td>N/A</td>
<td><a href="https://www.anaconda.com/download">https://www.anaconda.com/download</a></td>
<td>N/A</td>
<td>MacOS, Windows, or Linux</td>
</tr>
<tr>
<td>2</td>
<td>• PyCharm or VSCode <br> • Git and GitHub account <br> • Atlassian JIRA <br> • AWS Account</td>
<td>• Proprietary with free version available <br> • Free <br> • Proprietary with free version available <br> • Proprietary with CLI, etc. free</td>
<td>• N/A <br> • N/A <br> • Yes <br> • Yes</td>
<td>• N/A <br> • N/A <br> • N/A <br> • Free tier, followed by pay as you go</td>
<td>• <a href="https://www.jetbrains.com/pycharm/download">https://www.jetbrains.com/pycharm/download</a> <br> •<a href="https://code.visualstudio.com/download">https://code.visualstudio.com/download</a> <br> • <a href="https://www.atlassian.com/git/tutorials/install-git">https://www.atlassian.com/git/tutorials/install-git</a> <br> • <a href="https://github.com/">https://github.com/</a> <br> •<a href="https://www.atlassian.com/software/jira">https://www.atlassian.com/software/jira</a> <br> • <a href="https://aws.amazon.com/">https://aws.amazon.com/</a></td>
<td>N/A</td>
<td>MacOS, Windows, or Linux</td>
</tr>
<tr>
<td>3</td>
<td>• MLFlow <br> • Tensorflow <br> • PyTorch</td>
<td>• Free <br> • Free <br> • Free</td>
<td>• N/A <br> • N/A <br> • Yes <br> • Yes</td>
<td>N/A</td>
<td>• <a href="https://mlflow.org/docs/latest/quickstart.html">https://mlflow.org/docs/latest/quickstart.html</a> <br> •<a href="https://www.tensorflow.org/install">https://www.tensorflow.org/install</a> <br> • <a href="https://pytorch.org/get-started/locally/">https://pytorch.org/get-started/locally/</a></td>
<td>N/A</td>
<td>MacOS, Windows, or Linux</td>
</tr>
<tr>
<td>4</td>
<td>Make</td>
<td>Free</td>
<td>N/A</td>
<td>N/A</td>
<td>• <a href="https://formulae.brew.sh/formula/make">https://formulae.brew.sh/formula/make</a> <br> • Linux: Pre-installed <br> • Recommend you work in Windows Subsystem for Linux and then Make should be available</td>
<td>N/A</td>
<td>MacOS, Windows, or Linux</td>
</tr>
<tr>
<td>5</td>
<td>• Docker (v20.10) <br> • Kind (>=v0.20) <br> • Kubeflow Pipelines SDK (v1.8) <br> • ZenML (>=0.40) <br> • Apache Airflow (>=v2.6.0)</td>
<td>Free</td>
<td>N/A</td>
<td>N/A</td>
<td>• <a href="https://docs.docker.com/engine/install/">https://docs.docker.com/engine/install/</a> <br> • <a href="https://kind.sigs.k8s.io/">https://kind.sigs.k8s.io</a> <br> • <a href="https://www.kubeflow.org/docs/started/installing-kubeflow/">https://www.kubeflow.org/docs/started/installing-kubeflow/</a> <br> • <a href="https://docs.zenml.io/getting-started/installation">https://docs.zenml.io/getting-started/installation</a> <br> • <a href="https://airflow.apache.org/docs/apache-airflow/stable/installation/">https://airflow.apache.org/docs/apache-airflow/stable/installation/</a></td>
<td>N/A</td>
<td>MacOS, Windows, or Linux</td>
</tr>
<tr>
<td>6</td>
<td>• Apache Spark (>=v3.0) <br> • Ray</td>
<td>• Free <br> • Free</td>
<td>N/A</td>
<td>N/A</td>
<td>• <a href="https://spark.apache.org/downloads.html">https://spark.apache.org/downloads.html</a> <br> • <a href="https://docs.ray.io/en/latest/ray-overview/installation.html">https://docs.ray.io/en/latest/ray-overview/installation.html</a></td>
<td>N/A</td>
<td>MacOS, Windows, or Linux (beta)</td>
</tr>
<tr>
<td>7</td>
<td>• OpenAI API Account</td>
<td>Proprietary</td>
<td>Requires an OpenAI account and API key</td>
<td>Model dependent: $0.0015-0.12/1k tokens</td>
<td><a href="https://openai.com/blog/openai-api">https://openai.com/blog/openai-api</a></td>
<td>N/A</td>
<td>MacOS, Windows, or Linux</td>
</tr>
<tr>
<td>8</td>
<td>• Minikube (v1.30.0)</td>
<td>Free</td>
<td>N/A</td>
<td>N/A</td>
<td><a href="https://minikube.sigs.k8s.io/docs/start/">https://minikube.sigs.k8s.io/docs/start/</a></td>
<td>N/A</td>
<td>MacOS, Windows, or Linux</td>
</tr>
<tr>
<td>9</td>
<td>• Apache Airflow (>=v2.6.0)</td>
<td>Free</td>
<td>N/A</td>
<td>N/A</td>
<td><a href="https://airflow.apache.org/docs/apache-airflow/stable/installation/">https://airflow.apache.org/docs/apache-airflow/stable/installation/</a></td>
<td>N/A</td>
<td>MacOS, Windows, or Linux</td>
</tr>
</tbody>
</table>
<h2>Know more on the Discord server <img alt="Coding" height="25" width="32" src="https://cliply.co/wp-content/uploads/2021/08/372108630_DISCORD_LOGO_400.gif"></h2>
<p>You can get more engaged on the discord server for more latest updates and discussions in the community at <a href="https://packt.link/mle">Discord</a></p>
<h2>Download a free PDF <img alt="Coding" height="25" width="40" src="https://emergency.com.au/wp-content/uploads/2021/03/free.gif"></h2>
<p><em>If you have already purchased a print or Kindle version of this book, you can get a DRM-free PDF version at no cost. Simply click on the link to claim your free PDF.</em> <a href="https://packt.link/free-ebook/9781837631964">Free-Ebook</a> <img alt="Coding" height="15" width="35" src="https://media.tenor.com/ex_HDD_k5P8AAAAi/habbo-habbohotel.gif"></p>
<p>We also provide a PDF file that has color images of the screenshots/diagrams used in this book at <a href="https://packt.link/LMqir">GraphicBundle</a> <img alt="Coding" height="15" width="35" src="https://media.tenor.com/ex_HDD_k5P8AAAAi/habbo-habbohotel.gif"></p>
<h2>Get to know the Author</h2>
<p><em>Andrew Peter McMahon</em> has spent years building high-impact ML products across a variety of industries. He is currently Head of MLOps for NatWest Group in the UK and has a PhD in theoretical condensed matter physics from Imperial College London. He is an active blogger, speaker, podcast guest, and leading voice in the MLOps community. He is co-host of the AI Right podcast and was named ‘Rising Star of the Year’ at the 2022 British Data Awards and ‘Data Scientist of the Year’ by the Data Science Foundation in 2019.</p>
<h2>Other Related Books</h2>
<ul>
<li><a href="https://www.packtpub.com/product/deep-learning-with-tensorflow-and-keras-third-edition/9781803232911">Deep Learning with TensorFlow and Keras – Third Edition</a></li>
<li><a href="https://www.packtpub.com/product/mastering-kubernetes-fourth-edition/9781804611395">Mastering Kubernetes - Fourth Edition</a></li>
</ul>
- yash19sinha/coffee-bean
- 2023-10-10T01:31:07Z
- tag:github.com,2023-10-10:/yash19sinha/coffee-bean
-
- <p>Welcome to the "Coffee-Bean" Coffee Shop project! We're on a quest to blend coffee and code like never before. Join us for a latte-tude of coding fun. All skill levels are welcome to make this project as espresso-nal as it can be! Grab your digital mugs and join us.</p><hr><h1>Coffee-Bean Coffee Shop Website ☕</h1>
<p>Welcome to the Coffee-Bean Coffee Shop Website project! We're on a journey to blend coffee and code like never before. Join us and help make our website as brew-tiful as your favorite coffee blend.</p>
<h2>Table of Contents</h2>
<ul>
<li><a href="https://raw.githubusercontent.com/yash19sinha/coffee-bean/main/#contributing">Contributing</a></li>
<li><a href="https://raw.githubusercontent.com/yash19sinha/coffee-bean/main/#code-style-guidelines">Code Style Guidelines</a></li>
<li><a href="https://raw.githubusercontent.com/yash19sinha/coffee-bean/main/#reporting-issues">Reporting Issues</a></li>
<li><a href="https://raw.githubusercontent.com/yash19sinha/coffee-bean/main/#communication">Communication</a></li>
<li><a href="https://raw.githubusercontent.com/yash19sinha/coffee-bean/main/#contributors">Contributors</a></li>
<li><a href="https://raw.githubusercontent.com/yash19sinha/coffee-bean/main/#codeofconduct">CodeofConduct</a></li>
</ul>
<h2>Contributing</h2>
<p>We welcome contributions from everyone! Please review our <a href="https://raw.githubusercontent.com/yash19sinha/coffee-bean/main/CONTRIBUTING.md">Contribution Guidelines</a> to get started.</p>
<h2>Code Style Guidelines</h2>
<ul>
<li>Follow consistent coding style, including indentation and naming conventions.</li>
<li>Add comments for complex logic to enhance code readability.</li>
<li>Make sure your code is free from linting errors.</li>
</ul>
<h2>Reporting Issues</h2>
<p>If you find a bug, have a suggestion, or want to discuss something related to the project, please open an issue on the <a href="https://github.com/your-username/coffee-bean/issues">GitHub repository</a>. Be sure to include a clear description and, if applicable, steps to reproduce the issue.</p>
<h2>Communication</h2>
<p>Feel free to reach out to us through GitHub issues, discussions, or our <a href="https://raw.githubusercontent.com/yash19sinha/coffee-bean/main/%5Blink-to-forum%5D(https://github.com/yash19sinha/coffee-bean/discussions/2)">community forum</a> for any questions or ideas. We're excited to collaborate with you!</p>
<h2>Contributors</h2>
<p>A big shoutout to the fantastic contributors who have helped make this project a success. Your dedication and hard work are greatly appreciated!</p>
<h2>Thanks to all Contributors <a name="contributors"></a></h2>
<a href="https://github.com/yash19sinha/coffee-bean/graphs/contributors"> <img src="https://contrib.rocks/image?repo=yash19sinha/coffee-bean&max=400&columns=20"> <img src="https://us-central1-tooljet-hub.cloudfunctions.net/github" width="0" height="0"> </a>
<p>Made with <a href="https://contrib.rocks">contrib.rocks</a>. Would you like to see your name here? Contribute to our project today!</p>
<hr>
<p>Thank you for being a part of Coffee-Bean's coffee-fueled journey. ☕ Happy coding!</p>
<p>🌟 Don't forget to star ⭐ this repository if you find it brew-tiful and fork 🍴 it to make your own cup of coding magic! Let's spread the love for coffee and code together.</p>
<h2>Code of Conduct</h2>
<p>This repository adheres to the guidelines outlined in the <a href="https://raw.githubusercontent.com/yash19sinha/coffee-bean/main/CODE_OF_CONDUCT.md">Code of Conduct</a>.</p>
+ DevTownResources/Flipkart_clone-bootcamp
+ 2023-10-11T01:31:20Z
+ tag:github.com,2023-10-11:/DevTownResources/Flipkart_clone-bootcamp
+
+ <p>Clone of Flipkart using HTML,CSS and JavaScript</p><hr>
+
+
+ Devalphaspace/Dark-theme-portfolio
+ 2023-10-11T01:31:20Z
+ tag:github.com,2023-10-11:/Devalphaspace/Dark-theme-portfolio
+
+ <p></p><hr>
\ No newline at end of file
diff --git a/http/daily/index.xml b/http/daily/index.xml
index d4d23130de6..e40d119a699 100644
--- a/http/daily/index.xml
+++ b/http/daily/index.xml
@@ -1,7 +1,7 @@
GitHub HTTP Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:23Z
+ 2023-10-11T01:31:32Z
Daily Trending of HTTP in GitHub
\ No newline at end of file
diff --git a/hxml/daily/index.xml b/hxml/daily/index.xml
index 782a6795532..594a38b84f9 100644
--- a/hxml/daily/index.xml
+++ b/hxml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub HXML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:26Z
+ 2023-10-11T01:31:39Z
Daily Trending of HXML in GitHub
\ No newline at end of file
diff --git a/hy/daily/index.xml b/hy/daily/index.xml
index 1d403010b32..7e4e7884f76 100644
--- a/hy/daily/index.xml
+++ b/hy/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Hy Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:24Z
+ 2023-10-11T01:31:37Z
Daily Trending of Hy in GitHub
\ No newline at end of file
diff --git a/hyphy/daily/index.xml b/hyphy/daily/index.xml
index 1d72a379378..b22e2fbd349 100644
--- a/hyphy/daily/index.xml
+++ b/hyphy/daily/index.xml
@@ -1,7 +1,7 @@
GitHub HyPhy Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:25Z
+ 2023-10-11T01:31:36Z
Daily Trending of HyPhy in GitHub
\ No newline at end of file
diff --git a/idl/daily/index.xml b/idl/daily/index.xml
index 5bd8074ada2..59a68cc1067 100644
--- a/idl/daily/index.xml
+++ b/idl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub IDL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:27Z
+ 2023-10-11T01:31:38Z
Daily Trending of IDL in GitHub
\ No newline at end of file
diff --git a/idris/daily/index.xml b/idris/daily/index.xml
index e5c10d44f7f..ee7653bd182 100644
--- a/idris/daily/index.xml
+++ b/idris/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Idris Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:28Z
+ 2023-10-11T01:31:42Z
Daily Trending of Idris in GitHub
\ No newline at end of file
diff --git a/ignore-list/daily/index.xml b/ignore-list/daily/index.xml
index 1c4bddb90ef..ee88d85ccf1 100644
--- a/ignore-list/daily/index.xml
+++ b/ignore-list/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Ignore List Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:29Z
+ 2023-10-11T01:31:43Z
Daily Trending of Ignore List in GitHub
\ No newline at end of file
diff --git a/igor-pro/daily/index.xml b/igor-pro/daily/index.xml
index d50199107d9..546af9713ea 100644
--- a/igor-pro/daily/index.xml
+++ b/igor-pro/daily/index.xml
@@ -1,7 +1,7 @@
GitHub IGOR Pro Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:30Z
+ 2023-10-11T01:31:44Z
Daily Trending of IGOR Pro in GitHub
\ No newline at end of file
diff --git a/imagej-macro/daily/index.xml b/imagej-macro/daily/index.xml
index 05dcd6ebc2b..78cc8fa6079 100644
--- a/imagej-macro/daily/index.xml
+++ b/imagej-macro/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ImageJ Macro Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:30Z
+ 2023-10-11T01:31:41Z
Daily Trending of ImageJ Macro in GitHub
\ No newline at end of file
diff --git a/inform-7/daily/index.xml b/inform-7/daily/index.xml
index 774323ae0fd..d0e3586230f 100644
--- a/inform-7/daily/index.xml
+++ b/inform-7/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Inform 7 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:32Z
+ 2023-10-11T01:31:48Z
Daily Trending of Inform 7 in GitHub
\ No newline at end of file
diff --git a/ini/daily/index.xml b/ini/daily/index.xml
index 422881c81b9..e31426eabf3 100644
--- a/ini/daily/index.xml
+++ b/ini/daily/index.xml
@@ -1,7 +1,7 @@
GitHub INI Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:34Z
+ 2023-10-11T01:31:47Z
Daily Trending of INI in GitHub
\ No newline at end of file
diff --git a/inno-setup/daily/index.xml b/inno-setup/daily/index.xml
index fba22f5a041..c43419472a0 100644
--- a/inno-setup/daily/index.xml
+++ b/inno-setup/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Inno Setup Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:38Z
+ 2023-10-11T01:31:51Z
Daily Trending of Inno Setup in GitHub
\ No newline at end of file
diff --git a/io/daily/index.xml b/io/daily/index.xml
index 73697fb37dc..43b47907bb2 100644
--- a/io/daily/index.xml
+++ b/io/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Io Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:37Z
+ 2023-10-11T01:31:52Z
Daily Trending of Io in GitHub
\ No newline at end of file
diff --git a/ioke/daily/index.xml b/ioke/daily/index.xml
index 1d83f8b7872..d0e055ea2c0 100644
--- a/ioke/daily/index.xml
+++ b/ioke/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Ioke Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:35Z
+ 2023-10-11T01:31:50Z
Daily Trending of Ioke in GitHub
\ No newline at end of file
diff --git a/irc-log/daily/index.xml b/irc-log/daily/index.xml
index aca12d67678..22e4c7de650 100644
--- a/irc-log/daily/index.xml
+++ b/irc-log/daily/index.xml
@@ -1,7 +1,7 @@
GitHub IRC log Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:36Z
+ 2023-10-11T01:31:53Z
Daily Trending of IRC log in GitHub
\ No newline at end of file
diff --git a/isabelle-root/daily/index.xml b/isabelle-root/daily/index.xml
index 5dc4d3432d5..e57fd007100 100644
--- a/isabelle-root/daily/index.xml
+++ b/isabelle-root/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Isabelle ROOT Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:40Z
+ 2023-10-11T01:31:55Z
Daily Trending of Isabelle ROOT in GitHub
\ No newline at end of file
diff --git a/isabelle/daily/index.xml b/isabelle/daily/index.xml
index 64d05be0dc8..e5d40e7d30c 100644
--- a/isabelle/daily/index.xml
+++ b/isabelle/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Isabelle Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:41Z
+ 2023-10-11T01:31:56Z
Daily Trending of Isabelle in GitHub
\ No newline at end of file
diff --git a/j/daily/index.xml b/j/daily/index.xml
index 25e22a41aeb..c54a822752d 100644
--- a/j/daily/index.xml
+++ b/j/daily/index.xml
@@ -1,7 +1,7 @@
GitHub J Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:41Z
+ 2023-10-11T01:31:54Z
Daily Trending of J in GitHub
\ No newline at end of file
diff --git a/janet/daily/index.xml b/janet/daily/index.xml
index b437d1d22ee..d17b7b4bd60 100644
--- a/janet/daily/index.xml
+++ b/janet/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Janet Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:42Z
+ 2023-10-11T01:31:57Z
Daily Trending of Janet in GitHub
+
+ nvim-treesitter/nvim-treesitter-context
+ 2023-10-11T01:31:57Z
+ tag:github.com,2023-10-11:/nvim-treesitter/nvim-treesitter-context
+
+ <p>Show code context</p><hr>
+
\ No newline at end of file
diff --git a/jar-manifest/daily/index.xml b/jar-manifest/daily/index.xml
index 2fe7307f445..b04ceb7b9c9 100644
--- a/jar-manifest/daily/index.xml
+++ b/jar-manifest/daily/index.xml
@@ -1,7 +1,7 @@
GitHub JAR Manifest Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:45Z
+ 2023-10-11T01:31:58Z
Daily Trending of JAR Manifest in GitHub
\ No newline at end of file
diff --git a/jasmin/daily/index.xml b/jasmin/daily/index.xml
index 751c2754a8b..dc96d1c3f8e 100644
--- a/jasmin/daily/index.xml
+++ b/jasmin/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Jasmin Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:43Z
+ 2023-10-11T01:31:59Z
Daily Trending of Jasmin in GitHub
\ No newline at end of file
diff --git a/java-properties/daily/index.xml b/java-properties/daily/index.xml
index 95bf98a7209..5736d004e61 100644
--- a/java-properties/daily/index.xml
+++ b/java-properties/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Java Properties Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:44Z
+ 2023-10-11T01:32:00Z
Daily Trending of Java Properties in GitHub
\ No newline at end of file
diff --git a/java-server-pages/daily/index.xml b/java-server-pages/daily/index.xml
index b3f8fcd8588..9496bf3d0c5 100644
--- a/java-server-pages/daily/index.xml
+++ b/java-server-pages/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Java Server Pages Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:08Z
+ 2023-10-11T01:32:17Z
Daily Trending of Java Server Pages in GitHub
\ No newline at end of file
diff --git a/java/daily/index.xml b/java/daily/index.xml
index 01f1ee46949..fd8e8333ad6 100644
--- a/java/daily/index.xml
+++ b/java/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Java Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:31:48Z
+ 2023-10-11T01:32:03Z
Daily Trending of Java in GitHub
\ No newline at end of file
diff --git a/javascript+erb/daily/index.xml b/javascript+erb/daily/index.xml
index bd89bddf6dd..267c3c268db 100644
--- a/javascript+erb/daily/index.xml
+++ b/javascript+erb/daily/index.xml
@@ -1,7 +1,7 @@
GitHub JavaScript+ERB Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:07Z
+ 2023-10-11T01:32:18Z
Daily Trending of JavaScript+ERB in GitHub
\ No newline at end of file
diff --git a/javascript/daily/index.xml b/javascript/daily/index.xml
index 2b60750b1be..3f3e7451831 100644
--- a/javascript/daily/index.xml
+++ b/javascript/daily/index.xml
@@ -1,14 +1,21 @@
GitHub JavaScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:11Z
+ 2023-10-11T01:32:22Z
Daily Trending of JavaScript in GitHub
- DiamondHunters/NodeInject_Hook_example
- 2023-10-10T01:32:11Z
- tag:github.com,2023-10-10:/DiamondHunters/NodeInject_Hook_example
-
- <p>A hooking example for NodeInject</p><hr><h1>NodeInject_Hook_example</h1>
<p>A hooking example for NodeInject</p>
<h2>About <code>hook.js</code></h2>
<h4>WARNING</h4>
<p>JUST FOR LEARNING!</p>
<p><strong>PLEASE DO NOT ABUSE THIS SCRIPT CAPABILITY FOR THE PURPOSE OF INFRINGEMENT, AND YOU SHALL BEAR ALL CONSEQUENCES CAUSED BY YOUR ACTIONS.</strong></p>
<h4>Usage</h4>
<ol>
<li><code>git clone https://github.com/DiamondHunters/NodeInject.git</code></li>
<li>Replace <code>hooklog.js</code> with <code>hook.js</code> in this repo (or use <code>no_embed</code> feature and set <code>NO_EMBED_HOOK_JS_PATH</code> to the path of <code>hook.js</code>)</li>
<li>Run <code>cargo build</code> or <code>cargo build --features no_embed</code> to build a type of executable (If you enabled <code>no_embed</code> feature, you need to copy <code>hook.js</code> to the same directory of executable)</li>
<li>Run the executable</li>
</ol>
<p>If you need a fake license, you can run <code>cargo run</code> in <code>license-gen</code> directory</p>
<p>This fake license is not valid and just used for <strong>testing</strong>. Please do not use it for any other purpose.</p>
<h4>Ability</h4>
<ul>
<li><input type="checkbox" checked disabled> make typora to activate with the generated activation code (Test passed in version 1.5.8 on Windows,1.4.7 on Ubuntu)</li>
<li><input type="checkbox" checked disabled> hook <code>console.log</code> to remote http server and block override</li>
<li><input type="checkbox" checked disabled> hook <code>electron-fetch</code> for sniffing request</li>
<li><input type="checkbox" disabled> Full version compatibility (older version not using <code>electron-fetch</code> and may fail in the future)</li>
<li><input type="checkbox" disabled> Multi os compatibility (not work in macOS)</li>
</ul>
+ gnat/surreal
+ 2023-10-11T01:32:22Z
+ tag:github.com,2023-10-11:/gnat/surreal
+
+ <p>🗿 Mini jQuery alternative. Dependency-free animations. Pairs with htmx. Locality of Behavior. Use one element or arrays transparently. Vanilla querySelector() but better!</p><hr><h1>🗿 Surreal - tiny jQuery alternative for vanilla JS + inline Locality of Behavior</h1>
<p><img src="https://user-images.githubusercontent.com/24665/171092805-b41286b2-be4a-4aab-9ee6-d604699cc507.png" alt="cover"> (Art by <a href="https://www.deviantart.com/shahabalizadeh">shahabalizadeh</a>)</p>
<!--
<a href="https://github.com/gnat/surreal/archive/refs/heads/main.zip"><img src="https://img.shields.io/badge/Download%20.zip-ff9800?style=for-the-badge&color=%234400e5" alt="Download badge" /></a>
<a href="https://github.com/gnat/surreal"><img src="https://img.shields.io/github/workflow/status/gnat/surreal/ci?label=ci&style=for-the-badge&color=%237d91ce" alt="CI build badge" /></a>
<a href="https://github.com/gnat/surreal/releases"><img src="https://img.shields.io/github/workflow/status/gnat/surreal/release?label=Mini&style=for-the-badge&color=%237d91ce" alt="Mini build badge" /></a>
<a href="https://github.com/gnat/surreal/blob/main/LICENSE"><img src="https://img.shields.io/github/license/gnat/surreal?style=for-the-badge&color=%234400e5" alt="License badge" /></a>-->
<h2>Why does this exist?</h2>
<p>For devs who love ergonomics! You may appreciate Surreal if:</p>
<ul>
<li>You want to stay as close as possible to Vanilla JS.</li>
<li>Hate typing <code>document.querySelector</code> over.. and over..</li>
<li>Hate typing <code>addEventListener</code> over.. and over..</li>
<li>Really wish <code>document.querySelectorAll</code> had Array functions..</li>
<li>Really wish <code>this</code> would work in any inline <code><script></code> tag</li>
<li>Enjoyed using jQuery selector syntax.</li>
<li><a href="https://raw.githubusercontent.com/gnat/surreal/main/#-quick-start">Animations, timelines, tweens</a> with no extra libraries.</li>
<li>Only 320 lines. No build step. No dependencies.</li>
<li>Pairs well with <a href="https://htmx.org">htmx</a></li>
<li>Want fewer layers, less complexity. Are aware of the cargo cult. ✈️</li>
</ul>
<h2>✨ What does it add to Javascript?</h2>
<ul>
<li>⚡️ <a href="https://htmx.org/essays/locality-of-behaviour/">Locality of Behavior (LoB)</a> Use <code>me()</code> inside <code><script></code>
<ul>
<li>Get an element without creating a unique name: No <strong>.class</strong> or <strong>#id</strong> needed!</li>
<li><code>this</code> but better!</li>
<li>Want <code>me</code> in your CSS <code><style></code> tags, too? See our <a href="https://github.com/gnat/css-scope-inline">companion script</a></li>
</ul> </li>
<li>🔗 Call chaining, jQuery style.</li>
<li>♻️ Functions work seamlessly on 1 element or arrays of elements!
<ul>
<li>All functions can use: <code>me()</code>, <code>any()</code>, <code>NodeList</code>, <code>HTMLElement</code> (..or arrays of these!)</li>
<li>Get 1 element: <code>me()</code></li>
<li>..or many elements: <code>any()</code></li>
<li><code>me()</code> or <code>any()</code> can chain with any Surreal function.
<ul>
<li><code>me()</code> can be used directly as a single element (like <code>querySelector()</code> or <code>$()</code>)</li>
<li><code>any()</code> can use: <code>for</code> / <code>forEach</code> / <code>filter</code> / <code>map</code> (like <code>querySelectorAll()</code> or <code>$()</code>)</li>
</ul> </li>
</ul> </li>
<li>🌗 No forced style. Use: <code>classAdd</code> or <code>class_add</code> or <code>addClass</code> or <code>add_class</code>
<ul>
<li>Use <code>camelCase</code> (Javascript) or <code>snake_case</code> (Python, Rust, PHP, Ruby, SQL, <em>CSS</em>).</li>
</ul> </li>
</ul>
<h3>🤔 Why use <code>me()</code> / <code>any()</code> instead of <code>$()</code></h3>
<ul>
<li>💡 We solve the classic jQuery code bloat problem: Am I getting 1 element or an array of elements?
<ul>
<li><code>me()</code> is guaranteed to return 1 element (or first found, or null).</li>
<li><code>any()</code> is guaranteed to return an array (or empty array).</li>
<li>No more checks = you write less code. Bonus: Code reads more like self-documenting english.</li>
</ul> </li>
</ul>
<h2>👁️ How does it look?</h2>
<p>Do surreal things with <a href="https://htmx.org/essays/locality-of-behaviour/">Locality of Behavior</a> like:</p>
<pre><code class="language-html"><label for="file-input" >
<div class="uploader"></div>
<script>
me().on("dragover", ev => { halt(ev); me(ev).classAdd('.hover'); console.log("Files in drop zone.") })
me().on("dragleave", ev => { halt(ev); me(ev).classAdd('.hover'); console.log("Files left drop zone.") })
me().on("drop", ev => { halt(ev); me(ev).classRemove('.hover').classAdd('.loading'); me('#file-input').attribute('files', ev.dataTransfer.files); me('#form').trigger('change') })
</script>
</label>
</code></pre>
<p>See the <a href="https://gnat.github.io/surreal/example.html">Live Example</a>! Then <a href="https://github.com/gnat/surreal/raw/main/example.html">view source</a>.</p>
<h2>🎁 Install</h2>
<p>Surreal is only 320 lines. No build step. No dependencies.</p>
<p><a href="https://raw.githubusercontent.com/gnat/surreal/main/surreal.js">📥 Download</a> into your project, and add <code><script src="/surreal.js"></script></code> in your <code><head></code></p>
<p>Or, 🌐 use the CDN: <code><script src="https://cdn.jsdelivr.net/gh/gnat/surreal/surreal.js"></script></code></p>
<h2>⚡ Usage</h2>
<h3><a name="selectors"></a>🔍️ DOM Selection</h3>
<ul>
<li>Select <strong>one</strong> element: <code>me(...)</code>
<ul>
<li>Can be any of:
<ul>
<li>CSS selector: <code>".button"</code>, <code>"#header"</code>, <code>"h1"</code>, <code>"body > .block"</code></li>
<li>Variables: <code>body</code>, <code>e</code>, <code>some_element</code></li>
<li>Events: <code>event.target</code> will be used.</li>
<li>Surreal selectors: <code>me()</code>,<code>any()</code></li>
<li>Adding a <code>start=</code> parameter provides a starting DOM location to select from. Default is <code>document</code>
<ul>
<li>▶️ <code>any('button', start='header').classAdd('red')</code></li>
</ul> </li>
</ul> </li>
<li><code>me()</code> Get current element for <a href="https://htmx.org/essays/locality-of-behaviour/">Locality of Behavior</a> in <code><script></code> without an explicit <strong>.class</strong> or <strong>#id</strong></li>
<li><code>me("body")</code> Gets <code><body></code></li>
<li><code>me(".button")</code> Gets the first <code><div class="button">...</div></code>. To get all of them use <code>any()</code></li>
</ul> </li>
<li>Select <strong>one or more</strong> elements as an array: <code>any(...)</code>
<ul>
<li>Similar to <code>me()</code> but guaranteed to return an array (or empty array).</li>
<li><code>any(".foo")</code> Gets all matching elements, such as: <code><div class="foo">...</div></code></li>
<li>Feel free to convert between arrays of elements and single elements: <code>any(me())</code>, <code>me(any(".something"))</code></li>
</ul> </li>
</ul>
<h3>🔥 DOM Functions</h3>
<ul>
<li>♻️ All functions work on single elements or arrays of elements.</li>
<li>🔗 Start a chain using <code>me()</code> and <code>any()</code>
<ul>
<li>🟢 Style A <code>me().classAdd('red')</code> ⭐ Chain style, recommended!</li>
<li>🟠 Style B: <code>classAdd(me(), 'red')</code></li>
</ul> </li>
<li>🌐 Global conveniences help you write less code.
<ul>
<li><code>globalsAdd()</code> will automatically warn about any clobbering issues.
<ul>
<li>If you prefer no conveniences, just delete <code>globalsAdd()</code>
<ul>
<li><code>me().classAdd('red')</code> with <code>globalsAdd()</code> removed: <code>$.me().classAdd('red')</code></li>
<li><code>classAdd(me(), 'red')</code> with <code>globalsAdd()</code> removed: <code>$.classAdd($.me(), 'red')</code></li>
</ul> </li>
</ul> </li>
</ul> </li>
</ul>
<p>See: <a href="https://raw.githubusercontent.com/gnat/surreal/main/#quick-start">Quick Start</a> and <a href="https://raw.githubusercontent.com/gnat/surreal/main/#reference">Reference</a> and <a href="https://raw.githubusercontent.com/gnat/surreal/main/#no-surreal">No Surreal Needed</a></p>
<h2><a name="quick-start"></a>⚡ Quick Start</h2>
<ul>
<li>Add a class
<ul>
<li><code>me().classAdd('red')</code></li>
<li><code>any("button").classAdd('red')</code></li>
</ul> </li>
<li>Events
<ul>
<li><code>me().on("click", ev => me(ev).fadeOut() )</code></li>
<li><code>on(any('button'), 'click', ev => { me(ev).styles('color: red') })</code></li>
</ul> </li>
<li>Run functions over elements.
<ul>
<li><code>any('button').run(_ => { alert(_) })</code></li>
</ul> </li>
<li>Styles / CSS
<ul>
<li><code>me().styles('color: red')</code></li>
<li><code>me().styles({ 'color':'red', 'background':'blue' })</code></li>
</ul> </li>
<li>Attributes
<ul>
<li><code>me().attribute('active', true)</code></li>
</ul> </li>
</ul>
<p><a name="timelines"></a></p>
<h4>Timeline animations without any libraries.</h4>
<pre><code class="language-html"><div>I change color every second.
<script>
// Every second animate something new.
me().on("click", async ev => {
me(ev).styles({ "transition": "background 1s" })
await sleep(1000)
me(ev).styles({ "background": "red" })
await sleep(1000)
me(ev).styles({ "background": "green" })
await sleep(1000)
me(ev).styles({ "background": "blue" })
await sleep(1000)
me(ev).styles({ "background": "none" })
await sleep(1000)
me(ev).remove()
})
</script>
</div>
</code></pre>
<pre><code class="language-html"><div>I fade out and remove myself.
<script>me().on("click", ev => { me(ev).fadeOut() })</script>
</div>
</code></pre>
<pre><code class="language-html"><div>I change color every second.
<script>
// Run immediately.
(async (e = me()) => {
me(e).styles({ "transition": "background 1s" })
await sleep(1000)
me(e).styles({ "background": "red" })
await sleep(1000)
me(e).styles({ "background": "green" })
await sleep(1000)
me(e).styles({ "background": "blue" })
await sleep(1000)
me(e).styles({ "background": "none" })
await sleep(1000)
me(e).remove()
})()
</script>
</div>
</code></pre>
<pre><code class="language-html"><script>
// Run immediately, for every <button> globally!
(async () => {
any("button").fadeOut()
})()
</script>
</code></pre>
<h4>Array methods</h4>
<pre><code class="language-html">any('button')?.forEach(...)
any('button')?.map(...)
</code></pre>
<h2><a name="reference"></a>👁️ Functions</h2>
<p>Looking for <a href="https://raw.githubusercontent.com/gnat/surreal/main/#selectors">DOM Selectors</a>? Looking for stuff <a href="https://raw.githubusercontent.com/gnat/surreal/main/#no-surreal">we recommend doing in vanilla JS</a>?</p>
<h3>🧭 Legend</h3>
<ul>
<li>🔗 Chainable off <code>me()</code> and <code>any()</code></li>
<li>🌐 Global convenience helper.</li>
<li>▶️ Runnable example.</li>
<li>🔌 Built-in Plugin</li>
</ul>
<h3>👁️ At a glance</h3>
<ul>
<li>🔗 <code>run</code>
<ul>
<li>It's <code>forEach</code> but less wordy and works on single elements, too!</li>
<li>▶️ <code>me().run(e => { alert(e) })</code></li>
<li>▶️ <code>any('button').run(e => { alert(e) })</code></li>
</ul> </li>
<li>🔗 <code>remove</code>
<ul>
<li>▶️ <code>me().remove()</code></li>
<li>▶️ <code>any('button').remove()</code></li>
</ul> </li>
<li>🔗 <code>classAdd</code> 🔁 <code>class_add</code> 🔁 <code>addClass</code> 🔁 <code>add_class</code>
<ul>
<li>▶️ <code>me().classAdd('active')</code></li>
<li>Leading <code>.</code> is <strong>optional</strong> for all class functions, and is removed automatically.
<ul>
<li>These are the same: <code>me().classAdd('active')</code> 🔁 <code>me().classAdd('.active')</code></li>
</ul> </li>
</ul> </li>
<li>🔗 <code>classRemove</code> 🔁 <code>class_remove</code> 🔁 <code>removeClass</code> 🔁 <code>remove_class</code>
<ul>
<li>▶️ <code>me().classRemove('active')</code></li>
</ul> </li>
<li>🔗 <code>classToggle</code> 🔁 <code>class_toggle</code> 🔁 <code>toggleClass</code> 🔁 <code>toggle_class</code>
<ul>
<li>▶️ <code>me().classToggle('active')</code></li>
</ul> </li>
<li>🔗 <code>styles</code>
<ul>
<li>▶️ <code>me().styles('color: red')</code> Add style.</li>
<li>▶️ <code>me().styles({ 'color':'red', 'background':'blue' })</code> Add multiple styles.</li>
<li>▶️ <code>me().styles({ 'background':null })</code> Remove style.</li>
</ul> </li>
<li>🔗 <code>attribute</code> 🔁 <code>attributes</code> 🔁 <code>attr</code>
<ul>
<li>Get: ▶️ <code>me().attribute('data-x')</code>
<ul>
<li>Get is only for single elements. For many, wrap the call in <code>any(...).run(...)</code> or <code>any(...).forEach(...)</code>.</li>
</ul> </li>
<li>Set: ▶️<code>me().attribute('data-x', true)</code></li>
<li>Set multiple: ▶️ <code>me().attribute({ 'data-x':'yes', 'data-y':'no' })</code></li>
<li>Remove: ▶️ <code>me().attribute('data-x', null)</code></li>
<li>Remove multiple: ▶️ <code>me().attribute({ 'data-x': null, 'data-y':null })</code></li>
</ul> </li>
<li>🔗 <code>trigger</code>
<ul>
<li>▶️ <code>me().trigger('hello')</code></li>
<li>Wraps <code>dispatchEvent</code></li>
</ul> </li>
<li>🔗 <code>on</code>
<ul>
<li>▶️ <code>me().on('click', ev => { me(ev).styles('background', 'red') })</code></li>
<li>Wraps <code>addEventListener</code></li>
</ul> </li>
<li>🔗 <code>off</code>
<ul>
<li>▶️ <code>me().remove('click')</code></li>
<li>Wraps <code>removeEventListener</code></li>
</ul> </li>
<li>🔗 <code>offAll</code>
<ul>
<li>▶️ <code>me().offAll()</code></li>
</ul> </li>
<li>🌐 <code>sleep</code>
<ul>
<li>▶️ <code>await sleep(1000, ev => { alert(ev) })</code></li>
<li><code>async</code> version of <code>setTimeout</code></li>
<li>Wonderful for animation timelines.</li>
</ul> </li>
<li>🌐 <code>tick</code>
<ul>
<li>▶️ <code>await tick()</code></li>
<li><code>await</code> version of <code>rAF</code> / <code>requestAnimationFrame</code>.</li>
<li>Animation tick. Waits 1 frame.</li>
<li>Great if you need to wait for events to propagate.</li>
</ul> </li>
<li>🌐 <code>rAF</code>
<ul>
<li>▶️ <code>rAF(e => { return e })</code></li>
<li>Animation tick. Fires when 1 frame has passed. Alias of <a href="https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame">requestAnimationFrame</a></li>
<li>Great if you need to wait for events to propagate.</li>
</ul> </li>
<li>🌐 <code>rIC</code>
<ul>
<li>▶️ <code>rIC(e => { return e })</code></li>
<li>Great time to compute. Fires function when JS is idle. Alias of <a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback">requestIdleCallback</a></li>
</ul> </li>
<li>🌐 <code>halt</code>
<ul>
<li>▶️ <code>halt(event)</code></li>
<li>Great to prevent default browser behavior: such as displaying an image vs letting JS handle it.</li>
<li>Wrapper for <a href="https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault">preventDefault</a></li>
</ul> </li>
<li>🌐 <code>createElement</code> 🔁 <code>create_element</code>
<ul>
<li>▶️ <code>e_new = createElement("div"); me().prepend(e_new)</code></li>
<li>Alias of vanilla <code>document.createElement</code></li>
</ul> </li>
<li>🌐 <code>onloadAdd</code> 🔁 <code>onload_add</code> 🔁 <code>addOnload</code> 🔁 <code>add_onload</code>
<ul>
<li>▶️ <code>onloadAdd(_ => { alert("loaded!"); })</code></li>
<li>Execute after the DOM is ready. Similar to jquery <code>ready()</code></li>
<li>Queues functions onto <code>window.onload</code></li>
<li>Why? So you don't overwrite <code>window.onload</code>, also predictable sequential loading!</li>
</ul> </li>
</ul>
<h3><a name="plugin-included"></a>🔌 Built-in Plugins</h3>
<h3>Effects</h3>
<p>Build effects with <code>me().styles({...})</code> with timelines using <a href="https://raw.githubusercontent.com/gnat/surreal/main/#timelines">CSS transitioned <code>await</code> or callbacks</a>.</p>
<p>Common effects included:</p>
<ul>
<li> <p>🔗 <code>fadeOut</code> 🔁 <code>fade_out</code></p>
<ul>
<li>Fade out and remove element.</li>
<li>Keep element with <code>remove=false</code>.</li>
<li>▶️ <code>me().fadeOut()</code></li>
<li>▶️ <code>me().fadeOut(ev => { alert("Faded out!") }, 3000)</code> Over 3 seconds then call function.</li>
</ul> </li>
<li> <p>🔗 <code>fadeIn</code> 🔁 <code>fade_in</code></p>
<ul>
<li>Fade in existing element which has <code>opacity: 0</code></li>
<li>▶️ <code>me().fadeIn()</code></li>
<li>▶️ <code>me().fadeIn(ev => { alert("Faded in!") }, 3000)</code> Over 3 seconds then call function.</li>
</ul> </li>
</ul>
<h2><a name="no-surreal"></a>🔮 No Surreal Needed</h2>
<p>More often than not, Vanilla JS is the easiest way!</p>
<p>Logging</p>
<ul>
<li>🌐 <code>console.log()</code> <code>console.warn()</code> <code>console.error()</code></li>
<li>Event logging: ▶️ <code>monitorEvents(me())</code> See: <a href="https://developer.chrome.com/blog/quickly-monitor-events-from-the-console-panel-2/">Chrome Blog</a></li>
</ul>
<p>Benchmarking / Time It!</p>
<ul>
<li>▶️ <code>console.time('name')</code></li>
<li>▶️ <code>console.timeEnd('name')</code></li>
</ul>
<p>Text / HTML Content</p>
<ul>
<li>▶️ <code>me().textContent = "hello world"</code>
<ul>
<li>XSS Safe! See: <a href="https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent">MDN</a></li>
</ul> </li>
<li>▶️ <code>me().innerHTML = "<p>hello world</p>"</code></li>
<li>▶️ <code>me().innerText = "hello world"</code></li>
</ul>
<p>Children</p>
<ul>
<li>▶️ <code>me().children</code></li>
<li>▶️ <code>me().children.hidden = true</code></li>
</ul>
<p>Append / Prepend elements.</p>
<ul>
<li>▶️ <code>me().prepend(new_element)</code></li>
<li>▶️ <code>me().appendChild(new_element)</code></li>
<li>▶️ <code>me().insertBefore(element, other_element.firstChild)</code></li>
<li>▶️ <code>me().insertAdjacentHTML("beforebegin", new_element)</code></li>
</ul>
<h2>💎 Conventions & Tips</h2>
<ul>
<li><code>_</code> = for temporary or unused variables. Keep it short and sweet!</li>
<li><code>e</code>, <code>el</code>, <code>elt</code> = element</li>
<li><code>e</code>, <code>ev</code>, <code>evt</code> = event</li>
<li><code>f</code>, <code>fn</code> = function</li>
<li>Many things can be done in vanilla HTML / CSS (ex: dropdowns).</li>
<li>Find where your change touches the least code.</li>
<li>Simplicity and ergonomics tend to have exponential payoff.</li>
</ul>
<h2><a name="plugins"></a>🔌 Adding a function</h2>
<p>Feel free to modify Surreal for a particular project any way you like- but you can use this system to effortlessly merge functions with new versions.</p>
<ol>
<li>Add your function</li>
</ol>
<pre><code class="language-javascript">var $thing = {
test(e, name) {
console.log(`Hello ${name} from ${e}`)
return e
}
}
$ = {...$, ...$thing}
</code></pre>
<ol start="2">
<li>Is your function chainable? Add to <code>sugar()</code></li>
</ol>
<pre><code class="language-javascript">$.sugars['test'] = (name) => { return $.test($._e, name) }
</code></pre>
<ol start="3">
<li>Your function will be added globally by <code>globalsAdd()</code> If you do not want this (ex: name clash), add it to the restricted list.</li>
</ol>
<p>Refer to an existing function to see how to make your function work with 1 or many elements.</p>
<p>Make an <a href="https://github.com/gnat/surreal/issues">issue</a> or <a href="https://github.com/gnat/surreal/pulls">pull request</a> if you think people would like to use it! If it's useful enough we'll want it in core.</p>
<h3>⭐ Awesome Surreal examples, plugins, and resources: <a href="https://github.com/gnat/awesome-surreal">awesome-surreal</a> !</h3>
<h2>📚️ Inspired by</h2>
<ul>
<li><a href="https://jquery.com/">jQuery</a> for the chainable syntax we all love.</li>
<li><a href="https://github.com/argyleink/blingblingjs">BlingBling.js</a> for modern minimalism.</li>
<li><a href="https://blissfuljs.com/">Bliss.js</a> for a focus on single elements and extensibility.</li>
<li><a href="https://hyperscript.org">Hyperscript</a> for Locality of Behavior and awesome ergonomics.</li>
<li>Shout out to <a href="https://umbrellajs.com/">Umbrella</a>, <a href="https://github.com/fabiospampinato/cash">Cash</a>, <a href="https://zeptojs.com/">Zepto</a>- Not quite as ergonomic. Requires build step to extend.</li>
</ul>
<h2>🌘 Future</h2>
<ul>
<li>Always more <code>example.html</code> goodies!</li>
<li>Automated browser testing perhaps with:
<ul>
<li><a href="https://github.com/fabiospampinato/fava">Fava</a>. See: <a href="https://github.com/avajs/ava/issues/24#issuecomment-885949036">https://github.com/avajs/ava/issues/24#issuecomment-885949036</a></li>
<li><a href="https://github.com/avajs/ava/raw/main/docs/recipes/browser-testing.md">Ava</a></li>
<li><a href="https://github.com/jsdom/jsdom">jsdom</a>
<ul>
<li><a href="https://github.com/jsdom/jsdom#executing-scripts">jsdom notes</a></li>
</ul> </li>
</ul> </li>
</ul>
+
+
+ QiuChenlyOpenSource/QQFlacMusicDownloader
+ 2023-10-11T01:32:22Z
+ tag:github.com,2023-10-11:/QiuChenlyOpenSource/QQFlacMusicDownloader
+
+ <p>[秋城落叶] QQ 音乐源无损歌曲下载</p><hr><h1>大纲</h1>
<!-- TOC -->
<ul>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E5%A4%A7%E7%BA%B2">大纲</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E4%BB%8B%E7%BB%8D">介绍</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98">已知问题</a>
<ul>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E5%85%B3%E4%BA%8E%E7%BD%91%E6%98%93%E4%BA%91%E7%99%BB%E5%BD%95%E5%8A%9F%E8%83%BD%E7%9A%84%E5%A3%B0%E6%98%8E">关于网易云登录功能的声明:</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E5%89%8D%E5%90%8E%E7%AB%AF%E6%BA%90%E7%A0%81%E6%96%87%E4%BB%B6%E5%A4%B9">前后端源码文件夹</a>
<ul>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E7%89%B9%E5%88%AB%E5%8A%9F%E8%83%BD">特别功能</a>
<ul>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E5%B7%B2%E6%94%AF%E6%8C%81%E5%85%83%E6%95%B0%E6%8D%AE%E5%86%85%E5%B5%8C%E6%AD%8C%E8%AF%8D%E5%B0%81%E9%9D%A2%E4%BF%A1%E6%81%AF%E5%86%99%E5%85%A5">已支持元数据+内嵌歌词封面信息写入</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E5%8D%B3%E5%B0%86%E5%A2%9E%E5%8A%A0%E6%96%B0%E5%8A%9F%E8%83%BD">即将增加新功能</a></li>
</ul> </li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95">使用方法</a>
<ul>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#0-%E4%BB%A3%E7%A0%81%E6%9B%B4%E6%96%B0%E9%A2%91%E7%B9%81%E5%88%87%E8%AE%B0%E5%8F%8A%E6%97%B6%E6%9B%B4%E6%96%B0">0. 代码更新频繁,切记及时更新</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#1-%E5%AE%89%E8%A3%85%E7%8E%AF%E5%A2%83">1. 安装环境</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#2-%E8%BF%9B%E5%85%A5%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%9B%AE%E5%BD%95%E4%B8%8B%E5%90%AF%E5%8A%A8%E8%BD%AF%E4%BB%B6">2. 进入软件包目录下启动软件</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E9%AB%98%E7%BA%A7%E6%90%9C%E7%B4%A2%E6%96%B9%E6%B3%95">高级搜索方法</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E6%96%B0%E5%A2%9E%E6%AD%8C%E6%9B%B2%E5%85%83%E6%95%B0%E6%8D%AE%E5%88%AE%E5%89%8A%E5%86%85%E5%B5%8C">新增歌曲元数据刮削内嵌</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E6%96%B0%E5%A2%9E%E7%BD%91%E6%98%93%E4%BA%91%E7%9B%98%E6%AD%8C%E6%9B%B2%E4%BF%A1%E6%81%AF%E7%BA%A0%E9%94%99">新增网易云盘歌曲信息纠错</a>
<ul>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E7%A1%AE%E8%AE%A4%E5%8C%B9%E9%85%8D">确认匹配</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E5%8F%96%E6%B6%88%E5%8C%B9%E9%85%8D">取消匹配</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#docker%E9%95%9C%E5%83%8F%E9%83%A8%E7%BD%B2">Docker镜像部署</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%AB%AF%E5%8F%A3%E8%AE%BE%E7%BD%AE">自定义端口设置</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E5%85%8D%E8%B4%A3%E5%A3%B0%E6%98%8E">免责声明</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E8%87%B4%E8%B0%A2">致谢</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E5%85%B6%E4%BB%96%E8%B5%84%E6%96%99">其他资料</a></li>
<li><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/#%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A">名词解释</a></li>
</ul>
<!-- TOC -->
<h1><p align="center">介绍</p></h1>
<p align="center">Create & Design By QiuChenly</p>
<br> 这是一个批量下载 QQ 音乐/酷我音乐/网易云会员无损音质歌曲的脚本,技术含量并不是很大,仅供参考。
<p>参考是让你参考代码,不是让你想着法儿去白嫖。 今天你不愿意掏198的数字专辑费用,明天你就会失去赚到198万的机会。</p>
<p>眼界决定了人生未来,格局决定了人生上限。哥们主打的就是一个三观。</p>
<p>鲁迅曾经说过:舍小我成大我,我不入地狱谁入地狱?</p>
<p>所以白嫖的事情我来,付钱你来。</p>
<pre><code class="language-any">前端技术:
Vue3+TS+Pinia+ElementUI Plus
后端技术:
Python3.11.2 + Flask + Concurrency协程
开发环境:
BenQ Laptop Core Duo 双核 1.2Ghz + 2GB DDR3
OS : Windows 7 x64
Env: Python 3.11.2
IDE: Windows Notepad
</code></pre>
<p>教程只能解决使用方法上的问题,解决不了dinner的问题。</p>
<h1>已知问题</h1>
<ol>
<li>Windows用户可能体验不是很好,因为很多适配坑。</li>
<li>QQ音乐搜不到,是因为搜索频率过快。别问我为什么才搜两次就频繁了,你问qq。</li>
<li>下载歌曲后前端页面没有提示,看命令行窗口就知道有没有下载成功了。</li>
</ol>
<h2>关于网易云登录功能的声明:</h2>
<ul>
<li>第三方网易云API服务器来自于互联网,开发者不承认且不担保其具有官方服务器性质,并对该服务器可能会泄露用户信息的可能性保持怀疑。</li>
<li>此服务器不可信,请使用完后修改网易云账号密码避免账号失窃。</li>
<li>本项目不会保存任何个人隐私信息,但是不对使用的第三方服务器安全性/隐私性做保证。</li>
<li>使用者因使用本服务导致的数据泄露账号失窃等问题由使用者独自承担后果,开发者概不负责。</li>
<li>使用本服务即表示你同意以上条款,对于使用者在明知或不知以上条款情况下使用本项目所造成的任何数据/泄露隐私泄漏的后果由使用者自行承担,开发者不对任何数据安全性作保证。</li>
<li>本项目为完全公益性项目,谢绝任何形式打赏与钱财赠与,以前不会接受以后也不会接受。</li>
<li>使用本项目所造成的一切数据泄露,账号失窃,财产损失等严重后果有用户自行承担风险,开发者已经对用户可能所受到的攻击和安全问题做到了尽可能的提示与告知。</li>
<li>如果本项目侵犯了你的合法权益,请电子邮件到<a href="mailto:qiuchenly@outlook.com">qiuchenly@outlook.com</a>,我将第一时间删库跑路。</li>
<li>总结: 号没了跟我无关</li>
</ul>
<h1>前后端源码文件夹</h1>
<p>前端界面源代码: <a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/WebSourceCode">WebSourceCode</a></p>
<p>后端Flask主代码: <a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/flaskSystem">flaskSystem</a></p>
<p>提交代码时源码顶部的版权注释尽量不要修改,这是我IDE自动生成的,每次都会自动更新。 如果你需要保留你的修改记录,可以通过Google风格的注释附加在函数注释上:</p>
<p><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_4.png" alt="img_4.png"></p>
<h2>特别功能</h2>
<table>
<thead>
<tr>
<th>功能</th>
<th>状态</th>
<th>附加说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>酷我音乐</td>
<td>✅</td>
<td>支持Flac和320KbpsMP3下载 根据网友梨花喵的加密算法获取解析</td>
</tr>
<tr>
<td>FreeMyMP3</td>
<td>⌛️</td>
<td>狠狠的加密 v2算法已破解 下载接口参数有问题 暂时不可用</td>
</tr>
<tr>
<td>咪咕音乐</td>
<td>✅</td>
<td>可以下载Flac/320KbpsMP3歌曲</td>
</tr>
<tr>
<td>QQ音乐</td>
<td>✅</td>
<td>已经修复官方无损解析接口</td>
</tr>
<tr>
<td>网易云音乐</td>
<td>❌</td>
<td>版权问题灰色歌曲没有CDN资源缓存 无法下载</td>
</tr>
</tbody>
</table>
<p>基于web的友好界面出来啦</p>
<p><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/media/img_2.png" alt="img_2.png"> <img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_2.png" alt="img_2.png"> <img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_3.png" alt="img_3.png"></p>
<h3>已支持元数据+内嵌歌词封面信息写入</h3>
<p><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img.png" alt="img.png"> <img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/img_2.png" alt="img_2.png"></p>
<p>目前仅适配: 目前已完整支持全部常见元数据补全 MP3/FLAC/HiRes格式文件补全</p>
<ol>
<li>咪咕音乐</li>
<li>酷我音乐</li>
<li>QQ音乐 (最全面支持 只要能写入的元数据信息我都写入了包括专辑/歌手/专辑高清图像/专辑简介/流派/歌曲语言...)</li>
</ol>
<h3>即将增加新功能</h3>
<p>功能现在还没法用,不要乱点。你点了是没有反应的。</p>
<ol>
<li>本地音乐元数据匹配</li>
<li>下载音乐时自动匹配元数据过滤系统 <img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/image.png" alt="匹配系统"></li>
</ol>
<hr>
<h1>使用方法</h1>
<h3>0. 代码更新频繁,切记及时更新</h3>
<p>有问题先下载最新的代码再看看是不是已经被解决了,而不是拿着几天前的代码问我为什么启动不了。 你怎么不问问你自己一年前追的女神怎么今天跟别人酒店里泡芙都流出来了,为什么你还没追到呢?</p>
<p>楼主一般情况下脾气是很温和的,但是架不住小可爱太多了。提的也是可爱dinner问题,令人忍俊不禁莞尔一笑。</p>
<p>只有你学校的老师才会耐心解决你的问题,我只对我的学生负责,我不对小可爱负责。</p>
<h3>1. 安装环境</h3>
<p>首先安装最新的 python3.11.2 到你的操作系统里。</p>
<p>Windows用户强制安装此版本: <a href="https://www.python.org/ftp/python/3.11.2/python-3.11.2-amd64.exe">点击下载 -> Python3.11.2</a></p>
<pre><code class="language-any">Windows用户须知: 不是Windows用户不用看这一段小作文
首先我在此明确表示我的观点: Windows就是全宇宙最优秀的操作系统。
1.卸载电脑上所有的python版本,哪怕是3.10都不行.
如果你会玩python,那么你可以不用看这个提示.
如果你就是个纯纯的新手,我的建议是认真看一下.
2.Windows应用商店的残疾Python版本不要安装.
装完出问题然后还要明知故问,我会为你送上优美的赞歌.
计算机技术基础不应该由我给你补.
3.不要把项目放在文件夹路径有空格的目录下
比如你非要把下载好的代码文件放到
D:/Program Files(x86)/Test 123/AB CD/
这种存在空格的路径下面,运行报错再来问我那你确实注定要被我赞美称颂.
4.题外话
你要实在不会用,就真别用了吧.
但是你用不了就别到处发"这东西根本没吊用"之类的言论
你dinner不代表别人dinner。
球球了,折磨你自己可以,别折磨我.
windows用户如果有任何体验上的问题,请提交代码Merge。不要一句“不行没法用”来反馈。哥们看到这种可爱issues直接给你关了。
让我们共建和谐互联网大家庭。
最后,Microsoft Windows我测你的码。
</code></pre>
<p>macOS用户: 系统自带的python3.9版本就够了 不需要另外安装</p>
<p>以下所有操作<strong>皆默认假设CMD/Powershell/Bash/zsh的当前目录</strong>在:</p>
<pre><code>(Windows)
D:/Downloads/QQFlacMusicDownloader-master/
在文件夹空白处按住shift+鼠标右击,点击"在此处打开PowerShell"。
如果你很懂,cd命令进入上面的目录也行。
(macOS/Unix/Linux)
~/Download/QQFlacMusicDownloader-master/
终端cd进入上面的目录.
</code></pre>
<p>安装依赖包如果出现 404 错误或者太慢,可以用下面的代码切换到清华大学服务器安装。</p>
<pre><code class="language-bash"># 设置python的依赖安装镜像服务器为清华大学服务器
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
</code></pre>
<pre><code class="language-bash"># 安装软件依赖必须包
pip3 install -r requirements.txt
</code></pre>
<h3>2. 进入软件包目录下启动软件</h3>
<p>终端/控制台 进入到本文件所在的目录 执行以下指令:</p>
<pre><code class="language-bash">python3 MainServer.py
</code></pre>
<p>由于Windows的可爱设计,在Windows上可能是</p>
<pre><code class="language-commandline">python MainServer.py
</code></pre>
<p>如果你是windows10/11,那么系统很有可能会让你安装Windows应用商店的Python残疾版本,如果你不知道该不该安装的话,看看上面Windows用户须知。</p>
<p>启动后应该能看到这些信息,红色警告不是错误,无知可以但不要怀疑哥们的实力。看到类似于下面的输出提示即表示你启动成功。没看到类似下面的信息说明没成功。</p>
<p>没成功你也别急,截图+操作环境+操作步骤详细给出一份报告,而不是用几个字"本地环境实测无法启动"来概括。 恕我直言,你不是文曲星,没那本事几个字概括核心要点就不要概括,我理都不想理你。 <img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_1.png" alt="img_1.png"></p>
<p>成功后google chrome/Microsoft Edge/Safari浏览器打开<a href="http://127.0.0.1:8899">http://127.0.0.1:8899</a>即可打开新世界。</p>
<p>只在Edge浏览器测试UI通过,建议全部使用Microsoft Edge浏览器访问。</p>
<h3>高级搜索方法</h3>
<p>目前 <strong>仅支持</strong> QQ音乐/咪咕音乐搜索。</p>
<table>
<thead>
<tr>
<th>指令</th>
<th>例子</th>
<th>id从哪找</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>(album) b:+专辑ID</td>
<td><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_7.png" alt="img_7.png"></td>
<td><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_6.png" alt="img_6.png"></td>
<td>(QQ音乐)获取一张专辑里的歌曲</td>
</tr>
<tr>
<td>(album) b:+专辑ID</td>
<td><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/img.png" alt="img.png"></td>
<td><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/img_1.png" alt="img_1.png"></td>
<td>(咪咕)获取一张专辑里的歌曲</td>
</tr>
<tr>
<td>(playlist) p:+歌单ID</td>
<td><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_9.png" alt="img_9.png"></td>
<td><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_8.png" alt="img_8.png"></td>
<td>获取一张歌单里的所有歌曲,需要注意的是列表下面的分页是无效的 不要切换页面 因为他一次性是加载的整个歌单列表</td>
</tr>
<tr>
<td>(id) id:+歌曲ID</td>
<td><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_11.png" alt="img_11.png"></td>
<td><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_10.png" alt="img_10.png"></td>
<td>有时候有些二逼非主流歌曲名称是及其之难以用输入法扣出来的,这个时候可以用id直接获取到这首歌。不想用那些二逼非主流歌曲做演示,用我最爱的杰伦演示给你们看看得了</td>
</tr>
<tr>
<td>(toplist) t:+榜单ID</td>
<td><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_17.png" alt="img_17.png"></td>
<td><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_16.png" alt="img_16.png"></td>
<td>获取一张榜单里的歌曲</td>
</tr>
</tbody>
</table>
<p>2023.4.14</p>
<ul>
<li>修复歌曲关键词过滤不可定制化搜索的问题,满足搜索部分土嗨神曲的需求。现在可以在搜索界面关闭关键词过滤或者在首页自定义过滤关键词。</li>
</ul>
<h3>新增歌曲元数据刮削内嵌</h3>
<p>开发中,目前效果不等于最终效果。</p>
<p>本功能用于为本地音乐文件写入元数据功能,实现内嵌歌词文件/歌手/专辑/封面图片/专辑序号/发布年代等元数据信息,避免播放时一片空白无法加载歌曲信息的问题出现。 主要使用以下接口:</p>
<ol>
<li>iTunes 专辑信息接口 + 歌词信息 + 苹果特有的4K超清专辑封面图</li>
<li>QQ 音乐专辑信息接口 + 歌词信息 + 800x800低清专辑封面图</li>
</ol>
<p>梗小鬼提问时间<br> Q: 为什么不用酷我/咪咕接口?<br> A: 因为老子高兴。iTunes+QQ基本上全球音乐元数据都全了,怎么,不够你用是吧?</p>
<p>为了保证数据精确度,仅支持完整匹配以下文件夹结构:<br> /周杰伦/专辑列表文件夹/周杰伦 - 一路向北.flac</p>
<p>例子: <img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_lst2.png" alt="img_1.png"></p>
<p>或已经内置歌手专辑与歌曲名称的flac文件,对于这类文件将从iTunes/QQ中搜索补全剩余专辑信息。(从本项目下载的歌曲均自动已存在此信息)</p>
<p>效果预览: <img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_lst1.png" alt="img.png"> 灰色无任何信息的歌曲就是没有自动匹配元数据的,写入了元数据的歌曲将会拥有精美封面图和完整的歌曲专辑元数据信息---这一切都本地存储在音乐文件中!</p>
<h3>新增网易云盘歌曲信息纠错</h3>
<p>可以搜索歌曲或指定歌曲ID来关联你上传到网易云盘里的歌曲。 在使用前需要打开网易云登录界面一次更新Cookie才可以访问到你的云盘数据。 加载时由于一次加载1000条数据,所以加载缓慢,请等几秒钟。</p>
<h4>确认匹配</h4>
<p>通过你设置的ID或者搜索到的歌曲来绑定这首歌的实际歌曲数据。 如果你想取消某首歌的匹配可以点击取消匹配。</p>
<h4>取消匹配</h4>
<p>取消网易云自动/手动匹配的错误歌曲信息。有时候我们上传的歌曲信息网易云会识别错误,所以我们可以取消匹配或者手动更新。</p>
<p><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_12.png" alt="img_12.png"></p>
<p><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_13.png" alt="img_13.png"></p>
<p>歌曲ID如何获得?</p>
<p><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_14.png" alt="img_14.png"></p>
<p><img src="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/img_15.png" alt="img_15.png"></p>
<h3>Docker镜像部署</h3>
<p>可以通过自己自己打包 Docker 进行部署,也可以使用本项目打包好的容器进行部署</p>
<p>自己打包 Docker 进行部署执行以下命令:</p>
<pre><code class="language-bash">docker build -t dockerimage .
</code></pre>
<p>使用本项目打包好的容器进行部署:</p>
<pre><code class="language-bash">docker pull registry.cn-hangzhou.aliyuncs.com/music_downloader/qq_flac_music_downloader
</code></pre>
<p>Docker 镜像部署需要进行端口映射,可以采用以下命令进行端口映射:</p>
<p>(注意:用你的本地使用目录替换下方“本地目录” 如 E:\music)</p>
<pre><code class="language-bash">docker run -p 127.0.0.1:8899:8899 -v 本地目录:/workspace/music -it dockerimage:latest
</code></pre>
<p>更新方式:先运行 <code>docker ps -a </code>查看容器名称</p>
<p>然后</p>
<pre><code>docker stop 容器名称
docker rm 容器名称
</code></pre>
<p>最后,上面<code>docker pull</code>和<code>docker run</code>的代码重新执行一遍</p>
<p>docker-compose部署方式</p>
<p>本地新建txt,重命名为docker-compose.yml (不会修改后缀请百度)</p>
<p>复制以下内容,同样注意替换“本地目录”</p>
<p>或者你直接下载项目中的docker-compose.yml,然后自行修改本地目录</p>
<pre><code>version: "3"
services:
downloader:
image: registry.cn-hangzhou.aliyuncs.com/music_downloader/qq_flac_music_downloader
container_name: music
network_mode: bridge
volumes:
- 本地目录:/workspace/music
ports:
- "127.0.0.1:8899:8899"
restart: always
</code></pre>
<p>然后 打开cmd命令行,cd到docker-compose.yml所在目录 <code>docker-compose up -d</code></p>
<p>需要更新的时候,也是cd到docker-compose.yml所在目录</p>
<pre><code>docker-compose pull
docker-compose up -d
</code></pre>
<p>相对docker,更新比较简单,所以个人比较推荐使用docker-compose的方式</p>
<h3>自定义端口设置</h3>
<p>部分设备会存在 8889 端口被占用的情况,部署时可自定义端口,终端/控制台 进入到本文件所在的目录 执行以下指令:</p>
<pre><code class="language-bash"># []内为可选参数
python3 MainServer.py [--port 8999]
</code></pre>
<p>docker 部署可自行切换映射本地端口,以解决端口被占用情况。</p>
<h1>免责声明</h1>
<p>禁止任何形式的商业用途,包括但不仅限于售卖/打赏/获利,不得使用本代码进行任何形式的牟利/贩卖/传播,再次强调仅供个人私下研究学习技术使用,有条件者请支持正版音乐! 律师函请发给提供这些音乐资源解析服务的网站运营方,本项目仅以纯粹的技术目的去学习研究,如有侵犯到任何人的合法权利,请致信<a href="mailto:qiuchenly@outlook.com">qiuchenly@outlook.com</a>,我将在第一时间删库跑路</p>
<p>本项目基于 GPL V3.0 许可证发行,以下协议是对于 GPL V3.0 的补充,如有冲突,以以下协议为准。</p>
<p>词语约定:本协议中的“本项目”指QQFlacMusicDownloader项目;“使用者”指签署本协议的使用者;“官方音乐平台”指对本项目内置的包括酷我、网易云、QQ音乐、咪咕等音乐源的官方平台统称;“版权数据”指包括但不限于图像、音频、名字等在内的他人拥有所属版权的数据。</p>
<p>本项目的数据来源原理是从各官方音乐平台的公开服务器中拉取数据,经过对数据简单地筛选与合并后进行展示,因此本项目不对数据的准确性负责。 使用本项目的过程中可能会产生版权数据,对于这些版权数据,本项目不拥有它们的所有权,为了避免造成侵权,使用者务必在24小时内清除使用本项目的过程中所产生的版权数据。 本项目内的官方音乐平台别名为本项目内对官方音乐平台的一个称呼,不包含恶意,如果官方音乐平台觉得不妥,可联系本项目更改或移除。 本项目内使用的部分包括但不限于字体、图片等资源来源于互联网,如果出现侵权可联系本项目移除。 由于使用本项目产生的包括由于本协议或由于使用或无法使用本项目而引起的任何性质的任何直接、间接、特殊、偶然或结果性损害(包括但不限于因商誉损失、停工、计算机故障或故障引起的损害赔偿,或任何及所有其他商业损害或损失)由使用者负责。 本项目完全免费,仅供个人私下小范围研究交流学习 python 技术使用, 且开源发布于 GitHub 面向全世界人用作对技术的学习交流,本项目不对项目内的技术可能存在违反当地法律法规的行为作保证,禁止在违反当地法律法规的情况下使用本项目,对于使用者在明知或不知当地法律法规不允许的情况下使用本项目所造成的任何违法违规行为由使用者承担,本项目不承担由此造成的任何直接、间接、特殊、偶然或结果性责任。 若你使用了本项目,将代表你接受以上协议。</p>
<p>音乐平台不易,请尊重版权,支持正版。</p>
<h1>致谢</h1>
<p>感谢所有项目的参与/贡献者,也感谢提出issues的各位用户。</p>
<h1>其他资料</h1>
<p><a href="https://raw.githubusercontent.com/QiuChenlyOpenSource/QQFlacMusicDownloader/main/md/README.md">早期接口 QMD Apk的逆向过程</a></p>
<h1>名词解释</h1>
<ol>
<li>dinner: 低能</li>
<li>我测你m: 一眼顶真 鉴定为纯纯的范剑</li>
</ol>
\ No newline at end of file
diff --git a/jest-snapshot/daily/index.xml b/jest-snapshot/daily/index.xml
index e5065f9854f..337c65a6a48 100644
--- a/jest-snapshot/daily/index.xml
+++ b/jest-snapshot/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Jest Snapshot Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:31Z
+ 2023-10-11T01:32:37Z
Daily Trending of Jest Snapshot in GitHub
\ No newline at end of file
diff --git a/jflex/daily/index.xml b/jflex/daily/index.xml
index 98ef96a87f7..a753aba2882 100644
--- a/jflex/daily/index.xml
+++ b/jflex/daily/index.xml
@@ -1,7 +1,7 @@
GitHub JFlex Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:31Z
+ 2023-10-11T01:32:39Z
Daily Trending of JFlex in GitHub
\ No newline at end of file
diff --git a/jinja/daily/index.xml b/jinja/daily/index.xml
index d0d0c3fedc2..1e45d02478a 100644
--- a/jinja/daily/index.xml
+++ b/jinja/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Jinja Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:30Z
+ 2023-10-11T01:32:40Z
Daily Trending of Jinja in GitHub
\ No newline at end of file
diff --git a/jison-lex/daily/index.xml b/jison-lex/daily/index.xml
index fe9dfadddb2..50ae45e19c3 100644
--- a/jison-lex/daily/index.xml
+++ b/jison-lex/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Jison Lex Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:34Z
+ 2023-10-11T01:32:43Z
Daily Trending of Jison Lex in GitHub
\ No newline at end of file
diff --git a/jison/daily/index.xml b/jison/daily/index.xml
index 77a679a37d4..94df683dfcd 100644
--- a/jison/daily/index.xml
+++ b/jison/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Jison Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:34Z
+ 2023-10-11T01:32:42Z
Daily Trending of Jison in GitHub
\ No newline at end of file
diff --git a/jolie/daily/index.xml b/jolie/daily/index.xml
index 2553d49d092..c6871d37bf4 100644
--- a/jolie/daily/index.xml
+++ b/jolie/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Jolie Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:33Z
+ 2023-10-11T01:32:43Z
Daily Trending of Jolie in GitHub
\ No newline at end of file
diff --git a/jq/daily/index.xml b/jq/daily/index.xml
index 76e1c637f96..b9a8f026270 100644
--- a/jq/daily/index.xml
+++ b/jq/daily/index.xml
@@ -1,7 +1,7 @@
GitHub jq Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:35Z
+ 2023-10-11T01:32:44Z
Daily Trending of jq in GitHub
\ No newline at end of file
diff --git a/json-with-comments/daily/index.xml b/json-with-comments/daily/index.xml
index b6fc25e1ae2..c243c795035 100644
--- a/json-with-comments/daily/index.xml
+++ b/json-with-comments/daily/index.xml
@@ -1,7 +1,7 @@
GitHub JSON with Comments Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:39Z
+ 2023-10-11T01:32:49Z
Daily Trending of JSON with Comments in GitHub
\ No newline at end of file
diff --git a/json/daily/index.xml b/json/daily/index.xml
index 9c9a7fd6f33..9fd02466daa 100644
--- a/json/daily/index.xml
+++ b/json/daily/index.xml
@@ -1,7 +1,7 @@
GitHub JSON Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:37Z
+ 2023-10-11T01:32:47Z
Daily Trending of JSON in GitHub
\ No newline at end of file
diff --git a/json5/daily/index.xml b/json5/daily/index.xml
index 6deaacad478..5c045ec3e1f 100644
--- a/json5/daily/index.xml
+++ b/json5/daily/index.xml
@@ -1,7 +1,7 @@
GitHub JSON5 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:36Z
+ 2023-10-11T01:32:46Z
Daily Trending of JSON5 in GitHub
\ No newline at end of file
diff --git a/jsoniq/daily/index.xml b/jsoniq/daily/index.xml
index deefbd6f64c..47165dba671 100644
--- a/jsoniq/daily/index.xml
+++ b/jsoniq/daily/index.xml
@@ -1,7 +1,7 @@
GitHub JSONiq Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:38Z
+ 2023-10-11T01:32:48Z
Daily Trending of JSONiq in GitHub
\ No newline at end of file
diff --git a/jsonld/daily/index.xml b/jsonld/daily/index.xml
index 9fb1909a81a..0b5d1205b54 100644
--- a/jsonld/daily/index.xml
+++ b/jsonld/daily/index.xml
@@ -1,7 +1,7 @@
GitHub JSONLD Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:41Z
+ 2023-10-11T01:32:52Z
Daily Trending of JSONLD in GitHub
\ No newline at end of file
diff --git a/jsonnet/daily/index.xml b/jsonnet/daily/index.xml
index 98d87474879..1b13436da74 100644
--- a/jsonnet/daily/index.xml
+++ b/jsonnet/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Jsonnet Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:41Z
+ 2023-10-11T01:32:51Z
Daily Trending of Jsonnet in GitHub
\ No newline at end of file
diff --git a/julia/daily/index.xml b/julia/daily/index.xml
index 7d0f7970041..14f411d8188 100644
--- a/julia/daily/index.xml
+++ b/julia/daily/index.xml
@@ -1,21 +1,7 @@
GitHub Julia Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:44Z
+ 2023-10-11T01:32:58Z
Daily Trending of Julia in GitHub
-
- SciML/StructuralIdentifiability.jl
- 2023-10-10T01:32:44Z
- tag:github.com,2023-10-10:/SciML/StructuralIdentifiability.jl
-
- <p>Fast and automatic structural identifiability software for ODE systems</p><hr>
-
-
- m-dadej/MarSwitching.jl
- 2023-10-10T01:32:44Z
- tag:github.com,2023-10-10:/m-dadej/MarSwitching.jl
-
- <p>MarSwitching.jl: Julia package for Markov Switching dynamic models</p><hr>
-
\ No newline at end of file
diff --git a/jupyter-notebook/daily/index.xml b/jupyter-notebook/daily/index.xml
index 86a636619f3..79af2179320 100644
--- a/jupyter-notebook/daily/index.xml
+++ b/jupyter-notebook/daily/index.xml
@@ -1,7 +1,21 @@
GitHub Jupyter Notebook Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:32:47Z
+ 2023-10-11T01:32:58Z
Daily Trending of Jupyter Notebook in GitHub
+
+ mit-han-lab/torchquantum
+ 2023-10-11T01:32:58Z
+ tag:github.com,2023-10-11:/mit-han-lab/torchquantum
+
+ <p>A PyTorch-based framework for Quantum Simulation, Quantum Machine Learning, Quantum Neural Networks, Parameterized Quantum Circuits with support for easy deployments on real quantum computers.</p><hr><p align="center"> <img src="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/torchquantum_logo.jpg" alt="torchquantum Logo" width="450"> </p>
<h2><p align="center">A PyTorch Library for Quantum Simulation and Quantum Machine Learning</p></h2>
<h3><p align="center">Faster, Scalable, Easy Debugging, Easy Deployment on Real Machine</p></h3>
<p align="center"> <a href="https://github.com/mit-han-lab/torchquantum/raw/master/LICENSE"> <img alt="MIT License" src="https://img.shields.io/github/license/mit-han-lab/torchquantum"> </a> <a href="https://torchquantum.readthedocs.io/"> <img alt="Documentation" src="https://img.shields.io/readthedocs/torchquantum/main"> </a> <a href="https://join.slack.com/t/torchquantum/shared_invite/zt-1ghuf283a-OtP4mCPJREd~367VX~TaQQ"> <img alt="Chat @ Slack" src="https://img.shields.io/badge/slack-chat-2eb67d.svg?logo=slack"> </a> <a href="https://discord.gg/VTHZAB5E"> <img alt="Chat @ Discord" src="https://img.shields.io/badge/contact-me-blue?logo=discord&logoColor=white"> </a> <a href="https://qmlsys.hanruiwang.me"> <img alt="Forum" src="https://img.shields.io/discourse/status?server=https%3A%2F%2Fqmlsys.hanruiwang.me%2F"> </a> <a href="https://qmlsys.mit.edu"> <img alt="Website" src="https://img.shields.io/website?up_message=qmlsys&url=https%3A%2F%2Fqmlsys.mit.edu"> </a> <a href="https://pypi.org/project/torchquantum/"> <img alt="Pypi" src="https://img.shields.io/pypi/v/torchquantum"> </a> <a href="https://unitary.fund/"> <img alt="Pypi" src="https://img.shields.io/badge/supported%20by-Unitary%20Fund-green"> </a> <a href="https://pytorch.org/ecosystem/"> <img alt="Pypi" src="https://img.shields.io/badge/integration%20-PyTorch%20Ecosystem-blue"> </a> <a href="https://qiskit.org/ecosystem/"> <img alt="Pypi" src="https://img.shields.io/badge/integration%20-Qiskit%20Ecosystem-blue"> </a> </p>
<br>
<h1>👋 Welcome</h1>
<h4>What it is doing</h4>
<p>Quantum simulation framework based on PyTorch. It supports statevector simulation and pulse simulation (coming soon) on GPUs. It can scale up to the simulation of 30+ qubits with multiple GPUs.</p>
<h4>Who will benefit</h4>
<p>Researchers on quantum algorithm design, parameterized quantum circuit training, quantum optimal control, quantum machine learning, quantum neural networks.</p>
<h4>Differences from Qiskit/Pennylane</h4>
<p>Dynamic computation graph, automatic gradient computation, fast GPU support, batch model tersorized processing.</p>
<h2>News</h2>
<ul>
<li>v0.1.7 Available!</li>
<li>Join our <a href="https://join.slack.com/t/torchquantum/shared_invite/zt-1ghuf283a-OtP4mCPJREd~367VX~TaQQ">Slack</a> for real time support!</li>
<li>Welcome to contribute! Please contact us or post in the <a href="https://qmlsys.hanruiwang.me">forum</a> if you want to have new examples implemented by TorchQuantum or any other questions.</li>
<li>Qmlsys website goes online: <a href="https://qmlsys.mit.edu">qmlsys.mit.edu</a> and <a href="https://torchquantum.org">torchquantum.org</a></li>
</ul>
<h2>Features</h2>
<ul>
<li>Easy construction and simulation of quantum circuits in <strong>PyTorch</strong></li>
<li><strong>Dynamic computation graph</strong> for easy debugging</li>
<li><strong>Gradient support</strong> via autograd</li>
<li><strong>Batch mode</strong> inference and training on <strong>CPU/GPU</strong></li>
<li>Easy <strong>deployment on real quantum devices</strong> such as IBMQ</li>
<li><strong>Easy hybrid classical-quantum</strong> model construction</li>
<li>(coming soon) <strong>pulse-level simulation</strong></li>
</ul>
<h2>Installation</h2>
<pre><code class="language-bash">git clone https://github.com/mit-han-lab/torchquantum.git
cd torchquantum
pip install --editable .
</code></pre>
<h2>Basic Usage</h2>
<pre><code class="language-python">import torchquantum as tq
import torchquantum.functional as tqf
qdev = tq.QuantumDevice(n_wires=2, bsz=5, device="cpu", record_op=True) # use device='cuda' for GPU
# use qdev.op
qdev.h(wires=0)
qdev.cnot(wires=[0, 1])
# use tqf
tqf.h(qdev, wires=1)
tqf.x(qdev, wires=1)
# use tq.Operator
op = tq.RX(has_params=True, trainable=True, init_params=0.5)
op(qdev, wires=0)
# print the current state (dynamic computation graph supported)
print(qdev)
# obtain the qasm string
from torchquantum.plugin import op_history2qasm
print(op_history2qasm(qdev.n_wires, qdev.op_history))
# measure the state on z basis
print(tq.measure(qdev, n_shots=1024))
# obtain the expval on a observable by stochastic sampling (doable on simulator and real quantum hardware)
from torchquantum.measurement import expval_joint_sampling
expval_sampling = expval_joint_sampling(qdev, 'ZX', n_shots=1024)
print(expval_sampling)
# obtain the expval on a observable by analytical computation (only doable on classical simulator)
from torchquantum.measurement import expval_joint_analytical
expval = expval_joint_analytical(qdev, 'ZX')
print(expval)
# obtain gradients of expval w.r.t. trainable parameters
expval[0].backward()
print(op.params.grad)
# Apply gates to qdev with tq.QuantumModule
ops = [
{'name': 'hadamard', 'wires': 0},
{'name': 'cnot', 'wires': [0, 1]},
{'name': 'rx', 'wires': 0, 'params': 0.5, 'trainable': True},
{'name': 'u3', 'wires': 0, 'params': [0.1, 0.2, 0.3], 'trainable': True},
{'name': 'h', 'wires': 1, 'inverse': True}
]
qmodule = tq.QuantumModule.from_op_history(ops)
qmodule(qdev)
</code></pre>
<!--
## Basic Usage 2
```python
import torchquantum as tq
import torchquantum.functional as tqf
x = tq.QuantumDevice(n_wires=2)
tqf.hadamard(x, wires=0)
tqf.x(x, wires=1)
tqf.cnot(x, wires=[0, 1])
# print the current state (dynamic computation graph supported)
print(x.states)
# obtain the classical bitstring distribution
print(tq.measure(x, n_shots=2048))
```
-->
<h2>Guide to the examples</h2>
<p>We also prepare many example and tutorials using TorchQuantum.</p>
<p>For <strong>beginning level</strong>, you may check <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/mnist">QNN for MNIST</a>, <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/quanvolution">Quantum Convolution (Quanvolution)</a> and <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/quantum_kernel_method">Quantum Kernel Method</a>, and <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/regression">Quantum Regression</a>.</p>
<p>For <strong>intermediate level</strong>, you may check <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/amplitude_encoding_mnist">Amplitude Encoding for MNIST</a>, <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/clifford_qnn">Clifford gate QNN</a>, <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/save_load_example">Save and Load QNN models</a>, <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/PauliSumOp">PauliSum Operation</a>, <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/converter_tq_qiskit">How to convert tq to Qiskit</a>.</p>
<p>For <strong>expert</strong>, you may check <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/param_shift_onchip_training">Parameter Shift on-chip Training</a>, <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/gradient_pruning">VQA Gradient Pruning</a>, <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/vqe">VQE</a>, <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/train_state_prep">VQA for State Prepration</a>, <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/qaoa">QAOA (Quantum Approximate Optimization Algorithm)</a>.</p>
<h2>Usage</h2>
<p>Construct parameterized quantum circuit models as simple as constructing a normal pytorch model.</p>
<pre><code class="language-python">import torch.nn as nn
import torch.nn.functional as F
import torchquantum as tq
import torchquantum.functional as tqf
class QFCModel(nn.Module):
def __init__(self):
super().__init__()
self.n_wires = 4
self.measure = tq.MeasureAll(tq.PauliZ)
self.encoder_gates = [tqf.rx] * 4 + [tqf.ry] * 4 + \
[tqf.rz] * 4 + [tqf.rx] * 4
self.rx0 = tq.RX(has_params=True, trainable=True)
self.ry0 = tq.RY(has_params=True, trainable=True)
self.rz0 = tq.RZ(has_params=True, trainable=True)
self.crx0 = tq.CRX(has_params=True, trainable=True)
def forward(self, x):
bsz = x.shape[0]
# down-sample the image
x = F.avg_pool2d(x, 6).view(bsz, 16)
# create a quantum device to run the gates
qdev = tq.QuantumDevice(n_wires=self.n_wires, bsz=bsz, device=x.device)
# encode the classical image to quantum domain
for k, gate in enumerate(self.encoder_gates):
gate(qdev, wires=k % self.n_wires, params=x[:, k])
# add some trainable gates (need to instantiate ahead of time)
self.rx0(qdev, wires=0)
self.ry0(qdev, wires=1)
self.rz0(qdev, wires=3)
self.crx0(qdev, wires=[0, 2])
# add some more non-parameterized gates (add on-the-fly)
qdev.h(wires=3)
qdev.sx(wires=2)
qdev.cnot(wires=[3, 0])
qdev.qubitunitary(wires=[1, 2], params=[[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 0, 1j],
[0, 0, -1j, 0]])
# perform measurement to get expectations (back to classical domain)
x = self.measure(qdev).reshape(bsz, 2, 2)
# classification
x = x.sum(-1).squeeze()
x = F.log_softmax(x, dim=1)
return x
</code></pre>
<h2>VQE Example</h2>
<p>Train a quantum circuit to perform VQE task. Quito quantum computer as in <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/simple_vqe/simple_vqe.py">simple_vqe.py</a> script:</p>
<pre><code class="language-python">cd examples/vqe
python vqe.py
</code></pre>
<h2>MNIST Example</h2>
<p>Train a quantum circuit to perform MNIST classification task and deploy on the real IBM Quito quantum computer as in <a href="https://raw.githubusercontent.com/mit-han-lab/torchquantum/main/examples/simple_mnist/mnist_example_no_binding.py">mnist_example.py</a> script:</p>
<pre><code class="language-python">cd examples/mnist
python mnist.py
</code></pre>
<h2>Files</h2>
<table>
<thead>
<tr>
<th>File</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>devices.py</td>
<td>QuantumDevice class which stores the statevector</td>
</tr>
<tr>
<td>encoding.py</td>
<td>Encoding layers to encode classical values to quantum domain</td>
</tr>
<tr>
<td>functional.py</td>
<td>Quantum gate functions</td>
</tr>
<tr>
<td>operators.py</td>
<td>Quantum gate classes</td>
</tr>
<tr>
<td>layers.py</td>
<td>Layer templates such as RandomLayer</td>
</tr>
<tr>
<td>measure.py</td>
<td>Measurement of quantum states to get classical values</td>
</tr>
<tr>
<td>graph.py</td>
<td>Quantum gate graph used in static mode</td>
</tr>
<tr>
<td>super_layer.py</td>
<td>Layer templates for SuperCircuits</td>
</tr>
<tr>
<td>plugins/qiskit*</td>
<td>Convertors and processors for easy deployment on IBMQ</td>
</tr>
<tr>
<td>examples/</td>
<td>More examples for training QML and VQE models</td>
</tr>
</tbody>
</table>
<h2>Coding Style</h2>
<p>torchquantum uses pre-commit hooks to ensure Python style consistency and prevent common mistakes in its codebase.</p>
<p>To enable it pre-commit hooks please reproduce:</p>
<pre><code class="language-bash">pip install pre-commit
pre-commit install
</code></pre>
<h2>Papers using TorchQuantum</h2>
<ul>
<li>[HPCA'22] <a href="https://arxiv.org/abs/2107.10845">Wang et al., "QuantumNAS: Noise-Adaptive Search for Robust Quantum Circuits"</a></li>
<li>[DAC'22] <a href="https://arxiv.org/abs/2110.11331">Wang et al., "QuantumNAT: Quantum Noise-Aware Training with Noise Injection, Quantization and Normalization"</a></li>
<li>[DAC'22] <a href="https://arxiv.org/abs/2202.13239">Wang et al., "QOC: Quantum On-Chip Training with Parameter Shift and Gradient Pruning"</a></li>
<li>[QCE'22] <a href="https://arxiv.org/abs/2203.17267">Liang et al., "Variational Quantum Pulse Learning"</a></li>
<li>[ICCAD'22] <a href="https://arxiv.org/abs/2207.01578">Hu et al., "Quantum Neural Network Compression"</a></li>
<li>[ICCAD'22] <a href="https://arxiv.org/abs/2210.16724">Wang et al., "QuEst: Graph Transformer for Quantum Circuit Reliability Estimation"</a></li>
<li>[ICML Workshop] <a href="https://dynn-icml2022.github.io/spapers/paper_7.pdf">Yun et al., "Slimmable Quantum Federated Learning"</a></li>
<li>[IEEE ICDCS] <a href="https://ieeexplore.ieee.org/document/9912289">Yun et al., "Quantum Multi-Agent Reinforcement Learning via Variational Quantum Circuit Design"</a></li>
</ul>
<details>
<summary>Manuscripts</summary>
<h2>Manuscripts</h2>
<ul>
<li><a href="https://arxiv.org/abs/2210.16731">Yun et al., "Projection Valued Measure-based Quantum Machine Learning for Multi-Class Classification"</a></li>
<li><a href="https://arxiv.org/abs/2210.09728">Baek et al., "3D Scalable Quantum Convolutional Neural Networks for Point Cloud Data Processing in Classification Applications"</a></li>
<li><a href="https://arxiv.org/abs/2209.12372">Baek et al., "Scalable Quantum Convolutional Neural Networks"</a></li>
<li><a href="https://arxiv.org/abs/2208.11510">Yun et al., "Quantum Multi-Agent Meta Reinforcement Learning"</a></li>
</ul>
</details>
<h2>Dependencies</h2>
<ul>
<li>3.9 >= Python >= 3.7 (Python 3.10 may have the <code>concurrent</code> package issue for Qiskit)</li>
<li>PyTorch >= 1.8.0</li>
<li>configargparse >= 0.14</li>
<li>GPU model training requires NVIDIA GPUs</li>
</ul>
<h2>Contact</h2>
<p>TorchQuantum <a href="https://qmlsys.hanruiwang.me">Forum</a></p>
<p>Hanrui Wang <a href="mailto:hanrui@mit.edu">hanrui@mit.edu</a></p>
<h2>Contributors</h2>
<p>Jiannan Cao, Jessica Ding, Jiai Gu, Song Han, Zhirui Hu, Zirui Li, Zhiding Liang, Pengyu Liu, Yilian Liu, Mohammadreza Tavasoli, Hanrui Wang, Zhepeng Wang, Zhuoyang Ye</p>
<h2>Citation</h2>
<pre><code>@inproceedings{hanruiwang2022quantumnas,
title = {Quantumnas: Noise-adaptive search for robust quantum circuits},
author = {Wang, Hanrui and Ding, Yongshan and Gu, Jiaqi and Li, Zirui and Lin, Yujun and Pan, David Z and Chong, Frederic T and Han, Song},
booktitle = {The 28th IEEE International Symposium on High-Performance Computer Architecture (HPCA-28)},
year = {2022}
}
</code></pre>
+
+
+ manan-shxrma/Robosocnith_database
+ 2023-10-11T01:32:58Z
+ tag:github.com,2023-10-11:/manan-shxrma/Robosocnith_database
+
+ <p>This repo is used as a database for upcoming projects and a central repository</p><hr><p><a name="readme-top"></a> <a href="https://github.com/manan-shxrma/Robosocnith_database/graphs/contributors"><img src="https://img.shields.io/github/contributors/manan-shxrma/Robosocnith_database.svg?style=for-the-badge" alt="Contributors"></a> <a href="https://github.com/manan-shxrma/Robosocnith_database/network/members"><img src="https://img.shields.io/github/forks/manan-shxrma/Robosocnith_database.svg?style=for-the-badge" alt="Forks"></a> <a href="https://github.com/manan-shxrma/Robosocnith_database/stargazers"><img src="https://img.shields.io/github/stars/manan-shxrma/Robosocnith_database.svg?style=for-the-badge" alt="Stargazers"></a> <a href="https://github.com/manan-shxrma/Robosocnith_database/issues"><img src="https://img.shields.io/github/issues/manan-shxrma/Robosocnith_database.svg?style=for-the-badge" alt="Issues"></a> <a href="https://github.com/manan-shxrma/Robosocnith_database/raw/master/LICENSE.txt"><img src="https://img.shields.io/github/license/manan-shxrma/Robosocnith_database.svg?style=for-the-badge" alt="MIT License"></a> <a href="https://linkedin.com/in/manan-shxrma"><img src="https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555" alt="LinkedIn"></a></p>
<h3 align="center">Robosocnith_database</h3>
<p align="center"> This is dedicated repository for maintaining souce code of Robotics Society, NITH. The maintainers are not responsible for any plagiarism inadvertently crept into this repository. <br> <a href="https://github.com/manan-shxrma/Robosocnith_database"><strong>Explore the docs »</strong></a> <br> <br> <a href="https://github.com/manan-shxrma/Robosocnith_database">View Demo</a> · <a href="https://github.com/manan-shxrma/Robosocnith_database/issues">Report Bug</a> · <a href="https://github.com/manan-shxrma/Robosocnith_database/issues">Request Feature</a> </p>
<!-- TABLE OF CONTENTS -->
<details>
<summary>Table of Contents</summary>
<ol>
<li><a href="https://raw.githubusercontent.com/manan-shxrma/Robosocnith_database/main/#built-with">Built With</a></li>
<li> <a href="https://raw.githubusercontent.com/manan-shxrma/Robosocnith_database/main/#getting-started">Getting Started</a>
<ul>
<li><a href="https://raw.githubusercontent.com/manan-shxrma/Robosocnith_database/main/#prerequisites">Prerequisites</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/manan-shxrma/Robosocnith_database/main/#usage">Usage</a></li>
<li><a href="https://raw.githubusercontent.com/manan-shxrma/Robosocnith_database/main/#roadmap">Roadmap</a></li>
<li><a href="https://raw.githubusercontent.com/manan-shxrma/Robosocnith_database/main/#contributing">Contributing</a></li>
<li><a href="https://raw.githubusercontent.com/manan-shxrma/Robosocnith_database/main/#license">License</a></li>
</ol>
</details>
<h3>Built With</h3>
<ul>
<li><a href="https://isocpp.org/"><img src="https://img.shields.io/badge/Cpp-20232A?style=for-the-badge&logo=Cpp&logoColor=61DAFB" alt="C++"></a></li>
<li><a href="https://python.org/"><img src="https://img.shields.io/badge/Python-35495E?style=for-the-badge&logo=Python&logoColor=4FC08D" alt="Python"></a></li>
<li><a href="https://www.cprogramming.com/"><img src="https://img.shields.io/badge/C-000000?style=for-the-badge&logo=C&logoColor=white" alt="C"></a></li>
</ul>
<p align="right">(<a href="https://raw.githubusercontent.com/manan-shxrma/Robosocnith_database/main/#readme-top">back to top</a>)</p>
<!-- GETTING STARTED -->
<h2>Getting Started</h2>
<p>To run any of the Code/Program follow this steps to run it locally on your machine. To get a local copy up and running follow these simple example steps.</p>
<h3>Prerequisites</h3>
<p>Based on your choice of program choose your desired compiler to be installed on your machine</p>
<ul>
<li>Arduino</li>
<li>C++</li>
<li>C</li>
</ul>
<h2>Usage</h2>
<p>Use this Repository to learn and prepare for your internships and campus placements. This repository will contain most of the Repository which will be helpful to students.</p>
<p><em>For more examples, please refer to the <a href="https://github.com/manan-shxrma/Robosocnith_database">Documentation</a></em></p>
<p align="right">(<a href="https://raw.githubusercontent.com/manan-shxrma/Robosocnith_database/main/#readme-top">back to top</a>)</p>
<p>See the <a href="https://github.com/manan-shxrma/Robosocnith_database/issues">open issues</a> for a full list of proposed features (and known issues).</p>
<p align="right">(<a href="https://raw.githubusercontent.com/manan-shxrma/Robosocnith_database/main/#readme-top">back to top</a>)</p>
<!-- CONTRIBUTING -->
<h2>Contributing</h2>
<p>Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are <strong>greatly appreciated</strong>.</p>
<p>If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!</p>
<ol>
<li>Fork the Project</li>
<li>Create your Feature Branch (<code>git checkout -b feature/AmazingFeature</code>)</li>
<li>Commit your Changes (<code>git commit -m 'Add some AmazingFeature'</code>)</li>
<li>Push to the Branch (<code>git push origin feature/AmazingFeature</code>)</li>
<li>Open a Pull Request</li>
</ol>
<p align="right">(<a href="https://raw.githubusercontent.com/manan-shxrma/Robosocnith_database/main/#readme-top">back to top</a>)</p>
<h2>License</h2>
<p>Distributed under the MIT License. See <code>LICENSE</code> for more information.</p>
<p align="right">(<a href="https://raw.githubusercontent.com/manan-shxrma/Robosocnith_database/main/#readme-top">back to top</a>)</p>
+
\ No newline at end of file
diff --git a/kaitai-struct/daily/index.xml b/kaitai-struct/daily/index.xml
index b0e04f49f88..a9a460e0161 100644
--- a/kaitai-struct/daily/index.xml
+++ b/kaitai-struct/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Kaitai Struct Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:07Z
+ 2023-10-11T01:33:14Z
Daily Trending of Kaitai Struct in GitHub
\ No newline at end of file
diff --git a/kakounescript/daily/index.xml b/kakounescript/daily/index.xml
index a46a0bf5eed..9ecd9927491 100644
--- a/kakounescript/daily/index.xml
+++ b/kakounescript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub KakouneScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:08Z
+ 2023-10-11T01:33:13Z
Daily Trending of KakouneScript in GitHub
\ No newline at end of file
diff --git a/kicad-layout/daily/index.xml b/kicad-layout/daily/index.xml
index 729fb936e9e..f516b3f84f9 100644
--- a/kicad-layout/daily/index.xml
+++ b/kicad-layout/daily/index.xml
@@ -1,7 +1,7 @@
GitHub KiCad Layout Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:14Z
+ 2023-10-11T01:33:19Z
Daily Trending of KiCad Layout in GitHub
\ No newline at end of file
diff --git a/kicad-legacy-layout/daily/index.xml b/kicad-legacy-layout/daily/index.xml
index fa1a51bd84d..7d9b8c77160 100644
--- a/kicad-legacy-layout/daily/index.xml
+++ b/kicad-legacy-layout/daily/index.xml
@@ -1,7 +1,7 @@
GitHub KiCad Legacy Layout Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:11Z
+ 2023-10-11T01:33:17Z
Daily Trending of KiCad Legacy Layout in GitHub
\ No newline at end of file
diff --git a/kicad-schematic/daily/index.xml b/kicad-schematic/daily/index.xml
index f105c988d9b..fd5fa5a17b1 100644
--- a/kicad-schematic/daily/index.xml
+++ b/kicad-schematic/daily/index.xml
@@ -1,7 +1,7 @@
GitHub KiCad Schematic Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:13Z
+ 2023-10-11T01:33:17Z
Daily Trending of KiCad Schematic in GitHub
\ No newline at end of file
diff --git a/kit/daily/index.xml b/kit/daily/index.xml
index fd22141a266..15de18d2de1 100644
--- a/kit/daily/index.xml
+++ b/kit/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Kit Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:17Z
+ 2023-10-11T01:33:20Z
Daily Trending of Kit in GitHub
\ No newline at end of file
diff --git a/kotlin/daily/index.xml b/kotlin/daily/index.xml
index 7a3acbdd254..63cf0889034 100644
--- a/kotlin/daily/index.xml
+++ b/kotlin/daily/index.xml
@@ -1,7 +1,21 @@
GitHub Kotlin Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:21Z
+ 2023-10-11T01:33:26Z
Daily Trending of Kotlin in GitHub
+
+ devexpert-io/desafio-oct-2023
+ 2023-10-11T01:33:26Z
+ tag:github.com,2023-10-11:/devexpert-io/desafio-oct-2023
+
+ <p>https://devexpert.io/desafio-ac</p><hr>
+
+
+ mustfaibra/QPayMultiplatform
+ 2023-10-11T01:33:26Z
+ tag:github.com,2023-10-11:/mustfaibra/QPayMultiplatform
+
+ <p>QPay is a fintech app built entirely with Compose Multiplatform and considered a use case for unifying & providing financial services on both Android and iOS platforms while leveraging the power of Native APIs.</p><hr><h1>Quick Pay</h1>
<p>Quick Pay - QPay for short - is a simple use case for a Fintech app for Onboarding new customers and providing Services, built entirely with Compose Multiplatform. This cross-platform project is considered a use case for unifying & providing financial services on both Android and iOS platforms while leveraging the power of Native.</p>
<h2>Targeted Platforms For Now</h2>
<ul>
<li>Android Platform</li>
<li>iOS Platform</li>
</ul>
<h2>Screenshots</h2>
<img src="https://github.com/mustfaibra/QPayMultiplatform/raw/master/screenshots/onboarding.png" width="200px">
<img src="https://github.com/mustfaibra/QPayMultiplatform/raw/master/screenshots/signinoptions.png" width="200px">
<img src="https://github.com/mustfaibra/QPayMultiplatform/raw/master/screenshots/allowidcapture.png" width="200px">
<img src="https://github.com/mustfaibra/QPayMultiplatform/raw/master/screenshots/confirmphoto.png" width="200px">
<img src="https://github.com/mustfaibra/QPayMultiplatform/raw/master/screenshots/home.png" width="200">
<h2>Tech & Libs Used Until Now</h2>
<p>The project used the following:</p>
<ul>
<li>Kotlin Programming Language</li>
<li><a href="https://github.com/JetBrains/compose-multiplatform">Compose Mutliplatform</a> Framework</li>
<li><a href="https://arkivanov.github.io/Decompose/">Decompose</a> for State's Management, thanks <a href="https://github.com/arkivanov">Arkadii</a></li>
<li><a href="https://github.com/icerockdev/moko-resources">Moko Resources</a> for sharing resources & handling painters on both platforms.</li>
<li><a href="https://insert-koin.io">Koin</a> for handling dependency Injection on Mutliplatform.</li>
<li><a href="https://github.com/Kotlin/kotlinx-datetime">Kotlinx Datetime</a> for Mutliplatform</li>
<li><a href="https://github.com/mori-atsushi/insetsx">InsetX</a> for handling windows insets - status bar and navigation bar - on both platforms.</li>
</ul>
<h2>Resources & Projects Until Now</h2>
<p>Here are some projects that I found helpful when building this project:</p>
<ul>
<li>Moko Sharing resources <a href="https://github.com/philipplackner/KMM-SharingResources/tree/master">Demo</a> by the great Phillip Lackner.</li>
<li><a href="https://github.com/SEAbdulbasit/MusicApp-KMP/tree/master">Music App</a> by Abdulbasit, thank you so much!</li>
</ul>
<h2>UI Credits</h2>
<p>The great app UI design is from <a href="https://www.behance.net/gallery/174390161/QPay">QPay</a> on Behance, by the talented Designer <a href="https://www.behance.net/alaaabdalrhman">Alaa</a>.</p>
<h2>What's Next?</h2>
<p>The remaining screens appears on the app UI design on the shared Behance link on the credit section is built and ready, only waiting for some clean up.</p>
<p>The following features is coming, feel free to contribute!</p>
<ul>
<li>Camera For Capturing ID and Identity Verification : Currently the app is asking for Camera permission successfully on both platforms, but the camera feature itself is not implemented yet.</li>
<li>Login Screen for exited users.</li>
<li>QR Code Scanner to support Scan To Send Money for both Android & iOS.</li>
</ul>
<h2>Final words!</h2>
<p>I really hope you find this repository helpful, if so, don't forget to give a star ⭐️!</p>
<p>You can also follow me on</p>
<ul>
<li><a href="https://www.linkedin.com/in/mustfaibra/">LinkedIn</a></li>
<li><a href="https://twitter.com/mustfaibra">Twitter</a></li>
</ul>
+
\ No newline at end of file
diff --git a/krl/daily/index.xml b/krl/daily/index.xml
index 9b40319a036..031ee73d6ad 100644
--- a/krl/daily/index.xml
+++ b/krl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub KRL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:15Z
+ 2023-10-11T01:33:22Z
Daily Trending of KRL in GitHub
\ No newline at end of file
diff --git a/kusto/daily/index.xml b/kusto/daily/index.xml
index c8639d5eac0..665bb6769c8 100644
--- a/kusto/daily/index.xml
+++ b/kusto/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Kusto Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:16Z
+ 2023-10-11T01:33:21Z
Daily Trending of Kusto in GitHub
\ No newline at end of file
diff --git a/kvlang/daily/index.xml b/kvlang/daily/index.xml
index ebfbeb75148..34000670551 100644
--- a/kvlang/daily/index.xml
+++ b/kvlang/daily/index.xml
@@ -1,7 +1,7 @@
GitHub kvlang Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:28Z
+ 2023-10-11T01:33:34Z
Daily Trending of kvlang in GitHub
\ No newline at end of file
diff --git a/labview/daily/index.xml b/labview/daily/index.xml
index d4255e8b56d..3f1f34cac0a 100644
--- a/labview/daily/index.xml
+++ b/labview/daily/index.xml
@@ -1,7 +1,7 @@
GitHub LabVIEW Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:30Z
+ 2023-10-11T01:33:36Z
Daily Trending of LabVIEW in GitHub
\ No newline at end of file
diff --git a/lark/daily/index.xml b/lark/daily/index.xml
index 493402971ae..2a2cc97c9d9 100644
--- a/lark/daily/index.xml
+++ b/lark/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Lark Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:30Z
+ 2023-10-11T01:33:35Z
Daily Trending of Lark in GitHub
\ No newline at end of file
diff --git a/lasso/daily/index.xml b/lasso/daily/index.xml
index d6dc2c6745a..ef289f682e5 100644
--- a/lasso/daily/index.xml
+++ b/lasso/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Lasso Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:29Z
+ 2023-10-11T01:33:36Z
Daily Trending of Lasso in GitHub
\ No newline at end of file
diff --git a/latte/daily/index.xml b/latte/daily/index.xml
index d760229a419..76a2137f97f 100644
--- a/latte/daily/index.xml
+++ b/latte/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Latte Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:32Z
+ 2023-10-11T01:33:38Z
Daily Trending of Latte in GitHub
\ No newline at end of file
diff --git a/lean/daily/index.xml b/lean/daily/index.xml
index 904d3822482..57a3bc336d7 100644
--- a/lean/daily/index.xml
+++ b/lean/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Lean Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:33Z
+ 2023-10-11T01:33:40Z
Daily Trending of Lean in GitHub
\ No newline at end of file
diff --git a/less/daily/index.xml b/less/daily/index.xml
index 8d378b8a8c1..94cf256f92e 100644
--- a/less/daily/index.xml
+++ b/less/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Less Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:35Z
+ 2023-10-11T01:33:41Z
Daily Trending of Less in GitHub
\ No newline at end of file
diff --git a/lex/daily/index.xml b/lex/daily/index.xml
index 6c08938563a..6915087e177 100644
--- a/lex/daily/index.xml
+++ b/lex/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Lex Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:34Z
+ 2023-10-11T01:33:38Z
Daily Trending of Lex in GitHub
\ No newline at end of file
diff --git a/lfe/daily/index.xml b/lfe/daily/index.xml
index faaebe6a444..759ce102cf7 100644
--- a/lfe/daily/index.xml
+++ b/lfe/daily/index.xml
@@ -1,7 +1,7 @@
GitHub LFE Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:38Z
+ 2023-10-11T01:33:42Z
Daily Trending of LFE in GitHub
\ No newline at end of file
diff --git a/ligolang/daily/index.xml b/ligolang/daily/index.xml
index 434397f00cf..dcae5cc21b2 100644
--- a/ligolang/daily/index.xml
+++ b/ligolang/daily/index.xml
@@ -1,7 +1,7 @@
GitHub LigoLANG Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:39Z
+ 2023-10-11T01:33:44Z
Daily Trending of LigoLANG in GitHub
\ No newline at end of file
diff --git a/lilypond/daily/index.xml b/lilypond/daily/index.xml
index 053017cabc8..9ccd4405a82 100644
--- a/lilypond/daily/index.xml
+++ b/lilypond/daily/index.xml
@@ -1,7 +1,7 @@
GitHub LilyPond Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:39Z
+ 2023-10-11T01:33:44Z
Daily Trending of LilyPond in GitHub
\ No newline at end of file
diff --git a/limbo/daily/index.xml b/limbo/daily/index.xml
index ea19f283bf0..9eb9ac693ac 100644
--- a/limbo/daily/index.xml
+++ b/limbo/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Limbo Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:37Z
+ 2023-10-11T01:33:43Z
Daily Trending of Limbo in GitHub
\ No newline at end of file
diff --git a/linker-script/daily/index.xml b/linker-script/daily/index.xml
index 4a527f06ae0..fed9fb5080e 100644
--- a/linker-script/daily/index.xml
+++ b/linker-script/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Linker Script Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:42Z
+ 2023-10-11T01:33:47Z
Daily Trending of Linker Script in GitHub
\ No newline at end of file
diff --git a/linux-kernel-module/daily/index.xml b/linux-kernel-module/daily/index.xml
index db8d7d031ee..a6429cab081 100644
--- a/linux-kernel-module/daily/index.xml
+++ b/linux-kernel-module/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Linux Kernel Module Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:41Z
+ 2023-10-11T01:33:46Z
Daily Trending of Linux Kernel Module in GitHub
\ No newline at end of file
diff --git a/liquid/daily/index.xml b/liquid/daily/index.xml
index 37b0a217f92..13172ac7d23 100644
--- a/liquid/daily/index.xml
+++ b/liquid/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Liquid Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:44Z
+ 2023-10-11T01:33:48Z
Daily Trending of Liquid in GitHub
\ No newline at end of file
diff --git a/literate-agda/daily/index.xml b/literate-agda/daily/index.xml
index 765500d529e..2ac6ef95a84 100644
--- a/literate-agda/daily/index.xml
+++ b/literate-agda/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Literate Agda Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:42Z
+ 2023-10-11T01:33:46Z
Daily Trending of Literate Agda in GitHub
\ No newline at end of file
diff --git a/literate-coffeescript/daily/index.xml b/literate-coffeescript/daily/index.xml
index 1a239271b4d..efa574c75aa 100644
--- a/literate-coffeescript/daily/index.xml
+++ b/literate-coffeescript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Literate CoffeeScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:46Z
+ 2023-10-11T01:33:51Z
Daily Trending of Literate CoffeeScript in GitHub
\ No newline at end of file
diff --git a/literate-haskell/daily/index.xml b/literate-haskell/daily/index.xml
index 759441115a0..1783d7a27a7 100644
--- a/literate-haskell/daily/index.xml
+++ b/literate-haskell/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Literate Haskell Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:45Z
+ 2023-10-11T01:33:50Z
Daily Trending of Literate Haskell in GitHub
\ No newline at end of file
diff --git a/livescript/daily/index.xml b/livescript/daily/index.xml
index 70732da9e70..204f16dad5c 100644
--- a/livescript/daily/index.xml
+++ b/livescript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub LiveScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:47Z
+ 2023-10-11T01:33:49Z
Daily Trending of LiveScript in GitHub
\ No newline at end of file
diff --git a/llvm/daily/index.xml b/llvm/daily/index.xml
index bdd89bd0194..6ac48a65ff0 100644
--- a/llvm/daily/index.xml
+++ b/llvm/daily/index.xml
@@ -1,7 +1,7 @@
GitHub LLVM Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:47Z
+ 2023-10-11T01:33:52Z
Daily Trending of LLVM in GitHub
\ No newline at end of file
diff --git a/logos/daily/index.xml b/logos/daily/index.xml
index d7a297df0a3..eda8205c50c 100644
--- a/logos/daily/index.xml
+++ b/logos/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Logos Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:52Z
+ 2023-10-11T01:33:54Z
Daily Trending of Logos in GitHub
\ No newline at end of file
diff --git a/logtalk/daily/index.xml b/logtalk/daily/index.xml
index 8bd4963bfb9..9539399a76c 100644
--- a/logtalk/daily/index.xml
+++ b/logtalk/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Logtalk Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:49Z
+ 2023-10-11T01:33:56Z
Daily Trending of Logtalk in GitHub
\ No newline at end of file
diff --git a/lolcode/daily/index.xml b/lolcode/daily/index.xml
index e2f4cd4b66c..6664ce14a0a 100644
--- a/lolcode/daily/index.xml
+++ b/lolcode/daily/index.xml
@@ -1,7 +1,7 @@
GitHub LOLCODE Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:50Z
+ 2023-10-11T01:33:53Z
Daily Trending of LOLCODE in GitHub
\ No newline at end of file
diff --git a/lookml/daily/index.xml b/lookml/daily/index.xml
index d0e720b386c..117af411537 100644
--- a/lookml/daily/index.xml
+++ b/lookml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub LookML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:49Z
+ 2023-10-11T01:33:55Z
Daily Trending of LookML in GitHub
\ No newline at end of file
diff --git a/loomscript/daily/index.xml b/loomscript/daily/index.xml
index dc8f66564a0..d708da8c1b5 100644
--- a/loomscript/daily/index.xml
+++ b/loomscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub LoomScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:55Z
+ 2023-10-11T01:33:58Z
Daily Trending of LoomScript in GitHub
\ No newline at end of file
diff --git a/lsl/daily/index.xml b/lsl/daily/index.xml
index 45eca7e8942..8e9f58d6edd 100644
--- a/lsl/daily/index.xml
+++ b/lsl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub LSL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:54Z
+ 2023-10-11T01:33:59Z
Daily Trending of LSL in GitHub
\ No newline at end of file
diff --git a/ltspice-symbol/daily/index.xml b/ltspice-symbol/daily/index.xml
index a5d11fd51b1..eacbdb704f3 100644
--- a/ltspice-symbol/daily/index.xml
+++ b/ltspice-symbol/daily/index.xml
@@ -1,7 +1,7 @@
GitHub LTspice Symbol Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:53Z
+ 2023-10-11T01:33:57Z
Daily Trending of LTspice Symbol in GitHub
\ No newline at end of file
diff --git a/lua/daily/index.xml b/lua/daily/index.xml
index fcec0d1a346..9fe1ab93932 100644
--- a/lua/daily/index.xml
+++ b/lua/daily/index.xml
@@ -1,14 +1,21 @@
GitHub Lua Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:33:58Z
+ 2023-10-11T01:34:03Z
Daily Trending of Lua in GitHub
- Mustachedom/md-drugs
- 2023-10-10T01:33:58Z
- tag:github.com,2023-10-10:/Mustachedom/md-drugs
-
- <p>An in depth free drug script for QBCore</p><hr><hr>
<h1>Support</h1>
<p>if you have any issues, you can come to my discord and throw a ticket in. I hope i can get it fixed ASAP Rocky</p>
<p><a href="https://discord.gg/TwBaVECdGM">My Community Discord Invite Link</a></p>
<hr>
<h1>Credits</h1> This was all possible because of creators and devs in Project Sloth, JixelTay, and Samuel's development. I used the globalstates and spawning of props from Samuel's christmas script (I asked permission before release)
<p><a href="https://fivem.samueldev.shop/">Samuel's Tebex.</a></p>
<p>Project Sloth has been a pioneer of how the fivem community should be. Helping the community by creating free, easy to install, and fun scripts. Along with allowing the community to publish free scripts. and Jimathy and Tay are the sole reason I learned(ish) how to code. When I started back last year, I had no idea what I was doing and their scripts are easy to read, edit, and see how things actually function. without those scripts I would forget 1000x more commas and not understand how code communicates. If you don't have any of their scripts. you are missing out.</p>
<p><a href="https://jimathy666.tebex.io/">Jim's Tebex</a></p>
<p>I am not affiliated with any of these creators above but I have to give a shout out to the community when I can.</p>
<hr>
<ul>
<li>Big Credit to <a href="https://fivem.samueldev.shop/">Samuel's Development</a> for the way they did globalstates. That was the main inspiration to the beginning of this script. <br></li>
<li>Big Credit to Project Sloth as a team and also the Project Sloth Community. This was only made because of the big library of Free scripts published by them and their community. <a href="https://www.buymeacoffee.com/projectsloth/c/6825452">Buy Them coffee or something.</a><br></li>
<li>Big Credit to <a href="https://discord.gg/5ncbwMNq">Bostra</a>. if you have been around you may have seen him post some free scripts and help people. There was definetly times I dm'd him saying what the fuck am I doing and he helped keep me sane. <br></li>
<li>Big Credit to Feisty. She made all the images that look good. Seriously you can tell which ones I forgot to ask her for. <br></li>
</ul>
<hr>
<h1>Dependencies</h1>
<ul>
<li> <p><a href="https://github.com/qbcore-framework/qb-core">qb-core</a></p> </li>
<li> <p><a href="https://github.com/Project-Sloth/ps-inventory">LJ/PS</a> or <a href="https://github.com/qbcore-framework/qb-inventory">qb inventory</a></p> </li>
<li> <p><a href="https://github.com/Project-Sloth/ps-buf">ps-buffs</a></p> </li>
<li> <p><a href="https://github.com/Project-Sloth/ps-ui">ps-ui</a></p> </li>
<li> <p><a href="https://github.com/qbcore-framework/qb-target">qb-target</a></p> </li>
<li> <p><a href="https://github.com/mkafrin/PolyZone"> polyzone</a></p> </li>
<li> <p><a href="https://github.com/TayMcKenzieNZ/rpemotes">RPEmotes</a></p> </li>
</ul>
<hr>
<h1>How to install like a fuckin bosssssss</h1>
<ul>
<li>STEP 1 Add items To qb-core - > shared -> items.lua</li>
</ul>
<pre><code>------------------ md-drugs
["coke"] = {["name"] = "coke", ["label"] = "Raw Cocaine", ["weight"] = 1000, ["type"] = "item", ["image"] = "coke.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = "Processed cocaine"},
["coca_leaf"] = {["name"] = "coca_leaf", ["label"] = "Cocaine leaves", ["weight"] = 1500, ["type"] = "item", ["image"] = "coca_leaf.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = "Cocaine leaves that must be processed !"},
["poppyresin"] = {["name"] = "poppyresin", ["label"] = "Poppy resin", ["weight"] = 2000, ["type"] = "item", ["image"] = "poppyresin.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = "It sticks to your fingers when you handle it."},
["heroin"] = {["name"] = "heroin", ["label"] = "Weak Heroin Powder", ["weight"] = 500, ["type"] = "item", ["image"] = "loosecoke.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = "Really addictive depressant..."},
["bakingsoda"] = {["name"] = "bakingsoda", ["label"] = "Baking Soda", ["weight"] = 300, ["type"] = "item", ["image"] = "bakingsoda.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = "Household Baking Soda!"},
['loosecoke'] = {['name'] = 'loosecoke', ['label'] = 'loose coke', ['weight'] = 100, ['type'] = 'item', ['image'] = 'loosecoke.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Paper made specifically for encasing and smoking tobacco or cannabis.'},
['loosecokestagetwo'] = {['name'] = 'loosecokestagetwo', ['label'] = 'More Pure Loose Coke', ['weight'] = 100, ['type'] = 'item', ['image'] = 'loosecokestagetwo.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['loosecokestagethree'] = {['name'] = 'loosecokestagethree', ['label'] = 'Purest Loose Coke', ['weight'] = 100, ['type'] = 'item', ['image'] = 'loosecokestagethree.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['cokebaggystagetwo'] = {['name'] = 'cokebaggystagetwo', ['label'] = 'Bag of Good Coke', ['weight'] = 100, ['type'] = 'item', ['image'] = 'cocaine_baggystagetwo.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'To get happy real quick'},
['cokebaggystagethree'] = {['name'] = 'cokebaggystagethree', ['label'] = 'Bag of Great Coke', ['weight'] = 100, ['type'] = 'item', ['image'] = 'cocaine_baggystagethree.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'To get happy real quick'},
["cokestagetwo"] = {["name"] = "cokestagetwo", ["label"] = "Better Raw Cocaine", ["weight"] = 100, ["type"] = "item", ["image"] = "cokestagetwo.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["expire"] = 90, ["description"] = "Processed cocaine"},
["cokestagethree"] = {["name"] = "cokestagethree", ["label"] = "Best Raw Cocaine", ["weight"] = 100, ["type"] = "item", ["image"] = "cokestagethree.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["expire"] = 90, ["description"] = "Processed cocaine"},
----md-lsd
['lysergic_acid'] = {['name'] = 'lysergic_acid', ['label'] = 'Lysergic Acid', ['weight'] = 100, ['type'] = 'item', ['image'] = 'lysergic_acid.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['diethylamide'] = {['name'] = 'diethylamide', ['label'] = 'Diethylamide', ['weight'] = 100, ['type'] = 'item', ['image'] = 'diethylamide.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['lsd_one_vial'] = {['name'] = 'lsd_one_vial', ['label'] = 'Weakest LSD Vial', ['weight'] = 100, ['type'] = 'item', ['image'] = 'lsd_one_vial.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['lsd_vial_two'] = {['name'] = 'lsd_vial_two', ['label'] = 'Slightly Better LSD Vial', ['weight'] = 100, ['type'] = 'item', ['image'] = 'lsd_vial_two.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['lsd_vial_three'] = {['name'] = 'lsd_vial_three', ['label'] = 'Good LSD', ['weight'] = 100, ['type'] = 'item', ['image'] = 'lsd_vial_three.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['lsd_vial_four'] = {['name'] = 'lsd_vial_four', ['label'] = 'Really Good LSD', ['weight'] = 100, ['type'] = 'item', ['image'] = 'lsd_vial_four.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['lsd_vial_five'] = {['name'] = 'lsd_vial_five', ['label'] = 'Amazing LSD', ['weight'] = 100, ['type'] = 'item', ['image'] = 'lsd_vial_five.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['lsd_vial_six'] = {['name'] = 'lsd_vial_six', ['label'] = 'Purest LSD', ['weight'] = 100, ['type'] = 'item', ['image'] = 'lsd_vial_six.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['tab_paper'] = {['name'] = 'tab_paper', ['label'] = 'Tab Paper', ['weight'] = 100, ['type'] = 'item', ['image'] = 'tab_paper.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['smileyfacesheet'] = {['name'] = 'smileyfacesheet', ['label'] = 'Smiley Face Sheet', ['weight'] = 100, ['type'] = 'item', ['image'] = 'smileysheet.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['wildcherrysheet'] = {['name'] = 'wildcherrysheet', ['label'] = 'Wild Cherry Sheet', ['weight'] = 100, ['type'] = 'item', ['image'] = 'wildcherrysheet.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['yinyangsheet'] = {['name'] = 'yinyangsheet', ['label'] = 'Yin and Yang Sheet', ['weight'] = 100, ['type'] = 'item', ['image'] = 'yinyangsheet.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['pineapplesheet'] = {['name'] = 'pineapplesheet', ['label'] = 'Pineapple Sheet', ['weight'] = 100, ['type'] = 'item', ['image'] = 'pineapplesheet.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['bartsheet'] = {['name'] = 'bartsheet', ['label'] = 'Bart Simpson Sheet', ['weight'] = 100, ['type'] = 'item', ['image'] = 'bartsheet.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['gratefuldeadsheet'] = {['name'] = 'gratefuldeadsheet', ['label'] = 'Grateful Dead Sheet', ['weight'] = 100, ['type'] = 'item', ['image'] = 'gratefuldeadsheet.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['smiley_tabs'] = {['name'] = 'smiley_tabs', ['label'] = 'Smiley tabs', ['weight'] = 100, ['type'] = 'item', ['image'] = 'smiley_tabs.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['wildcherry_tabs'] = {['name'] = 'wildcherry_tabs', ['label'] = 'Wild Cherry Tabs', ['weight'] = 100, ['type'] = 'item', ['image'] = 'wildcherry_tabs.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['yinyang_tabs'] = {['name'] = 'yinyang_tabs', ['label'] = 'Yin and Yang Tabs', ['weight'] = 100, ['type'] = 'item', ['image'] = 'yinyang_tabs.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['pineapple_tabs'] = {['name'] = 'pineapple_tabs', ['label'] = 'Pineapple Tabs', ['weight'] = 100, ['type'] = 'item', ['image'] = 'pineapple_tabs.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['bart_tabs'] = {['name'] = 'bart_tabs', ['label'] = 'Bart Simpson Tabs', ['weight'] = 100, ['type'] = 'item', ['image'] = 'bart_tabs.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['gratefuldead_tabs'] = {['name'] = 'gratefuldead_tabs', ['label'] = 'Grateful Dead Tabs', ['weight'] = 100, ['type'] = 'item', ['image'] = 'gratefuldead_tabs.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'DONT USE IF YOU GET SEIZURES'},
['lsdlabkit'] = {['name'] = 'lsdlabkit', ['label'] = 'LSD Mixing Table', ['weight'] = 1000, ['type'] = 'item', ['image'] = 'labkit.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['dirtylsdlabkit'] = {['name'] = 'dirtylsdlabkit', ['label'] = 'Dirty LSD Mixing Table', ['weight'] = 1000, ['type'] = 'item', ['image'] = 'labkit_dirty.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
---- md heroin
["heroinstagetwo"] = {["name"] = "heroinstagetwo", ["label"] = "Better Heroin", ["weight"] = 250, ["type"] = "item", ["image"] = "heroinpowderstagetwo.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["heroinstagethree"] = {["name"] = "heroinstagethree", ["label"] = "Best Heroin", ["weight"] = 250, ["type"] = "item", ["image"] = "heroinpowderstagethree.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["heroincut"] = {["name"] = "heroincut", ["label"] = "Cut Heroin", ["weight"] = 250, ["type"] = "item", ["image"] = "heroinpowder.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["heroincutstagetwo"] = {["name"] = "heroincutstagetwo", ["label"] = "Better Cut Heroin", ["weight"] = 250, ["type"] = "item", ["image"] = "heroinpowderstagethree.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["heroincutstagethree"] = {["name"] = "heroincutstagethree", ["label"] = "Best Cut Heroin", ["weight"] = 250, ["type"] = "item", ["image"] = "heroinpowderstagetwo.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["heroinlabkit"] = {["name"] = "heroinlabkit", ["label"] = "Heroin Lab Kit", ["weight"] = 250, ["type"] = "item", ["image"] = "labkit.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["dirtyheroinlabkit"] = {["name"] = "dirtyheroinlabkit", ["label"] = "Dirty heroin Lab Kit", ["weight"] = 250, ["type"] = "item", ["image"] = "labkit_dirty.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["heroinvial"] = {["name"] = "heroinvial", ["label"] = "Vial Of Heroin", ["weight"] = 250, ["type"] = "item", ["image"] = "heroin.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["heroinvialstagetwo"] = {["name"] = "heroinvialstagetwo", ["label"] = "Better Vial of Heroin", ["weight"] = 250, ["type"] = "item", ["image"] = "heroinstagetwo.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["heroinvialstagethree"] = {["name"] = "heroinvialstagethree", ["label"] = "Best Vial Of Heroin", ["weight"] = 250, ["type"] = "item", ["image"] = "heroinstagethree.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["heroin_ready"] = {["name"] = "heroin_ready", ["label"] = "Syringe Of Heroin", ["weight"] = 250, ["type"] = "item", ["image"] = "heroin_ready.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["heroin_readystagetwo"] = {["name"] = "heroin_readystagetwo", ["label"] = "Syringe Of Better Heroin", ["weight"] = 250, ["type"] = "item", ["image"] = "heroin_readystagetwo.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["heroin_readystagethree"] = {["name"] = "heroin_readystagethree", ["label"] = "Syringe Of Best Heroin", ["weight"] = 250, ["type"] = "item", ["image"] = "heroin_readystagethree.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["emptyvial"] = {["name"] = "emptyvial", ["label"] = "empty vial", ['weight'] = 100, ["type"] = "item", ["image"] = "emptyvial.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ['combinable'] = nil, ["description"] = ""},
["needle"] = {["name"] = "needle", ["label"] = "Syringe", ["weight"] = 250, ["type"] = "item", ["image"] = "syringe.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
---- md crack
["crackrock"] = {["name"] = "crackrock", ["label"] = "Crack Rock", ["weight"] = 250, ["type"] = "item", ["image"] = "crackrock1.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["crackrockstagetwo"] = {["name"] = "crackrockstagetwo", ["label"] = "Better Crack Rock", ["weight"] = 250, ["type"] = "item", ["image"] = "crackrock2.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["crackrockstagethree"] = {["name"] = "crackrockstagethree", ["label"] = "Best Crack Rock", ["weight"] = 250, ["type"] = "item", ["image"] = "crackrock3.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["baggedcracked"] = {["name"] = "baggedcracked", ["label"] = "Bag Of Crack", ["weight"] = 250, ["type"] = "item", ["image"] = "crackbag1.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["baggedcrackedstagetwo"] = {["name"] = "baggedcrackedstagetwo", ["label"] = "Better Bag Of Crack", ["weight"] = 250, ["type"] = "item", ["image"] = "crackbag2.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["baggedcrackedstagethree"] = {["name"] = "baggedcrackedstagethree", ["label"] = "Best Bag Of Crack", ["weight"] = 250, ["type"] = "item", ["image"] = "crackbag3.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
---- shrooms
["shrooms"] = {["name"] = "shrooms", ["label"] = "Shrooms", ["weight"] = 250, ["type"] = "item", ["image"] = "shrooms.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
-- pharma
['prescription_pad'] = {['name'] = 'prescription_pad', ['label'] = 'Prescription Pad', ['weight'] = 10, ['type'] = 'item', ['image'] = 'prescriptionpad.png', ['unique'] = true, ['useable'] = true, ['shouldClose'] = false, ['combinable'] = nil, ['description'] = ''},
["vicodin_prescription"] = {["name"] = "vicodin_prescription", ["label"] = "Vicodin Prescription", ["weight"] = 250, ["type"] = "item", ["image"] = "vicodinprescription.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["adderal_prescription"] = {["name"] = "adderal_prescription", ["label"] = "Adderal Prescription", ["weight"] = 250, ["type"] = "item", ["image"] = "adderalprescription.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["morphine_prescription"] = {["name"] = "morphine_prescription", ["label"] = "Morphine Prescription", ["weight"] = 250, ["type"] = "item", ["image"] = "morphineprescription.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
["xanax_prescription"] = {["name"] = "xanax_prescription", ["label"] = "Xanax Prescription", ["weight"] = 250, ["type"] = "item", ["image"] = "xanaxprescription.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = ""},
['adderal'] = {['name'] = 'adderal', ['label'] = 'Adderal', ['weight'] = 100, ['type'] = 'item', ['image'] = 'adderal.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['vicodin'] = {['name'] = 'vicodin', ['label'] = 'Vicodin', ['weight'] = 100, ['type'] = 'item', ['image'] = 'vicodin.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['morphine'] = {['name'] = 'morphine', ['label'] = 'Morphine', ['weight'] = 100, ['type'] = 'item', ['image'] = 'morphine.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['xanax'] = {['name'] = 'xanax', ['label'] = 'Xanax', ['weight'] = 100, ['type'] = 'item', ['image'] = 'xanax.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['adderalbottle'] = {['name'] = 'adderalbottle', ['label'] = 'Adderal Bottle', ['weight'] = 100, ['type'] = 'item', ['image'] = 'pillbottle.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['vicodinbottle'] = {['name'] = 'vicodinbottle', ['label'] = 'Vicodin Bottle', ['weight'] = 100, ['type'] = 'item', ['image'] = 'pillbottle.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['morphinebottle'] = {['name'] = 'morphinebottle', ['label'] = 'Morphine Bottle', ['weight'] = 100, ['type'] = 'item', ['image'] = 'pillbottle.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['xanaxbottle'] = {['name'] = 'xanaxbottle', ['label'] = 'Xanax Bottle', ['weight'] = 100, ['type'] = 'item', ['image'] = 'pillbottle.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
---------------- XTC
['isosafrole'] = {['name'] = 'isosafrole', ['label'] = 'isosafrole', ['weight'] = 100, ['type'] = 'item', ['image'] = 'isosafrole.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
['mdp2p'] = {['name'] = 'mdp2p', ['label'] = 'mdp2p', ['weight'] = 100, ['type'] = 'item', ['image'] = 'mdp2p.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ''},
["raw_xtc"] = {["name"] = "raw_xtc", ["label"] = "Raw XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "raw_xtc.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["singlepress"] = {["name"] = "singlepress", ["label"] = "Single Pill Press", ['weight'] = 100, ["type"] = "item", ["image"] = "pillpress.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_xtc"] = {["name"] = "white_xtc", ["label"] = "Single Stack White XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedwhite.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_xtc2"] = {["name"] = "white_xtc2", ["label"] = "Dual Stack White XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedwhite.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_xtc3"] = {["name"] = "white_xtc3", ["label"] = "Triple Stack White XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedwhite.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_xtc4"] = {["name"] = "white_xtc4", ["label"] = "Quad Stack White XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedwhite.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_xtc"] = {["name"] = "red_xtc", ["label"] = "Single Stack Red XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedred.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_xtc2"] = {["name"] = "red_xtc2", ["label"] = "Dual Stack Red XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedred.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_xtc3"] = {["name"] = "red_xtc3", ["label"] = "Triple Stack Red XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedred.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_xtc4"] = {["name"] = "red_xtc4", ["label"] = "Quad Stack Red XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedred.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_xtc"] = {["name"] = "orange_xtc", ["label"] = "Single Stack Orange XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedorange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_xtc2"] = {["name"] = "orange_xtc2", ["label"] = "Dual Stack Orange XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedorange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_xtc3"] = {["name"] = "orange_xtc3", ["label"] = "Triple Stack Orange XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedorange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_xtc4"] = {["name"] = "orange_xtc4", ["label"] = "Quad Stack Orange XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedorange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_xtc"] = {["name"] = "blue_xtc", ["label"] = "Single Stack Blue XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedblue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_xtc2"] = {["name"] = "blue_xtc2", ["label"] = "Dual Stack Blue XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedblue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_xtc3"] = {["name"] = "blue_xtc3", ["label"] = "Triple Stack Blue XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedblue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_xtc4"] = {["name"] = "blue_xtc4", ["label"] = "Quad Stack Blue XTC", ['weight'] = 100, ["type"] = "item", ["image"] = "unstampedblue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_playboys"] = {["name"] = "white_playboys", ["label"] = "Single Stack White Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_playboys2"] = {["name"] = "white_playboys2", ["label"] = "Dual Stack White Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_playboys3"] = {["name"] = "white_playboys3", ["label"] = "Triple Stack White Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_playboys4"] = {["name"] = "white_playboys4", ["label"] = "Quad Stack White Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_playboys"] = {["name"] = "blue_playboys", ["label"] = "Single Stack blue Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_playboys2"] = {["name"] = "blue_playboys2", ["label"] = "Dual Stack blue Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_playboys3"] = {["name"] = "blue_playboys3", ["label"] = "Triple Stack blue Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_playboys4"] = {["name"] = "blue_playboys4", ["label"] = "Quad Stack blue Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_playboys"] = {["name"] = "red_playboys", ["label"] = "Single Stack red Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_playboys2"] = {["name"] = "red_playboys2", ["label"] = "Dual Stack red Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_playboys3"] = {["name"] = "red_playboys3", ["label"] = "Triple Stack red Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_playboys4"] = {["name"] = "red_playboys4", ["label"] = "Quad Stack red Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_playboys"] = {["name"] = "orange_playboys", ["label"] = "Single Stack orange Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_playboys2"] = {["name"] = "orange_playboys2", ["label"] = "Dual Stack orange Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_playboys3"] = {["name"] = "orange_playboys3", ["label"] = "Triple Stack orange Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_playboys4"] = {["name"] = "orange_playboys4", ["label"] = "Quad Stack orange Playboys", ['weight'] = 100, ["type"] = "item", ["image"] = "playboy_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_aliens"] = {["name"] = "white_aliens", ["label"] = "Single Stack White aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_aliens2"] = {["name"] = "white_aliens2", ["label"] = "Dual Stack White aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_aliens3"] = {["name"] = "white_aliens3", ["label"] = "Triple Stack White aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_aliens4"] = {["name"] = "white_aliens4", ["label"] = "Quad Stack White aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_aliens"] = {["name"] = "blue_aliens", ["label"] = "Single Stack blue aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_aliens2"] = {["name"] = "blue_aliens2", ["label"] = "Dual Stack blue aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_aliens3"] = {["name"] = "blue_aliens3", ["label"] = "Triple Stack blue aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_aliens4"] = {["name"] = "blue_aliens4", ["label"] = "Quad Stack blue aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_aliens"] = {["name"] = "red_aliens", ["label"] = "Single Stack red aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_aliens2"] = {["name"] = "red_aliens2", ["label"] = "Dual Stack red aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_aliens3"] = {["name"] = "red_aliens3", ["label"] = "Triple Stack red aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_aliens4"] = {["name"] = "red_aliens4", ["label"] = "Quad Stack red aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_aliens"] = {["name"] = "orange_aliens", ["label"] = "Single Stack orange aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_aliens2"] = {["name"] = "orange_aliens2", ["label"] = "Dual Stack orange aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_aliens3"] = {["name"] = "orange_aliens3", ["label"] = "Triple Stack orange aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_aliens4"] = {["name"] = "orange_aliens4", ["label"] = "Quad Stack orange aliens", ['weight'] = 100, ["type"] = "item", ["image"] = "alien_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_pl"] = {["name"] = "white_pl", ["label"] = "Single Stack White pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_pl2"] = {["name"] = "white_pl2", ["label"] = "Dual Stack White pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_pl3"] = {["name"] = "white_pl3", ["label"] = "Triple Stack White pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_pl4"] = {["name"] = "white_pl4", ["label"] = "Quad Stack White pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_pl"] = {["name"] = "blue_pl", ["label"] = "Single Stack blue pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_pl2"] = {["name"] = "blue_pl2", ["label"] = "Dual Stack blue pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_pl3"] = {["name"] = "blue_pl3", ["label"] = "Triple Stack blue pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_pl4"] = {["name"] = "blue_pl4", ["label"] = "Quad Stack blue pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_pl"] = {["name"] = "red_pl", ["label"] = "Single Stack red pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_pl2"] = {["name"] = "red_pl2", ["label"] = "Dual Stack red pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_pl3"] = {["name"] = "red_pl3", ["label"] = "Triple Stack red pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_pl4"] = {["name"] = "red_pl4", ["label"] = "Quad Stack red pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_pl"] = {["name"] = "orange_pl", ["label"] = "Single Stack orange pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_pl2"] = {["name"] = "orange_pl2", ["label"] = "Dual Stack orange pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_pl3"] = {["name"] = "orange_pl3", ["label"] = "Triple Stack orange pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_pl4"] = {["name"] = "orange_pl4", ["label"] = "Quad Stack orange pl", ['weight'] = 100, ["type"] = "item", ["image"] = "PL_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_trolls"] = {["name"] = "white_trolls", ["label"] = "Single Stack White trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_trolls2"] = {["name"] = "white_trolls2", ["label"] = "Dual Stack White trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_trolls3"] = {["name"] = "white_trolls3", ["label"] = "Tritrollse Stack White trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_trolls4"] = {["name"] = "white_trolls4", ["label"] = "Quad Stack White trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_trolls"] = {["name"] = "blue_trolls", ["label"] = "Single Stack blue trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_trolls2"] = {["name"] = "blue_trolls2", ["label"] = "Dual Stack blue trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_trolls3"] = {["name"] = "blue_trolls3", ["label"] = "Tritrollse Stack blue trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_trolls4"] = {["name"] = "blue_trolls4", ["label"] = "Quad Stack blue trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_trolls"] = {["name"] = "red_trolls", ["label"] = "Single Stack red trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_trolls2"] = {["name"] = "red_trolls2", ["label"] = "Dual Stack red trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_trolls3"] = {["name"] = "red_trolls3", ["label"] = "Tritrollse Stack red trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_trolls4"] = {["name"] = "red_trolls4", ["label"] = "Quad Stack red trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_trolls"] = {["name"] = "orange_trolls", ["label"] = "Single Stack orange trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_trolls2"] = {["name"] = "orange_trolls2", ["label"] = "Dual Stack orange trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_trolls3"] = {["name"] = "orange_trolls3", ["label"] = "Tritrollse Stack orange trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_trolls4"] = {["name"] = "orange_trolls4", ["label"] = "Quad Stack orange trolls", ['weight'] = 100, ["type"] = "item", ["image"] = "troll_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_cats"] = {["name"] = "white_cats", ["label"] = "Single Stack White cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_cats2"] = {["name"] = "white_cats2", ["label"] = "Dual Stack White cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_cats3"] = {["name"] = "white_cats3", ["label"] = "Tricatse Stack White cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["white_cats4"] = {["name"] = "white_cats4", ["label"] = "Quad Stack White cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_white.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_cats"] = {["name"] = "blue_cats", ["label"] = "Single Stack blue cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_cats2"] = {["name"] = "blue_cats2", ["label"] = "Dual Stack blue cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_cats3"] = {["name"] = "blue_cats3", ["label"] = "Tricatse Stack blue cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["blue_cats4"] = {["name"] = "blue_cats4", ["label"] = "Quad Stack blue cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_blue.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_cats"] = {["name"] = "red_cats", ["label"] = "Single Stack red cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_cats2"] = {["name"] = "red_cats2", ["label"] = "Dual Stack red cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_cats3"] = {["name"] = "red_cats3", ["label"] = "Tricatse Stack red cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["red_cats4"] = {["name"] = "red_cats4", ["label"] = "Quad Stack red cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_red.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_cats"] = {["name"] = "orange_cats", ["label"] = "Single Stack orange cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_cats2"] = {["name"] = "orange_cats2", ["label"] = "Dual Stack orange cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_cats3"] = {["name"] = "orange_cats3", ["label"] = "Tricatse Stack orange cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["orange_cats4"] = {["name"] = "orange_cats4", ["label"] = "Quad Stack orange cats", ['weight'] = 100, ["type"] = "item", ["image"] = "kitty_orange.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["dualpress"] = {["name"] = "dualpress", ["label"] = "Dual Pill Press", ['weight'] = 100, ["type"] = "item", ["image"] = "pillpress.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["triplepress"] = {["name"] = "triplepress", ["label"] = "Triple Pill Press", ['weight'] = 100, ["type"] = "item", ["image"] = "pillpress.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["quadpress"] = {["name"] = "quadpress", ["label"] = "Quad Pill Press", ['weight'] = 100, ["type"] = "item", ["image"] = "pillpress.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["spores"] = {["name"] = "spores", ["label"] = "spores", ['weight'] = 100, ["type"] = "item", ["image"] = "shrooms.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["cokeburner"] = {["name"] = "cokeburner", ["label"] = "Nokia Burner", ['weight'] = 100, ["type"] = "item", ["image"] = "cokeburner.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["crackburner"] = {["name"] = "crackburner", ["label"] = "Juke Burner", ['weight'] = 100, ["type"] = "item", ["image"] = "crackburner.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["heroinburner"] = {["name"] = "heroinburner", ["label"] = "Razr Burner", ['weight'] = 100, ["type"] = "item", ["image"] = "heroinburner.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["lsdburner"] = {["name"] = "lsdburner", ["label"] = "SideKick Burner", ['weight'] = 100, ["type"] = "item", ["image"] = "lsdburner.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["cactusbulb"] = {["name"] = "cactusbulb", ["label"] = "Cactus Bulb", ['weight'] = 100, ["type"] = "item", ["image"] = "cactusbulb.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
["driedmescaline"] = {["name"] = "driedmescaline", ["label"] = "Mescaline", ['weight'] = 100, ["type"] = "item", ["image"] = "driedmescaline.png", ["unique"] = false, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""},
</code></pre>
<hr>
<ul>
<li>STEP 2 Add Images from <code>HTML</code> folder to your inventory script images location</li>
</ul>
<hr>
<ul>
<li>STEP 3 delete <code>qb-drugs</code></li>
</ul>
<hr>
<ul>
<li>STEP 4 INSIDE OF THE CONFIG change all the locations for everything. All locations have been changed to make a preview video easier and with how big of a script this is, Im not going to config it for every city. Its simple vec3 and vec4s. Make your city unique so its not in the same location as every other city.</li>
</ul>
<hr>
<ul>
<li>STEP 5 in <code>qb-radial</code> menu search for</li>
</ul>
<pre><code>event = 'qb-drugs:client:cornerselling',
</code></pre>
<p>and switch it to this</p>
<pre><code>event = 'md-drugs:client:cornerselling',
</code></pre>
<hr>
<ul>
<li>STEP 6 in <code>qb-adminmenu</code> look for</li>
</ul>
<pre><code>QBCore.Functions.CreateCallback('test:getdealers', function(_, cb)
cb(exports['qb-drugs']:GetDealers())
end)
</code></pre>
<p>in the <code>server.lua</code> and change it to</p>
<pre><code>QBCore.Functions.CreateCallback('test:getdealers', function(_, cb)
cb(exports['md-drugs']:GetDealers())
end)
</code></pre>
<hr>
<ul>
<li>STEP 7 in <code>Cornerselling.lua</code> line 30 and line 148 of <code>deliveries.lu</code>a on the <strong>client</strong> side for <strong>both</strong> place your Police Alert inside that function. for example something like ps-dispatch will look like this</li>
</ul>
<pre><code>local function PoliceCall()
local currentPos = GetEntityCoords(PlayerPedId())
TriggerServerEvent("dispatch:server:notify", {
dispatchcodename = "susactivity", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip
dispatchCode = "10-66",
origin = {
x = currentPos.x,
y = currentPos.y,
z = currentPos.z
},
dispatchMessage = "Oxy Runs",
job = {"LEO", "police"} -- has to match the recipientList in sv_dispatchcodes.lua
})
end
</code></pre>
+ kepano/flexoki
+ 2023-10-11T01:34:03Z
+ tag:github.com,2023-10-11:/kepano/flexoki
+
+ <p>An inky color scheme for prose and code.</p><hr><p><a href="https://stephango.com/flexoki"><img src="https://raw.githubusercontent.com/kepano/flexoki/main/flexoki-dark.png" alt="Flexoki"></a></p>
<p>Flexoki is an inky color scheme for prose and code. Flexoki is designed for reading and writing on digital screens. It is inspired by analog printing inks and warm shades of paper.</p>
<p>Learn more at <a href="https://stephango.com/flexoki">stephango.com/flexoki</a></p>
<h2>Syntax highlighting</h2>
<p><img src="https://raw.githubusercontent.com/kepano/flexoki/main/flexoki-code.png" alt="Flexoki"></p>
<h2>Ports</h2>
<p>Flexoki is available for the following apps and tools.</p>
<h3>Apps</h3>
<ul>
<li><a href="https://github.com/kepano/flexoki/tree/main/alacritty">Alacritty</a> by @willtheodore</li>
<li><a href="https://github.com/crmsnbleyd/flexoki-emacs-theme">Emacs</a> by @crmsnbleyd</li>
<li><a href="https://github.com/kepano/flexoki/tree/main/iterm2">iTerm2</a> by @techvlad and @pingiun</li>
<li><a href="https://github.com/kepano/flexoki/tree/main/kitty">Kitty</a> by @peterjbachman</li>
<li><a href="https://github.com/kepano/flexoki/tree/main/lite_xl">Lite XL</a> by @chambored</li>
<li><a href="https://github.com/kepano/flexoki/tree/main/neovim">Neovim</a> by @stevedylandev</li>
<li><a href="https://github.com/kepano/flexoki-obsidian">Obsidian</a> and part of <a href="https://github.com/kepano/obsidian-minimal">Minimal theme</a> by @kepano</li>
<li><a href="https://github.com/kepano/flexoki/tree/main/terminal">macOS Terminal</a> by @getninjaN</li>
<li><a href="https://github.com/kepano/flexoki-sublime">Sublime Text</a> by @kepano</li>
<li><a href="https://github.com/kepano/flexoki/tree/main/vscode">Visual Studio Code</a> by @Railly</li>
<li><a href="https://github.com/kepano/flexoki/tree/main/warp-terminal">Warp</a> by @tplesnar</li>
<li><a href="https://github.com/kepano/flexoki/tree/main/wezterm">WezTerm</a> by @jbromley</li>
<li><a href="https://github.com/kepano/flexoki/tree/main/windows-terminal">Windows Terminal</a> by @joukevandermaas</li>
<li><a href="https://github.com/kepano/flexoki/tree/main/xresources">Xresources</a> by @dmb2</li>
</ul>
<h3>Frameworks</h3>
<ul>
<li><a href="https://gist.github.com/phenomen/affd8c346538378548febd20dccdbfcc">Shadcn</a> by @phenomen</li>
<li><a href="https://gist.github.com/martin-mael/4b50fa8e55da846f3f73399d84fa1848">Tailwind</a> by @martin-mael</li>
<li><a href="https://github.com/kepano/flexoki/tree/main/theme.sh">theme.sh</a> by @TheLastZombie</li>
</ul>
<h3>Other</h3>
<ul>
<li><a href="https://www.figma.com/community/file/1293274371462921490/flexoki">Figma</a> by @kepano</li>
<li><a href="https://github.com/kepano/flexoki/tree/main/gimp">GIMP palette</a> by @xTibor</li>
</ul>
<h2>Contributing</h2>
<p>Flexoki is MIT licensed. You are free to port Flexoki to any app. Please include attribution and a link to <a href="https://stephango.com/flexoki">stephango.com/flexoki</a>. Add a link to your port in the list above via pull request.</p>
<h2>Colors</h2>
<p>Please <a href="https://stephango.com/flexoki">see documentation</a> for how to apply these colors.</p>
<h3>Base tones</h3>
<table>
<thead>
<tr>
<th>Value</th>
<th>Hex</th>
<th>RGB</th>
</tr>
</thead>
<tbody>
<tr>
<td>black</td>
<td><code>#100F0F</code></td>
<td><code>16, 15, 15</code></td>
</tr>
<tr>
<td>950</td>
<td><code>#1C1B1A</code></td>
<td><code>28, 27, 26</code></td>
</tr>
<tr>
<td>900</td>
<td><code>#282726</code></td>
<td><code>40, 39, 38</code></td>
</tr>
<tr>
<td>850</td>
<td><code>#343331</code></td>
<td><code>52, 51, 49</code></td>
</tr>
<tr>
<td>800</td>
<td><code>#403E3C</code></td>
<td><code>64, 62, 60</code></td>
</tr>
<tr>
<td>700</td>
<td><code>#575653</code></td>
<td><code>87, 86, 83</code></td>
</tr>
<tr>
<td>600</td>
<td><code>#6F6E69</code></td>
<td><code>111, 110, 105</code></td>
</tr>
<tr>
<td>500</td>
<td><code>#878580</code></td>
<td><code>135, 133, 128</code></td>
</tr>
<tr>
<td>300</td>
<td><code>#B7B5AC</code></td>
<td><code>183, 181, 172</code></td>
</tr>
<tr>
<td>200</td>
<td><code>#CECDC3</code></td>
<td><code>206, 205, 195</code></td>
</tr>
<tr>
<td>150</td>
<td><code>#DAD8CE</code></td>
<td><code>218, 216, 206</code></td>
</tr>
<tr>
<td>100</td>
<td><code>#E6E4D9</code></td>
<td><code>230, 228, 217</code></td>
</tr>
<tr>
<td>50</td>
<td><code>#F2F0E5</code></td>
<td><code>242, 240, 229</code></td>
</tr>
<tr>
<td>paper</td>
<td><code>#FFFCF0</code></td>
<td><code>255, 252, 240</code></td>
</tr>
</tbody>
</table>
<h3>Dark colors</h3>
<table>
<thead>
<tr>
<th>Color</th>
<th>Hex</th>
<th>RGB</th>
</tr>
</thead>
<tbody>
<tr>
<td>red</td>
<td><code>#AF3029</code></td>
<td><code>175, 48, 41</code></td>
</tr>
<tr>
<td>orange</td>
<td><code>#BC5215</code></td>
<td><code>188, 82, 21</code></td>
</tr>
<tr>
<td>yellow</td>
<td><code>#AD8301</code></td>
<td><code>173, 131, 1</code></td>
</tr>
<tr>
<td>green</td>
<td><code>#66800B</code></td>
<td><code>102, 128, 11</code></td>
</tr>
<tr>
<td>cyan</td>
<td><code>#24837B</code></td>
<td><code>36, 131, 123</code></td>
</tr>
<tr>
<td>blue</td>
<td><code>#205EA6</code></td>
<td><code>32, 94, 166</code></td>
</tr>
<tr>
<td>purple</td>
<td><code>#5E409D</code></td>
<td><code>94, 64, 157</code></td>
</tr>
<tr>
<td>magenta</td>
<td><code>#A02F6F</code></td>
<td><code>160, 47, 111</code></td>
</tr>
</tbody>
</table>
<h3>Light colors</h3>
<table>
<thead>
<tr>
<th>Color</th>
<th>Hex</th>
<th>RGB</th>
</tr>
</thead>
<tbody>
<tr>
<td>red</td>
<td><code>#D14D41</code></td>
<td><code>209, 77, 65</code></td>
</tr>
<tr>
<td>orange</td>
<td><code>#DA702C</code></td>
<td><code>218, 112, 44</code></td>
</tr>
<tr>
<td>yellow</td>
<td><code>#D0A215</code></td>
<td><code>208, 162, 21</code></td>
</tr>
<tr>
<td>green</td>
<td><code>#879A39</code></td>
<td><code>135, 154, 57</code></td>
</tr>
<tr>
<td>cyan</td>
<td><code>#3AA99F</code></td>
<td><code>58, 169, 159</code></td>
</tr>
<tr>
<td>blue</td>
<td><code>#4385BE</code></td>
<td><code>67, 133, 190</code></td>
</tr>
<tr>
<td>purple</td>
<td><code>#8B7EC8</code></td>
<td><code>139, 126, 200</code></td>
</tr>
<tr>
<td>magenta</td>
<td><code>#CE5D97</code></td>
<td><code>206, 93, 151</code></td>
</tr>
</tbody>
</table>
+
+
+ sanathks/workspace.nvim
+ 2023-10-11T01:34:03Z
+ tag:github.com,2023-10-11:/sanathks/workspace.nvim
+
+ <p>Manage projects within workspaces using Tmux sessions</p><hr><h1>workspace.nvim</h1>
<p><img src="https://img.shields.io/badge/license-MIT-blue.svg?sanitize=true" alt="License"></p>
<p>workspace.nvim is a Neovim plugin that allows you to manage Tmux sessions for your projects and workspaces in a simple and efficient way.</p>
<p><img src="https://github.com/sanathks/workspace.nvim/assets/4918600/9e451b20-7e2c-4577-8ad8-9d09308693f3" alt="workspace.nvim"></p>
<h2>Introduction</h2>
<p>Inspired by ThePrimeagen's <a href="https://github.com/ThePrimeagen/.dotfiles/raw/master/bin/.local/scripts/tmux-sessionizer">tmux-sessionizer</a></p>
<h3>Features</h3>
<ul>
<li>Create and manage Tmux sessions for different projects and workspaces.</li>
<li>Easily switch between Tmux sessions associated with your projects.</li>
</ul>
<h2>Installation</h2>
<p><a href="https://github.com/folke/lazy.nvim">lazy.nvim</a></p>
<pre><code class="language-lua">{
"sanathks/workspace.nvim",
dependencies = {"nvim-telescope/telescope.nvim"},
config = function()
require("workspace").setup({
workspaces = {
{ name = "Work", path = "~/projects/work", keymap = { "<leader>w" } },
{ name = "Hobby", path = "~/projects/hobby", keymap = { "<leader>p" } },
}
})
end,
}
</code></pre>
<h2>Switch between tmux sessions</h2>
<p><img src="https://github.com/sanathks/workspace.nvim/assets/4918600/961ce94d-943b-4416-b2b0-8a71655da929" alt="tmux sessions"></p>
<pre><code class="language-lua"> local workspace = require("workspace")
vim.keymap.set('n', '<leader>ps', workspace.tmux_sessions)
</code></pre>
<h2>Customize the session name generation</h2>
<p>with the <code>tmux_session_name_generator</code> option you can provide a custom session name generator, which allows you to make the session name unique across multiple workspaces.</p>
<pre><code class="language-lua">function(project_name, workspace_name)
local suffix = string.sub(workspace_name, 1, 2)
local session_name = string.upper(project_name) .. "_" .. suffix
return session_name
end
</code></pre>
<h2>Contributing</h2>
<p>Contributions are welcome! If you find any issues or have ideas for improvements, please open an issue or submit a pull request.</p>
\ No newline at end of file
diff --git a/m/daily/index.xml b/m/daily/index.xml
index d2b1c58a1ba..3ba4b653730 100644
--- a/m/daily/index.xml
+++ b/m/daily/index.xml
@@ -1,7 +1,7 @@
GitHub M Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:13Z
+ 2023-10-11T01:34:12Z
Daily Trending of M in GitHub
\ No newline at end of file
diff --git a/m4/daily/index.xml b/m4/daily/index.xml
index 279d6474a38..d0baddccbfc 100644
--- a/m4/daily/index.xml
+++ b/m4/daily/index.xml
@@ -1,7 +1,7 @@
GitHub M4 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:16Z
+ 2023-10-11T01:34:13Z
Daily Trending of M4 in GitHub
\ No newline at end of file
diff --git a/m4sugar/daily/index.xml b/m4sugar/daily/index.xml
index 3b4d4fe543a..ce3047637e1 100644
--- a/m4sugar/daily/index.xml
+++ b/m4sugar/daily/index.xml
@@ -1,7 +1,7 @@
GitHub M4Sugar Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:14Z
+ 2023-10-11T01:34:14Z
Daily Trending of M4Sugar in GitHub
\ No newline at end of file
diff --git a/macaulay2/daily/index.xml b/macaulay2/daily/index.xml
index d81415f3b02..8f29ff2964b 100644
--- a/macaulay2/daily/index.xml
+++ b/macaulay2/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Macaulay2 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:15Z
+ 2023-10-11T01:34:11Z
Daily Trending of Macaulay2 in GitHub
\ No newline at end of file
diff --git a/makefile/daily/index.xml b/makefile/daily/index.xml
index 3a692927b14..44d957a2796 100644
--- a/makefile/daily/index.xml
+++ b/makefile/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Makefile Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:23Z
+ 2023-10-11T01:34:21Z
Daily Trending of Makefile in GitHub
\ No newline at end of file
diff --git a/mako/daily/index.xml b/mako/daily/index.xml
index 2552add9325..b6bf9629e1b 100644
--- a/mako/daily/index.xml
+++ b/mako/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Mako Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:17Z
+ 2023-10-11T01:34:16Z
Daily Trending of Mako in GitHub
\ No newline at end of file
diff --git a/markdown/daily/index.xml b/markdown/daily/index.xml
index a6121784cd8..6a7b67898d1 100644
--- a/markdown/daily/index.xml
+++ b/markdown/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Markdown Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:20Z
+ 2023-10-11T01:34:18Z
Daily Trending of Markdown in GitHub
\ No newline at end of file
diff --git a/marko/daily/index.xml b/marko/daily/index.xml
index f84f3ceeacb..8d31e9b5639 100644
--- a/marko/daily/index.xml
+++ b/marko/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Marko Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:21Z
+ 2023-10-11T01:34:15Z
Daily Trending of Marko in GitHub
\ No newline at end of file
diff --git a/mask/daily/index.xml b/mask/daily/index.xml
index 2c03329b9cd..f23ba0b6e9c 100644
--- a/mask/daily/index.xml
+++ b/mask/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Mask Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:26Z
+ 2023-10-11T01:34:23Z
Daily Trending of Mask in GitHub
\ No newline at end of file
diff --git a/mathematica/daily/index.xml b/mathematica/daily/index.xml
index 85c06907c99..22670339764 100644
--- a/mathematica/daily/index.xml
+++ b/mathematica/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Mathematica Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:27Z
+ 2023-10-11T01:34:25Z
Daily Trending of Mathematica in GitHub
\ No newline at end of file
diff --git a/matlab/daily/index.xml b/matlab/daily/index.xml
index 5e93382e6c8..8bf637df8fc 100644
--- a/matlab/daily/index.xml
+++ b/matlab/daily/index.xml
@@ -1,14 +1,7 @@
GitHub MATLAB Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:28Z
+ 2023-10-11T01:34:24Z
Daily Trending of MATLAB in GitHub
-
- brainstorm-tools/brainstorm3
- 2023-10-10T01:34:28Z
- tag:github.com,2023-10-10:/brainstorm-tools/brainstorm3
-
- <p>Brainstorm software: MEG, EEG, fNIRS, ECoG, sEEG and electrophysiology</p><hr>
-
\ No newline at end of file
diff --git a/maven-pom/daily/index.xml b/maven-pom/daily/index.xml
index 56e20e3a41b..4649d60806e 100644
--- a/maven-pom/daily/index.xml
+++ b/maven-pom/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Maven POM Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:25Z
+ 2023-10-11T01:34:22Z
Daily Trending of Maven POM in GitHub
\ No newline at end of file
diff --git a/max/daily/index.xml b/max/daily/index.xml
index b901d05ff6d..29b98f78d03 100644
--- a/max/daily/index.xml
+++ b/max/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Max Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:30Z
+ 2023-10-11T01:34:27Z
Daily Trending of Max in GitHub
\ No newline at end of file
diff --git a/maxscript/daily/index.xml b/maxscript/daily/index.xml
index 4730ec6c686..44c47169605 100644
--- a/maxscript/daily/index.xml
+++ b/maxscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub MAXScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:29Z
+ 2023-10-11T01:34:27Z
Daily Trending of MAXScript in GitHub
\ No newline at end of file
diff --git a/mcfunction/daily/index.xml b/mcfunction/daily/index.xml
index 7235c0f261b..b44d351776d 100644
--- a/mcfunction/daily/index.xml
+++ b/mcfunction/daily/index.xml
@@ -1,7 +1,7 @@
GitHub mcfunction Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:31Z
+ 2023-10-11T01:34:28Z
Daily Trending of mcfunction in GitHub
\ No newline at end of file
diff --git a/mercury/daily/index.xml b/mercury/daily/index.xml
index 19f75abb898..3a93717ce09 100644
--- a/mercury/daily/index.xml
+++ b/mercury/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Mercury Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:35Z
+ 2023-10-11T01:34:34Z
Daily Trending of Mercury in GitHub
\ No newline at end of file
diff --git a/meson/daily/index.xml b/meson/daily/index.xml
index 23d3ca4f877..3cace4fd032 100644
--- a/meson/daily/index.xml
+++ b/meson/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Meson Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:37Z
+ 2023-10-11T01:34:33Z
Daily Trending of Meson in GitHub
\ No newline at end of file
diff --git a/metal/daily/index.xml b/metal/daily/index.xml
index 7c66567c36d..73dbe030732 100644
--- a/metal/daily/index.xml
+++ b/metal/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Metal Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:39Z
+ 2023-10-11T01:34:38Z
Daily Trending of Metal in GitHub
\ No newline at end of file
diff --git a/microsoft-developer-studio-project/daily/index.xml b/microsoft-developer-studio-project/daily/index.xml
index cb9cf524f85..fcf8cef3e7e 100644
--- a/microsoft-developer-studio-project/daily/index.xml
+++ b/microsoft-developer-studio-project/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Microsoft Developer Studio Project Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:40Z
+ 2023-10-11T01:34:37Z
Daily Trending of Microsoft Developer Studio Project in GitHub
\ No newline at end of file
diff --git a/microsoft-visual-studio-solution/daily/index.xml b/microsoft-visual-studio-solution/daily/index.xml
index 895202e7bf1..869069841c2 100644
--- a/microsoft-visual-studio-solution/daily/index.xml
+++ b/microsoft-visual-studio-solution/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Microsoft Visual Studio Solution Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:41Z
+ 2023-10-11T01:34:36Z
Daily Trending of Microsoft Visual Studio Solution in GitHub
\ No newline at end of file
diff --git a/minid/daily/index.xml b/minid/daily/index.xml
index 93845366d65..8fbd1e55b8e 100644
--- a/minid/daily/index.xml
+++ b/minid/daily/index.xml
@@ -1,7 +1,7 @@
GitHub MiniD Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:42Z
+ 2023-10-11T01:34:38Z
Daily Trending of MiniD in GitHub
\ No newline at end of file
diff --git a/mint/daily/index.xml b/mint/daily/index.xml
index 2f4aec7eccf..813f8bf84d7 100644
--- a/mint/daily/index.xml
+++ b/mint/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Mint Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:44Z
+ 2023-10-11T01:34:42Z
Daily Trending of Mint in GitHub
\ No newline at end of file
diff --git a/mirah/daily/index.xml b/mirah/daily/index.xml
index 4a28f81b3c7..aac149290c5 100644
--- a/mirah/daily/index.xml
+++ b/mirah/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Mirah Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:45Z
+ 2023-10-11T01:34:40Z
Daily Trending of Mirah in GitHub
\ No newline at end of file
diff --git a/mirc-script/daily/index.xml b/mirc-script/daily/index.xml
index 0daac3b9e81..e1de31270c4 100644
--- a/mirc-script/daily/index.xml
+++ b/mirc-script/daily/index.xml
@@ -1,7 +1,7 @@
GitHub mIRC Script Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:46Z
+ 2023-10-11T01:34:41Z
Daily Trending of mIRC Script in GitHub
\ No newline at end of file
diff --git a/mlir/daily/index.xml b/mlir/daily/index.xml
index 4efb0b0a7de..d2fcd6164ca 100644
--- a/mlir/daily/index.xml
+++ b/mlir/daily/index.xml
@@ -1,7 +1,7 @@
GitHub MLIR Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:48Z
+ 2023-10-11T01:34:46Z
Daily Trending of MLIR in GitHub
\ No newline at end of file
diff --git a/modelica/daily/index.xml b/modelica/daily/index.xml
index 515b86332f3..e478ff00e0e 100644
--- a/modelica/daily/index.xml
+++ b/modelica/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Modelica Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:47Z
+ 2023-10-11T01:34:43Z
Daily Trending of Modelica in GitHub
\ No newline at end of file
diff --git a/modula-2/daily/index.xml b/modula-2/daily/index.xml
index f8558283228..c1f22bbb501 100644
--- a/modula-2/daily/index.xml
+++ b/modula-2/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Modula-2 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:50Z
+ 2023-10-11T01:34:45Z
Daily Trending of Modula-2 in GitHub
\ No newline at end of file
diff --git a/modula-3/daily/index.xml b/modula-3/daily/index.xml
index e7bc513e3c0..00773e311c7 100644
--- a/modula-3/daily/index.xml
+++ b/modula-3/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Modula-3 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:49Z
+ 2023-10-11T01:34:44Z
Daily Trending of Modula-3 in GitHub
\ No newline at end of file
diff --git a/module-management-system/daily/index.xml b/module-management-system/daily/index.xml
index ee265532e84..2a6ee687f4f 100644
--- a/module-management-system/daily/index.xml
+++ b/module-management-system/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Module Management System Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:52Z
+ 2023-10-11T01:34:47Z
Daily Trending of Module Management System in GitHub
\ No newline at end of file
diff --git a/monkey-c/daily/index.xml b/monkey-c/daily/index.xml
index c2c0a76adfa..17b8348d852 100644
--- a/monkey-c/daily/index.xml
+++ b/monkey-c/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Monkey C Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:51Z
+ 2023-10-11T01:34:49Z
Daily Trending of Monkey C in GitHub
\ No newline at end of file
diff --git a/monkey/daily/index.xml b/monkey/daily/index.xml
index db5cd6f5faa..15e1a20903b 100644
--- a/monkey/daily/index.xml
+++ b/monkey/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Monkey Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:54Z
+ 2023-10-11T01:34:49Z
Daily Trending of Monkey in GitHub
\ No newline at end of file
diff --git a/moocode/daily/index.xml b/moocode/daily/index.xml
index 2c917517956..8aaeb15b4d7 100644
--- a/moocode/daily/index.xml
+++ b/moocode/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Moocode Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:53Z
+ 2023-10-11T01:34:48Z
Daily Trending of Moocode in GitHub
\ No newline at end of file
diff --git a/moonscript/daily/index.xml b/moonscript/daily/index.xml
index 394a447a5cd..d0397bcb68d 100644
--- a/moonscript/daily/index.xml
+++ b/moonscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub MoonScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:58Z
+ 2023-10-11T01:34:53Z
Daily Trending of MoonScript in GitHub
\ No newline at end of file
diff --git a/motoko/daily/index.xml b/motoko/daily/index.xml
index 0fe1403db29..8b0a6b9a8e7 100644
--- a/motoko/daily/index.xml
+++ b/motoko/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Motoko Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:56Z
+ 2023-10-11T01:34:51Z
Daily Trending of Motoko in GitHub
\ No newline at end of file
diff --git a/motorola-68k-assembly/daily/index.xml b/motorola-68k-assembly/daily/index.xml
index c68f8fa4762..86ceed71c7e 100644
--- a/motorola-68k-assembly/daily/index.xml
+++ b/motorola-68k-assembly/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Motorola 68K Assembly Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:55Z
+ 2023-10-11T01:34:52Z
Daily Trending of Motorola 68K Assembly in GitHub
\ No newline at end of file
diff --git a/mql4/daily/index.xml b/mql4/daily/index.xml
index 88e63101e41..e8010998cdb 100644
--- a/mql4/daily/index.xml
+++ b/mql4/daily/index.xml
@@ -1,7 +1,7 @@
GitHub MQL4 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:34:59Z
+ 2023-10-11T01:34:56Z
Daily Trending of MQL4 in GitHub
\ No newline at end of file
diff --git a/mql5/daily/index.xml b/mql5/daily/index.xml
index bffb70d41bd..33f44e121eb 100644
--- a/mql5/daily/index.xml
+++ b/mql5/daily/index.xml
@@ -1,7 +1,7 @@
GitHub MQL5 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:01Z
+ 2023-10-11T01:34:57Z
Daily Trending of MQL5 in GitHub
\ No newline at end of file
diff --git a/mtml/daily/index.xml b/mtml/daily/index.xml
index 685a89b305a..86366f68c1b 100644
--- a/mtml/daily/index.xml
+++ b/mtml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub MTML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:02Z
+ 2023-10-11T01:34:54Z
Daily Trending of MTML in GitHub
\ No newline at end of file
diff --git a/muf/daily/index.xml b/muf/daily/index.xml
index 0dcd7d5f4b6..defb59b9056 100644
--- a/muf/daily/index.xml
+++ b/muf/daily/index.xml
@@ -1,7 +1,7 @@
GitHub MUF Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:00Z
+ 2023-10-11T01:34:55Z
Daily Trending of MUF in GitHub
\ No newline at end of file
diff --git a/mupad/daily/index.xml b/mupad/daily/index.xml
index f27befd47bc..f1d9f271c2a 100644
--- a/mupad/daily/index.xml
+++ b/mupad/daily/index.xml
@@ -1,7 +1,7 @@
GitHub mupad Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:04Z
+ 2023-10-11T01:34:59Z
Daily Trending of mupad in GitHub
\ No newline at end of file
diff --git a/muse/daily/index.xml b/muse/daily/index.xml
index 48e91a42225..046bd1d7324 100644
--- a/muse/daily/index.xml
+++ b/muse/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Muse Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:05Z
+ 2023-10-11T01:34:59Z
Daily Trending of Muse in GitHub
\ No newline at end of file
diff --git a/mustache/daily/index.xml b/mustache/daily/index.xml
index 251226da257..858a68db260 100644
--- a/mustache/daily/index.xml
+++ b/mustache/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Mustache Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:07Z
+ 2023-10-11T01:35:02Z
Daily Trending of Mustache in GitHub
+
+ Bitcaster/helm-charts
+ 2023-10-11T01:35:02Z
+ tag:github.com,2023-10-11:/Bitcaster/helm-charts
+
+ <p>Forks of existent or own charts</p><hr>
+
\ No newline at end of file
diff --git a/myghty/daily/index.xml b/myghty/daily/index.xml
index 8afdb404a7e..f6980bdd797 100644
--- a/myghty/daily/index.xml
+++ b/myghty/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Myghty Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:03Z
+ 2023-10-11T01:34:58Z
Daily Trending of Myghty in GitHub
\ No newline at end of file
diff --git a/nanorc/daily/index.xml b/nanorc/daily/index.xml
index 541bcb1a3e1..f9a30256f1a 100644
--- a/nanorc/daily/index.xml
+++ b/nanorc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub nanorc Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:11Z
+ 2023-10-11T01:35:05Z
Daily Trending of nanorc in GitHub
\ No newline at end of file
diff --git a/nasl/daily/index.xml b/nasl/daily/index.xml
index e2caf811b6f..fd3c05fb7f6 100644
--- a/nasl/daily/index.xml
+++ b/nasl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub NASL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:09Z
+ 2023-10-11T01:35:03Z
Daily Trending of NASL in GitHub
\ No newline at end of file
diff --git a/ncl/daily/index.xml b/ncl/daily/index.xml
index 5892900443a..84677f2b263 100644
--- a/ncl/daily/index.xml
+++ b/ncl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub NCL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:10Z
+ 2023-10-11T01:35:06Z
Daily Trending of NCL in GitHub
\ No newline at end of file
diff --git a/nearley/daily/index.xml b/nearley/daily/index.xml
index 7fbb36a5ef7..2d95f524288 100644
--- a/nearley/daily/index.xml
+++ b/nearley/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Nearley Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:14Z
+ 2023-10-11T01:35:07Z
Daily Trending of Nearley in GitHub
\ No newline at end of file
diff --git a/nemerle/daily/index.xml b/nemerle/daily/index.xml
index 3d9ada6a9dc..f49ab34b13d 100644
--- a/nemerle/daily/index.xml
+++ b/nemerle/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Nemerle Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:13Z
+ 2023-10-11T01:35:10Z
Daily Trending of Nemerle in GitHub
\ No newline at end of file
diff --git a/neon/daily/index.xml b/neon/daily/index.xml
index 5f4d4eea921..26571139176 100644
--- a/neon/daily/index.xml
+++ b/neon/daily/index.xml
@@ -1,7 +1,7 @@
GitHub NEON Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:12Z
+ 2023-10-11T01:35:09Z
Daily Trending of NEON in GitHub
\ No newline at end of file
diff --git a/nesc/daily/index.xml b/nesc/daily/index.xml
index 9331e663fb6..0acd765c08b 100644
--- a/nesc/daily/index.xml
+++ b/nesc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub nesC Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:15Z
+ 2023-10-11T01:35:08Z
Daily Trending of nesC in GitHub
\ No newline at end of file
diff --git a/netlinx+erb/daily/index.xml b/netlinx+erb/daily/index.xml
index a85ca8ef4a3..8930f487740 100644
--- a/netlinx+erb/daily/index.xml
+++ b/netlinx+erb/daily/index.xml
@@ -1,7 +1,7 @@
GitHub NetLinx+ERB Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:16Z
+ 2023-10-11T01:35:12Z
Daily Trending of NetLinx+ERB in GitHub
\ No newline at end of file
diff --git a/netlinx/daily/index.xml b/netlinx/daily/index.xml
index 17a7a572c6e..5734d7018fa 100644
--- a/netlinx/daily/index.xml
+++ b/netlinx/daily/index.xml
@@ -1,7 +1,7 @@
GitHub NetLinx Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:19Z
+ 2023-10-11T01:35:11Z
Daily Trending of NetLinx in GitHub
\ No newline at end of file
diff --git a/netlogo/daily/index.xml b/netlogo/daily/index.xml
index ae36964024e..f10127a50bf 100644
--- a/netlogo/daily/index.xml
+++ b/netlogo/daily/index.xml
@@ -1,7 +1,7 @@
GitHub NetLogo Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:18Z
+ 2023-10-11T01:35:13Z
Daily Trending of NetLogo in GitHub
\ No newline at end of file
diff --git a/newlisp/daily/index.xml b/newlisp/daily/index.xml
index f87017b6c63..5a9cac1cc02 100644
--- a/newlisp/daily/index.xml
+++ b/newlisp/daily/index.xml
@@ -1,7 +1,7 @@
GitHub NewLisp Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:17Z
+ 2023-10-11T01:35:13Z
Daily Trending of NewLisp in GitHub
\ No newline at end of file
diff --git a/nextflow/daily/index.xml b/nextflow/daily/index.xml
index 81f71702883..aab68e176b3 100644
--- a/nextflow/daily/index.xml
+++ b/nextflow/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Nextflow Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:21Z
+ 2023-10-11T01:35:18Z
Daily Trending of Nextflow in GitHub
\ No newline at end of file
diff --git a/nginx/daily/index.xml b/nginx/daily/index.xml
index cfde9497143..a955a7a9bef 100644
--- a/nginx/daily/index.xml
+++ b/nginx/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Nginx Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:22Z
+ 2023-10-11T01:35:15Z
Daily Trending of Nginx in GitHub
\ No newline at end of file
diff --git a/nim/daily/index.xml b/nim/daily/index.xml
index 1b6fe1c1b00..fba5b0e667b 100644
--- a/nim/daily/index.xml
+++ b/nim/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Nim Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:23Z
+ 2023-10-11T01:35:17Z
Daily Trending of Nim in GitHub
\ No newline at end of file
diff --git a/ninja/daily/index.xml b/ninja/daily/index.xml
index c179596415b..7608c530e6d 100644
--- a/ninja/daily/index.xml
+++ b/ninja/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Ninja Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:20Z
+ 2023-10-11T01:35:15Z
Daily Trending of Ninja in GitHub
\ No newline at end of file
diff --git a/nit/daily/index.xml b/nit/daily/index.xml
index 52d659cf60c..a7234011a1a 100644
--- a/nit/daily/index.xml
+++ b/nit/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Nit Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:25Z
+ 2023-10-11T01:35:19Z
Daily Trending of Nit in GitHub
\ No newline at end of file
diff --git a/nix/daily/index.xml b/nix/daily/index.xml
index ead8a4bf258..42f628ac163 100644
--- a/nix/daily/index.xml
+++ b/nix/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Nix Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:29Z
+ 2023-10-11T01:35:22Z
Daily Trending of Nix in GitHub
\ No newline at end of file
diff --git a/nl/daily/index.xml b/nl/daily/index.xml
index e3aa7ce5668..5557adbf39d 100644
--- a/nl/daily/index.xml
+++ b/nl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub NL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:26Z
+ 2023-10-11T01:35:20Z
Daily Trending of NL in GitHub
\ No newline at end of file
diff --git a/npm-config/daily/index.xml b/npm-config/daily/index.xml
index d1cc85f7bbf..62005ae6939 100644
--- a/npm-config/daily/index.xml
+++ b/npm-config/daily/index.xml
@@ -1,7 +1,7 @@
GitHub NPM Config Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:25Z
+ 2023-10-11T01:35:20Z
Daily Trending of NPM Config in GitHub
\ No newline at end of file
diff --git a/nsis/daily/index.xml b/nsis/daily/index.xml
index 984b15903f8..46926878df1 100644
--- a/nsis/daily/index.xml
+++ b/nsis/daily/index.xml
@@ -1,7 +1,7 @@
GitHub NSIS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:34Z
+ 2023-10-11T01:35:27Z
Daily Trending of NSIS in GitHub
\ No newline at end of file
diff --git a/nu/daily/index.xml b/nu/daily/index.xml
index 37eecee20c8..a1e7623d41b 100644
--- a/nu/daily/index.xml
+++ b/nu/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Nu Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:30Z
+ 2023-10-11T01:35:25Z
Daily Trending of Nu in GitHub
\ No newline at end of file
diff --git a/numpy/daily/index.xml b/numpy/daily/index.xml
index d633f10ca7f..3edd8a892ea 100644
--- a/numpy/daily/index.xml
+++ b/numpy/daily/index.xml
@@ -1,7 +1,7 @@
GitHub NumPy Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:33Z
+ 2023-10-11T01:35:26Z
Daily Trending of NumPy in GitHub
\ No newline at end of file
diff --git a/nunjucks/daily/index.xml b/nunjucks/daily/index.xml
index c98684bca22..322dfcff0e5 100644
--- a/nunjucks/daily/index.xml
+++ b/nunjucks/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Nunjucks Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:32Z
+ 2023-10-11T01:35:24Z
Daily Trending of Nunjucks in GitHub
\ No newline at end of file
diff --git a/nwscript/daily/index.xml b/nwscript/daily/index.xml
index 89965975c39..7b6fb98bc75 100644
--- a/nwscript/daily/index.xml
+++ b/nwscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub NWScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:36Z
+ 2023-10-11T01:35:29Z
Daily Trending of NWScript in GitHub
\ No newline at end of file
diff --git a/objdump/daily/index.xml b/objdump/daily/index.xml
index bd0d27a935b..364a80435cb 100644
--- a/objdump/daily/index.xml
+++ b/objdump/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ObjDump Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:39Z
+ 2023-10-11T01:35:33Z
Daily Trending of ObjDump in GitHub
\ No newline at end of file
diff --git a/object-data-instance-notation/daily/index.xml b/object-data-instance-notation/daily/index.xml
index db7db9d7950..174e01e8b12 100644
--- a/object-data-instance-notation/daily/index.xml
+++ b/object-data-instance-notation/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Object Data Instance Notation Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:40Z
+ 2023-10-11T01:35:32Z
Daily Trending of Object Data Instance Notation in GitHub
\ No newline at end of file
diff --git a/objective-c++/daily/index.xml b/objective-c++/daily/index.xml
index 74d758f5708..55b664160c1 100644
--- a/objective-c++/daily/index.xml
+++ b/objective-c++/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Objective-C++ Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:49Z
+ 2023-10-11T01:35:37Z
Daily Trending of Objective-C++ in GitHub
\ No newline at end of file
diff --git a/objective-c/daily/index.xml b/objective-c/daily/index.xml
index 10283224e5c..a165fbade16 100644
--- a/objective-c/daily/index.xml
+++ b/objective-c/daily/index.xml
@@ -1,21 +1,21 @@
GitHub Objective-C Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:49Z
+ 2023-10-11T01:35:40Z
Daily Trending of Objective-C in GitHub
- profmaad/librabbitmq-objc
- 2023-10-10T01:35:49Z
- tag:github.com,2023-10-10:/profmaad/librabbitmq-objc
-
- <p>Objective-C wrapper for librabbitmq-c</p><hr><h1>librabbitmq-objc: Objective-C wrapper for librabbitmq-c</h1>
<h2>Description</h2>
<p>This is a simple Objective-C wrapper for librabbitmq-c, a C AMQP library from the people developing the RabbitMQ AMQP server.</p>
<h2>Requirements</h2>
<ul>
<li>Cocoa</li>
<li>librabbitmq-c including headers</li>
</ul>
<h2>Build</h2>
<p>There is nothing to build. Just include the source and header files into your Xcode project and link it againt librabbitmq-c.</p>
<h2>Usage</h2>
<ul>
<li> <p>Establish a connection the server using <code>AMQPConnection</code></p> </li>
<li> <p>Open a communication channel using <code>AMQPConnection - (AMQPChannel*)openChannel</code></p> </li>
<li> <p>Create queues using <code>AMQPQueue</code> or exchanges using <code>AMQPExchange</code></p> </li>
<li> <p>Connect queues to exchanges using <code>AMQPQueue</code>:</p> <pre><code> - (void)bindToExchange:(AMQPExchange*)theExchange
withKey:(NSString*)bindingKey
</code></pre> </li>
<li> <p>To receive messages, use an <code>AMQPConsumer</code> bound to a queue:</p> <pre><code> - (id)initForQueue:(AMQPQueue*)theQueue
onChannel:(AMQPChannel*)theChannel
useAcknowledgements:(BOOL)ack
isExclusive:(BOOL)exclusive
receiveLocalMessages:(BOOL)local
</code></pre> </li>
<li> <p>For ease of use, there is a complete threaded consumer implementation at <code>AMQPConsumerThread</code> using a <code>AMQPConsumerThreadDelegate</code> to handle received messages</p> </li>
<li> <p>To publish messages on an exchange, use <code>AMQPExchange</code>:</p> <pre><code> - (void)publishMessage:(NSString*)body
usingRoutingKey:(NSString*)theRoutingKey
</code></pre> </li>
</ul>
<h2>License</h2>
<p>Copyright (C) 2014 <em>Prof. MAAD</em> aka Max Wolter librabbitmq-objc is released under the terms of the GNU Lesser General Public License Version 3.</p>
<p>This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p>
<p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</p>
<p>You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.</p>
+ zendesk/answer_bot_providers_sdk_ios
+ 2023-10-11T01:35:40Z
+ tag:github.com,2023-10-11:/zendesk/answer_bot_providers_sdk_ios
+
+ <p>Zendesk Answer Bot Providers SDK</p><hr><p><span>⚠</span> <em>Use of this software is subject to important terms and conditions as set forth in the License file</em> <span>⚠</span></p>
<h1>Zendesk Answer Bot Providers SDK for iOS</h1>
<p>Zendesk Answer Bot Providers SDK for mobile. The Answer Bot Providers SDK is a wrapper for the Anwer Bot API. Build own UI on top of the Zendesk's Machine learning ticket deflection bot.</p>
<h2>Documentation</h2>
<p>You can find our documentation on <a href="https://developer.zendesk.com/embeddables">https://developer.zendesk.com/embeddables</a>.</p>
<h2>Feature requests and issues</h2>
<p>All feature requests and issues are welcomed. Please see our <a href="https://raw.githubusercontent.com/zendesk/answer_bot_providers_sdk_ios/master/CONTRIBUTING.md">contributing guidelines</a> to find out how to contact us.</p>
<h2>Copyright and license</h2>
<p>Copyright 2020 Zendesk</p>
<p>By downloading or using the Zendesk Answer Bot Providers SDK, You agree to the Zendesk Master Subscription Agreement <a href="https://www.zendesk.com/company/customers-partners/#master-subscription-agreement">https://www.zendesk.com/company/customers-partners/#master-subscription-agreement</a> and Application Developer and API License Agreement <a href="https://www.zendesk.com/company/customers-partners/#application-developer-api-license-agreement">https://www.zendesk.com/company/customers-partners/#application-developer-api-license-agreement</a> and acknowledge that such terms govern Your use of and access to the Answer Bot Providers SDK.</p>
<p>If You make any Contributions (defined below) to the Zendesk Answer Bot Providers SDK, You hereby grant Zendesk a royalty-free, worldwide, transferable, sub-licensable, irrevocable and perpetual license to incorporate into the Service or the Zendesk API or otherwise use and commercially exploit any Contributions. “Contribution” shall mean any work of authorship, including any modifications or additions to the Mobile SDK or derivative works thereof, that is submitted to Zendesk by You.</p>
- JanX2/JXLS
- 2023-10-10T01:35:49Z
- tag:github.com,2023-10-10:/JanX2/JXLS
-
- <p>JXLS is an ObjC++ wrapper and framework for xlslib. xlslib is a C++/C library to construct Microsoft Excel™ .xls files in code.</p><hr><h1>JXLS</h1>
<p>JXLS is an ObjC++ wrapper and framework for xlslib. xlslib is a C++/C library to construct Microsoft Excel™ .xls files in code.</p>
<p>This Framework is based on the xlslib open source project and includes it as a git submodule.</p>
<p>To configure this project, you should</p>
<pre><code>git submodule update --init --recursive
</code></pre>
<p>after cloning from within your JXLS git repo.</p>
<p>The xlconfig.h file was produced by doing a "./bootstrap" inside the root xlslib folder - you can replace it with the same if you wish. This library has only been tested on 64-bit Intel as it uses ARC.</p>
<p>There is an Xcode project for building on iOS, but it is not actively maintained. If it doesn’t <em>just work</em> please fix and send a pull request!</p>
<h2>Updating</h2>
<p>If you have been using JXLS versions before 1.0, you will have to change your imports to the umbrella header used in 1.0+:</p>
<pre><code>#import <JXLS/JXLS.h>
</code></pre>
<h2>License</h2>
<p>UNLESS OTHERWISE SPECIFIED WITHIN THE FILES OR PROJECTS, ALL SOFTWARE ON THIS SITE IS SUBJECT TO THE FOLLOWING LICENSING CONDITIONS [BSD LICENSE]:</p>
<p>Copyright (c) 2008-2013 David Hoerl All rights reserved.</p>
<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
<p>• Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</p>
<p>• Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</p>
<p>• Neither the name of David Hoerl nor the names of other contributors may be used to endorse or promote products derived from this software without specific prior written permission.</p>
<p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
<h2>Usage</h2>
<p>You can integrate JXLS into your project via CocoaPods or manually as described below.</p>
<p>Add “JXLS.xcodeproj” to your project (preferably into “Frameworks” to keep things tidy).</p>
<p>###Xcode 4</p>
<p>In your target’s “Build Phases”:</p>
<ul>
<li>Add Build Phase (+-button pull-down menu) > Copy Files</li>
<li>Destination: Frameworks</li>
<li>Change name to “Copy Frameworks” to keep things clean</li>
</ul>
<p>###Xcode 5 or 6</p>
<p>In your target’s “Build Phases”:</p>
<ul>
<li>Editor (menu) > Add Build Phase > Add Copy Files Build Phase</li>
<li>Destination: Frameworks</li>
<li>Change name to “Copy Frameworks” to keep things clean</li>
</ul>
<p>###Both</p>
<p>Add “JXLS.framework” to the following build phases (via the +-buttons):</p>
<ul>
<li>“Target Dependencies”</li>
<li>“Link Binary With Libraries”</li>
<li>“Copy Frameworks” (created above)</li>
</ul>
<p>Set “Runpath Search Paths” to</p>
<pre><code>@loader_path/../Frameworks
</code></pre>
<p>in the “Build Settings” of your target or add</p>
<pre><code>LD_RUNPATH_SEARCH_PATHS = @loader_path/../Frameworks
</code></pre>
<p>to the respective <code>.xcconfig</code> file, if you use them.</p>
<p>And finally import the header in your code:</p>
<pre><code>#import <JXLS/JXLS.h>
</code></pre>
+ specta/expecta
+ 2023-10-11T01:35:40Z
+ tag:github.com,2023-10-11:/specta/expecta
+
+ <p>A Matcher Framework for Objective-C/Cocoa</p><hr><h1>Expecta <a href="https://travis-ci.org/specta/expecta"><img src="http://img.shields.io/travis/specta/expecta/master.svg?style=flat" alt="Build Status"></a> <a href="http://cocoadocs.org/docsets/Expecta/"><img src="http://img.shields.io/cocoapods/v/Expecta.svg?style=flat" alt="Pod Version"></a></h1>
<p>A matcher framework for Objective-C and Cocoa.</p>
<h2>FEATURES</h2>
<p>The main advantage of using Expecta over other matcher frameworks is that you do not have to specify the data types. Also, the syntax of Expecta matchers is much more readable and does not suffer from parenthesitis.</p>
<pre><code class="language-objective-c">expect(@"foo").to.equal(@"foo"); // `to` is a syntactic sugar and can be safely omitted.
expect(foo).notTo.equal(1);
expect([bar isBar]).to.equal(YES);
expect(baz).to.equal(3.14159);
</code></pre>
<p>Expecta is framework-agnostic: it works well with XCTest and XCTest-compatible test frameworks such as <a href="http://github.com/petejkim/specta/">Specta</a>, or <a href="https://github.com/kiwi-bdd/Kiwi/">Kiwi</a>.</p>
<h2>MATCHERS</h2>
<blockquote>
<p><code>expect(x).to.equal(y);</code> compares objects or primitives x and y and passes if they are identical (==) or equivalent isEqual:).</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beIdenticalTo(y);</code> compares objects x and y and passes if they are identical and have the same memory address.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beNil();</code> passes if x is nil.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beTruthy();</code> passes if x evaluates to true (non-zero).</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beFalsy();</code> passes if x evaluates to false (zero).</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.contain(y);</code> passes if an instance of NSArray or NSString x contains y.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beSupersetOf(y);</code> passes if an instance of NSArray, NSSet, NSDictionary or NSOrderedSet x contains all elements of y.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.haveCountOf(y);</code> passes if an instance of NSArray, NSSet, NSDictionary or NSString x has a count or length of y.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beEmpty();</code> passes if an instance of NSArray, NSSet, NSDictionary or NSString x has a count or length of .</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beInstanceOf([Foo class]);</code> passes if x is an instance of a class Foo.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beKindOf([Foo class]);</code> passes if x is an instance of a class Foo or if x is an instance of any class that inherits from the class Foo.</p>
</blockquote>
<blockquote>
<p><code>expect([Foo class]).to.beSubclassOf([Bar class]);</code> passes if the class Foo is a subclass of the class Bar or if it is identical to the class Bar. Use beKindOf() for class clusters.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beLessThan(y);</code> passes if <code>x</code> is less than <code>y</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beLessThanOrEqualTo(y);</code> passes if <code>x</code> is less than or equal to <code>y</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beGreaterThan(y);</code> passes if <code>x</code> is greater than <code>y</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beGreaterThanOrEqualTo(y);</code> passes if <code>x</code> is greater than or equal to <code>y</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beInTheRangeOf(y,z);</code> passes if <code>x</code> is in the range of <code>y</code> and <code>z</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beCloseTo(y);</code> passes if <code>x</code> is close to <code>y</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beCloseToWithin(y, z);</code> passes if <code>x</code> is close to <code>y</code> within <code>z</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(^{ /* code */ }).to.raise(@"ExceptionName");</code> passes if a given block of code raises an exception named <code>ExceptionName</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(^{ /* code */ }).to.raiseAny();</code> passes if a given block of code raises any exception.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.conformTo(y);</code> passes if <code>x</code> conforms to the protocol <code>y</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.respondTo(y);</code> passes if <code>x</code> responds to the selector <code>y</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(^{ /* code */ }).to.notify(@"NotificationName");</code> passes if a given block of code generates an NSNotification named <code>NotificationName</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(^{ /* code */ }).to.notify(notification);</code> passes if a given block of code generates an NSNotification equal to the passed <code>notification</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.beginWith(y);</code> passes if an instance of NSString, NSArray, or NSOrderedSet <code>x</code> begins with <code>y</code>. Also liased by <code>startWith</code></p>
</blockquote>
<blockquote>
<p><code>expect(x).to.endWith(y);</code> passes if an instance of NSString, NSArray, or NSOrderedSet <code>x</code> ends with <code>y</code>.</p>
</blockquote>
<blockquote>
<p><code>expect(x).to.match(y);</code> passes if an instance of NSString <code>x</code> matches regular expression (given as NSString) <code>y</code> one or more times.</p>
</blockquote>
<h3>Inverting Matchers</h3>
<p>Every matcher's criteria can be inverted by prepending <code>.notTo</code> or <code>.toNot</code>:</p>
<blockquote>
<p><code>expect(x).notTo.equal(y);</code> compares objects or primitives x and y and passes if they are <em>not</em> equivalent.</p>
</blockquote>
<h3>Asynchronous Testing</h3>
<p>Every matcher can be made to perform asynchronous testing by prepending <code>.will</code>, <code>.willNot</code> or <code>after(...)</code>:</p>
<blockquote>
<p><code>expect(x).will.beNil();</code> passes if x becomes nil before the default timeout.</p>
<p><code>expect(x).willNot.beNil();</code> passes if x becomes non-nil before the default timeout.</p>
<p><code>expect(x).after(3).to.beNil();</code> passes if x becoms nil after 3.0 seconds.</p>
<p><code>expect(x).after(2.5).notTo.equal(42);</code> passes if x doesn't equal 42 after 2.5 seconds.</p>
</blockquote>
<p>The default timeout is 1.0 second and is used for all matchers if not otherwise specified. This setting can be changed by calling <code>[Expecta setAsynchronousTestTimeout:x]</code>, where <code>x</code> is the desired timeout in seconds.</p>
<pre><code class="language-objective-c">describe(@"Foo", ^{
beforeAll(^{
// All asynchronous matching using `will` and `willNot`
// will have a timeout of 2.0 seconds
[Expecta setAsynchronousTestTimeout:2];
});
it(@"will not be nil", ^{
// Test case where default timeout is used
expect(foo).willNot.beNil();
});
it(@"should equal 42 after 3 seconds", ^{
// Signle case where timeout differs from the default
expect(foo).after(3).to.equal(42);
});
});
</code></pre>
<h3>Forced Failing</h3>
<p>You can fail a test by using the <code>failure</code> attribute. This can be used to test branching.</p>
<blockquote>
<p><code>failure(@"This should not happen");</code> outright fails a test.</p>
</blockquote>
<h3>WRITING NEW MATCHERS</h3>
<p>Writing a new matcher is easy with special macros provided by Expecta. Take a look at how <code>.beKindOf()</code> matcher is defined:</p>
<p><code>EXPMatchers+beKindOf.h</code></p>
<pre><code class="language-objective-c">#import "Expecta.h"
EXPMatcherInterface(beKindOf, (Class expected));
// 1st argument is the name of the matcher function
// 2nd argument is the list of arguments that may be passed in the function
// call.
// Multiple arguments are fine. (e.g. (int foo, float bar))
#define beAKindOf beKindOf
</code></pre>
<p><code>EXPMatchers+beKindOf.m</code></p>
<pre><code class="language-objective-c">#import "EXPMatchers+beKindOf.h"
EXPMatcherImplementationBegin(beKindOf, (Class expected)) {
BOOL actualIsNil = (actual == nil);
BOOL expectedIsNil = (expected == nil);
prerequisite(^BOOL {
return !(actualIsNil || expectedIsNil);
// Return `NO` if matcher should fail whether or not the result is inverted
// using `.Not`.
});
match(^BOOL {
return [actual isKindOfClass:expected];
// Return `YES` if the matcher should pass, `NO` if it should not.
// The actual value/object is passed as `actual`.
// Please note that primitive values will be wrapped in NSNumber/NSValue.
});
failureMessageForTo(^NSString * {
if (actualIsNil)
return @"the actual value is nil/null";
if (expectedIsNil)
return @"the expected value is nil/null";
return [NSString
stringWithFormat:@"expected: a kind of %@, "
"got: an instance of %@, which is not a kind of %@",
[expected class], [actual class], [expected class]];
// Return the message to be displayed when the match function returns `YES`.
});
failureMessageForNotTo(^NSString * {
if (actualIsNil)
return @"the actual value is nil/null";
if (expectedIsNil)
return @"the expected value is nil/null";
return [NSString
stringWithFormat:@"expected: not a kind of %@, "
"got: an instance of %@, which is a kind of %@",
[expected class], [actual class], [expected class]];
// Return the message to be displayed when the match function returns `NO`.
});
}
EXPMatcherImplementationEnd
</code></pre>
<h2>DYNAMIC PREDICATE MATCHERS</h2>
<p>It is possible to add predicate matchers by simply defining the matcher interface, with the matcher implementation being handled at runtime by delegating to the predicate method on your object.</p>
<p>For instance, if you have the following class:</p>
<pre><code class="language-objc">@interface LightSwitch : NSObject
@property (nonatomic, assign, getter=isTurnedOn) BOOL turnedOn;
@end
@implementation LightSwitch
@synthesize turnedOn;
@end
</code></pre>
<p>The normal way to write an assertion that the switch is turned on would be:</p>
<pre><code class="language-objc">expect([lightSwitch isTurnedOn]).to.beTruthy();
</code></pre>
<p>However, if we define a custom predicate matcher:</p>
<pre><code class="language-objc">EXPMatcherInterface(isTurnedOn, (void));
</code></pre>
<p>(Note: we haven't defined the matcher implementation, just it's interface)</p>
<p>You can now write your assertion as follows:</p>
<pre><code class="language-objc">expect(lightSwitch).isTurnedOn();
</code></pre>
<h2>INSTALLATION</h2>
<p>You can setup Expecta using <a href="http://github.com/CocoaPods/CocoaPods">CocoaPods</a>, <a href="https://github.com/Carthage/Carthage">Carthage</a> or <a href="https://raw.githubusercontent.com/specta/expecta/master/#setting-up-manually">completely manually</a>.</p>
<h3>CocoaPods</h3>
<ol>
<li>Add Expecta to your project's <code>Podfile</code>:</li>
</ol>
<pre><code class="language-ruby">target :MyApp do
# your app dependencies
target :MyAppTests do
inherit! search_paths
pod 'Expecta', '~> 1.0'
end
end
</code></pre>
<h3>Carthage</h3>
<ol>
<li> <p>Add Expecta to your project's <code>Cartfile.private</code>:</p> <pre><code class="language-ruby">github "specta/expecta" "master"
</code></pre> </li>
<li> <p>Run <code>carthage update</code> in your project directory.</p> </li>
<li> <p>Drag the appropriate <strong>Expecta.framework</strong> for your platform (located in <code>Carthage/Build/</code>) into your application’s Xcode project, and add it to your test target(s).</p> </li>
<li> <p>Run <code>pod update</code> or <code>pod install</code> in your project directory.</p> </li>
</ol>
<h3>Setting Up Manually</h3>
<ol>
<li> <p>Clone Expecta from Github.</p> </li>
<li> <p>Run <code>rake</code> in your project directory to build the frameworks and libraries.</p> </li>
<li> <p>Add a Cocoa or Cocoa Touch Unit Testing Bundle target to your Xcode project if you don't already have one.</p> </li>
<li> <p>For <strong>OS X projects</strong>, copy and add <code>Expecta.framework</code> in the <code>Products/osx</code> folder to your project's test target.</p> <p>For <strong>iOS projects</strong>, copy and add <code>Expecta.framework</code> in the <code>Products/ios</code> folder to your project's test target.</p> <p>You can also use <code>libExpecta.a</code> if you prefer to link Expecta as a static library — iOS 7.x and below require this.</p> </li>
<li> <p>Add <code>-ObjC</code> and <code>-all_load</code> to the <strong>Other Linker Flags</strong> build setting for the test target in your Xcode project.</p> </li>
<li> <p>You can now use Expecta in your test classes by adding the following import:</p> <pre><code class="language-objective-c">@import Expecta; // If you're using Expecta.framework
// OR
#import <Expecta/Expecta.h> // If you're using the static library, or the framework
</code></pre> </li>
</ol>
<h2>STATUS</h2>
<p>Expecta, and Specta are considered done projects, there are no plans for <em>active</em> development on the project at the moment aside from ensuring future Xcode compatability. Therefore it is a stable dependency, but will not be moving into the Swift world. If you are looking for that, we recommend you consider <a href="https://github.com/quick/quick">Quick</a> and <a href="https://github.com/quick/nimble">Nimble</a>.</p>
<h2>Contribution Guidelines</h2>
<ul>
<li>Please use only spaces and indent 2 spaces at a time.</li>
<li>Please prefix instance variable names with a single underscore (<code>_</code>).</li>
<li>Please prefix custom classes and functions defined in the global scope with <code>EXP</code>.</li>
</ul>
<h2>License</h2>
<p>Copyright (c) 2012-2016 <a href="https://github.com/specta?tab=members">Specta Team</a>. This software is licensed under the <a href="http://github.com/specta/specta/raw/master/LICENSE">MIT License</a>.</p>
\ No newline at end of file
diff --git a/objective-j/daily/index.xml b/objective-j/daily/index.xml
index 24715293b60..a0fdbb4c86c 100644
--- a/objective-j/daily/index.xml
+++ b/objective-j/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Objective-J Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:43Z
+ 2023-10-11T01:35:35Z
Daily Trending of Objective-J in GitHub
\ No newline at end of file
diff --git a/objectscript/daily/index.xml b/objectscript/daily/index.xml
index 140471b46a5..25276a80cc1 100644
--- a/objectscript/daily/index.xml
+++ b/objectscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ObjectScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:44Z
+ 2023-10-11T01:35:36Z
Daily Trending of ObjectScript in GitHub
\ No newline at end of file
diff --git a/ocaml/daily/index.xml b/ocaml/daily/index.xml
index aad881b7889..ce7d77c1443 100644
--- a/ocaml/daily/index.xml
+++ b/ocaml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub OCaml Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:03Z
+ 2023-10-11T01:35:54Z
Daily Trending of OCaml in GitHub
\ No newline at end of file
diff --git a/odin/daily/index.xml b/odin/daily/index.xml
index a22b4e9b308..1199b437988 100644
--- a/odin/daily/index.xml
+++ b/odin/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Odin Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:59Z
+ 2023-10-11T01:35:55Z
Daily Trending of Odin in GitHub
\ No newline at end of file
diff --git a/omgrofl/daily/index.xml b/omgrofl/daily/index.xml
index 9b15519af13..a7dcf48d8b9 100644
--- a/omgrofl/daily/index.xml
+++ b/omgrofl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Omgrofl Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:35:58Z
+ 2023-10-11T01:35:52Z
Daily Trending of Omgrofl in GitHub
\ No newline at end of file
diff --git a/ooc/daily/index.xml b/ooc/daily/index.xml
index 9b88459ca35..9e2cddeea29 100644
--- a/ooc/daily/index.xml
+++ b/ooc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ooc Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:00Z
+ 2023-10-11T01:35:51Z
Daily Trending of ooc in GitHub
\ No newline at end of file
diff --git a/opa/daily/index.xml b/opa/daily/index.xml
index e61202ffe37..a91ab3d00e3 100644
--- a/opa/daily/index.xml
+++ b/opa/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Opa Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:06Z
+ 2023-10-11T01:35:58Z
Daily Trending of Opa in GitHub
\ No newline at end of file
diff --git a/opal/daily/index.xml b/opal/daily/index.xml
index 9efa210b0a3..a2258cb6be0 100644
--- a/opal/daily/index.xml
+++ b/opal/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Opal Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:05Z
+ 2023-10-11T01:35:59Z
Daily Trending of Opal in GitHub
\ No newline at end of file
diff --git a/open-policy-agent/daily/index.xml b/open-policy-agent/daily/index.xml
index a2090d7870e..163bf361e7c 100644
--- a/open-policy-agent/daily/index.xml
+++ b/open-policy-agent/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Open Policy Agent Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:07Z
+ 2023-10-11T01:36:00Z
Daily Trending of Open Policy Agent in GitHub
\ No newline at end of file
diff --git a/opencl/daily/index.xml b/opencl/daily/index.xml
index c36cb37d274..7dfbf6b719a 100644
--- a/opencl/daily/index.xml
+++ b/opencl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub OpenCL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:09Z
+ 2023-10-11T01:36:03Z
Daily Trending of OpenCL in GitHub
\ No newline at end of file
diff --git a/openedge-abl/daily/index.xml b/openedge-abl/daily/index.xml
index 450390256cb..1881043323e 100644
--- a/openedge-abl/daily/index.xml
+++ b/openedge-abl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub OpenEdge ABL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:10Z
+ 2023-10-11T01:36:02Z
Daily Trending of OpenEdge ABL in GitHub
\ No newline at end of file
diff --git a/openqasm/daily/index.xml b/openqasm/daily/index.xml
index 505b804a8db..27882ebf2ae 100644
--- a/openqasm/daily/index.xml
+++ b/openqasm/daily/index.xml
@@ -1,7 +1,7 @@
GitHub OpenQASM Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:11Z
+ 2023-10-11T01:36:01Z
Daily Trending of OpenQASM in GitHub
\ No newline at end of file
diff --git a/openrc-runscript/daily/index.xml b/openrc-runscript/daily/index.xml
index 964c7b8cbdc..6afe500fe96 100644
--- a/openrc-runscript/daily/index.xml
+++ b/openrc-runscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub OpenRC runscript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:14Z
+ 2023-10-11T01:36:08Z
Daily Trending of OpenRC runscript in GitHub
\ No newline at end of file
diff --git a/openscad/daily/index.xml b/openscad/daily/index.xml
index cd71a8f9241..f650f434345 100644
--- a/openscad/daily/index.xml
+++ b/openscad/daily/index.xml
@@ -1,7 +1,7 @@
GitHub OpenSCAD Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:15Z
+ 2023-10-11T01:36:06Z
Daily Trending of OpenSCAD in GitHub
\ No newline at end of file
diff --git a/openstep-property-list/daily/index.xml b/openstep-property-list/daily/index.xml
index ffe5395dd36..50590cce813 100644
--- a/openstep-property-list/daily/index.xml
+++ b/openstep-property-list/daily/index.xml
@@ -1,7 +1,7 @@
GitHub OpenStep Property List Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:13Z
+ 2023-10-11T01:36:07Z
Daily Trending of OpenStep Property List in GitHub
\ No newline at end of file
diff --git a/opentype-feature-file/daily/index.xml b/opentype-feature-file/daily/index.xml
index 9d2f9c8d598..d3c3afbdb30 100644
--- a/opentype-feature-file/daily/index.xml
+++ b/opentype-feature-file/daily/index.xml
@@ -1,7 +1,7 @@
GitHub OpenType Feature File Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:12Z
+ 2023-10-11T01:36:05Z
Daily Trending of OpenType Feature File in GitHub
\ No newline at end of file
diff --git a/org/daily/index.xml b/org/daily/index.xml
index b99424f99eb..28c00d72b7f 100644
--- a/org/daily/index.xml
+++ b/org/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Org Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:18Z
+ 2023-10-11T01:36:12Z
Daily Trending of Org in GitHub
\ No newline at end of file
diff --git a/ox/daily/index.xml b/ox/daily/index.xml
index 48cd351f6d4..39ac5c72d76 100644
--- a/ox/daily/index.xml
+++ b/ox/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Ox Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:17Z
+ 2023-10-11T01:36:11Z
Daily Trending of Ox in GitHub
\ No newline at end of file
diff --git a/oxygene/daily/index.xml b/oxygene/daily/index.xml
index dceb4a1cd4b..b0fd92ab99d 100644
--- a/oxygene/daily/index.xml
+++ b/oxygene/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Oxygene Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:17Z
+ 2023-10-11T01:36:09Z
Daily Trending of Oxygene in GitHub
\ No newline at end of file
diff --git a/oz/daily/index.xml b/oz/daily/index.xml
index 524f5d8b322..31833a65733 100644
--- a/oz/daily/index.xml
+++ b/oz/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Oz Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:21Z
+ 2023-10-11T01:36:14Z
Daily Trending of Oz in GitHub
\ No newline at end of file
diff --git a/p4/daily/index.xml b/p4/daily/index.xml
index 641186e6f36..1c89fea411f 100644
--- a/p4/daily/index.xml
+++ b/p4/daily/index.xml
@@ -1,7 +1,7 @@
GitHub P4 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:22Z
+ 2023-10-11T01:36:13Z
Daily Trending of P4 in GitHub
\ No newline at end of file
diff --git a/pan/daily/index.xml b/pan/daily/index.xml
index f99a48c44fb..47abc5830f9 100644
--- a/pan/daily/index.xml
+++ b/pan/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Pan Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:20Z
+ 2023-10-11T01:36:15Z
Daily Trending of Pan in GitHub
\ No newline at end of file
diff --git a/papyrus/daily/index.xml b/papyrus/daily/index.xml
index 7e7b30a96b0..780ac6f38d2 100644
--- a/papyrus/daily/index.xml
+++ b/papyrus/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Papyrus Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:23Z
+ 2023-10-11T01:36:19Z
Daily Trending of Papyrus in GitHub
\ No newline at end of file
diff --git a/parrot-assembly/daily/index.xml b/parrot-assembly/daily/index.xml
index 57840cf41c1..5c6654a985e 100644
--- a/parrot-assembly/daily/index.xml
+++ b/parrot-assembly/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Parrot Assembly Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:25Z
+ 2023-10-11T01:36:20Z
Daily Trending of Parrot Assembly in GitHub
\ No newline at end of file
diff --git a/parrot-internal-representation/daily/index.xml b/parrot-internal-representation/daily/index.xml
index b650402f2ac..cc010c540ad 100644
--- a/parrot-internal-representation/daily/index.xml
+++ b/parrot-internal-representation/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Parrot Internal Representation Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:26Z
+ 2023-10-11T01:36:18Z
Daily Trending of Parrot Internal Representation in GitHub
\ No newline at end of file
diff --git a/parrot/daily/index.xml b/parrot/daily/index.xml
index 3feee162eb3..4323b5a6a81 100644
--- a/parrot/daily/index.xml
+++ b/parrot/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Parrot Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:24Z
+ 2023-10-11T01:36:17Z
Daily Trending of Parrot in GitHub
\ No newline at end of file
diff --git a/pascal/daily/index.xml b/pascal/daily/index.xml
index 17d18568670..85567a3e63d 100644
--- a/pascal/daily/index.xml
+++ b/pascal/daily/index.xml
@@ -1,14 +1,7 @@
GitHub Pascal Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:31Z
+ 2023-10-11T01:36:25Z
Daily Trending of Pascal in GitHub
-
- casamagalhaes/varejofacil-sdk-delphi
- 2023-10-10T01:36:31Z
- tag:github.com,2023-10-10:/casamagalhaes/varejofacil-sdk-delphi
-
- <p></p><hr>
-
\ No newline at end of file
diff --git a/pawn/daily/index.xml b/pawn/daily/index.xml
index b063386bb17..988595df08b 100644
--- a/pawn/daily/index.xml
+++ b/pawn/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Pawn Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:29Z
+ 2023-10-11T01:36:23Z
Daily Trending of Pawn in GitHub
\ No newline at end of file
diff --git a/peg.js/daily/index.xml b/peg.js/daily/index.xml
index f1f489c467d..5f26e442e01 100644
--- a/peg.js/daily/index.xml
+++ b/peg.js/daily/index.xml
@@ -1,7 +1,7 @@
GitHub PEG.js Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:27Z
+ 2023-10-11T01:36:21Z
Daily Trending of PEG.js in GitHub
\ No newline at end of file
diff --git a/pep8/daily/index.xml b/pep8/daily/index.xml
index ef5f52b3d33..b37c31935b0 100644
--- a/pep8/daily/index.xml
+++ b/pep8/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Pep8 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:33Z
+ 2023-10-11T01:36:27Z
Daily Trending of Pep8 in GitHub
\ No newline at end of file
diff --git a/perl/daily/index.xml b/perl/daily/index.xml
index 58a45be0f9b..e9d332d29c2 100644
--- a/perl/daily/index.xml
+++ b/perl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Perl Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:48Z
+ 2023-10-11T01:36:38Z
Daily Trending of Perl in GitHub
\ No newline at end of file
diff --git a/php/daily/index.xml b/php/daily/index.xml
index fd47d64dc93..a515ad74cad 100644
--- a/php/daily/index.xml
+++ b/php/daily/index.xml
@@ -1,21 +1,7 @@
GitHub PHP Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:40Z
+ 2023-10-11T01:36:33Z
Daily Trending of PHP in GitHub
-
- shopware/shopware
- 2023-10-10T01:36:40Z
- tag:github.com,2023-10-10:/shopware/shopware
-
- <p>Shopware 6 is an open commerce platform based on Symfony Framework and Vue and supported by a worldwide community and more than 1.500 community extensions</p><hr><div align="center">
<p><a href="https://github.com/shopware/platform/actions"><img src="https://github.com/shopware/platform/workflows/PHPUnit/badge.svg?sanitize=true" alt="Build Status"></a> <a href="https://scrutinizer-ci.com/g/shopware/platform/"><img src="https://scrutinizer-ci.com/g/shopware/platform/badges/quality-score.png" alt="Scrutinizer Code Quality"></a> <a href="https://packagist.org/packages/shopware/platform"><img src="https://poser.pugx.org/shopware/platform/v/stable" alt="Latest Stable Version"></a> <a href="https://packagist.org/packages/shopware/platform"><img src="https://poser.pugx.org/shopware/platform/downloads" alt="Total Downloads"></a> <a href="https://translate.shopware.com/project/shopware6"><img src="https://badges.crowdin.net/shopware6/localized.svg?sanitize=true" alt="Crowdin"></a> <a href="https://github.com/shopware/platform/raw/trunk/LICENSE"><img src="https://img.shields.io/github/license/shopware/platform.svg?sanitize=true" alt="License"></a> <a href="https://github.com/shopware/platform/pulls"><img src="https://img.shields.io/github/issues-pr-closed/shopware/platform.svg?sanitize=true" alt="GitHub closed pull requests"></a> <a href="https://slack.shopware.com?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge"><img src="https://img.shields.io/badge/chat-on%20slack-%23ECB22E" alt="Slack"></a></p>
</div>
<p align="center"><a href="https://shopware.com" target="_blank" rel="noopener noreferrer"><img width="250" src="https://images.ctfassets.net/nqzs8zsepqpi/34zKqvPxTYtsQppJpgC9It/3b6901d9ba7082d5b4081d7171b268bf/composable-customer-experience-illustration.png"></a></p>
<h1 align="center">Shopware</h1>
<p align="center"><strong>Modern open source e-Commerce</strong> </p>
<p><a href="https://twitter.com/intent/tweet?text=Start%20your%20dev%20journey%20now!&url=https%3A%2F%2Fgithub.com%2Fshopware%2Fplatform&via=ShopwareDevs&hashtags=Shopware6,community"><img src="https://img.shields.io/twitter/url/http/shields.io.svg?style=social" alt="Tweet"></a></p>
<p></p>
<p>Shopware 6 is an open headless commerce platform powered by <a href="https://symfony.com">Symfony 6.2</a> and <a href="https://vuejs.org">Vue.js 2.6</a> that is used by thousands of shops and supported by a huge worldwide community of developers, agencies and merchants.</p>
<p>If you like Shopware 6, give us a ⭐️ on Github</p>
<ul>
<li>🙋♂️ <a href="https://www.shopware.com/en/jobs/">Be part of shopware!</a> We are hiring! 🙋</li>
<li>🌎 Discover our <a href="https://www.shopware.com/en/">website</a></li>
<li>🧩 Browse more than <a href="https://store.shopware.com">2.000 apps</a> that are already available</li>
<li>📖 Learn how to <a href="https://developer.shopware.com/docs/">develop apps</a> and everything else about the tech behind shopware</li>
<li>🉐 <a href="https://translate.shopware.com">Translate</a> Shopware or help by contributing to existing languages</li>
<li>👍 Follow us on <a href="https://twitter.com/shopwaredevs">Twitter</a> to get updates</li>
<li>🛠 <a href="https://issues.shopware.com">Report bugs or add feature ideas</a> in our issue tracker</li>
<li>🗨 Help and get helped in our - <a href="https://forum.shopware.com/">Community forum</a></li>
<li>👪 Exchange with more than 5.000 shopware developers in our - <a href="https://slack.shopware.com">Slack</a></li>
<li>🕹 <a href="https://www.shopware.com/de/download/">Download Shopware</a> or start playing with <a href="https://github.com/dockware/dockware">Dockware</a></li>
</ul>
<h2>Table of contents</h2>
<ul>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#open-commerce-platform">Open Commerce Platform</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#business-model-composer">Business Model Composer</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#composable-customer-experience">Composable Customer Experience</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#under-the-hood">Under the hood</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#extension-system">Extension-system</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#Demo">Demo</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#Technology">Technology</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#shopware-6-repository-structure">Repository structure</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#quickstart--installation">Installation</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#roadmap">Roadmap</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#our-community-is-our-strongest-asset">Community</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#ecosystem">Ecosystem</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#contribution">Contribution</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#license">License</a></li>
<li><a href="https://raw.githubusercontent.com/shopware/shopware/trunk/#authors">Authors</a></li>
</ul>
<h2>Open Commerce platform</h2>
<p><strong>We are always open, you are always free</strong></p>
<p>With Shopware you control your destiny. Always having access to the source, you own it. No lock-ins, no compromises, no limits. <strong>Your freedom to grow.</strong></p>
<p>Open commerce empowers you to seize the collective force of our community and partnerships. You benefit from a worldwide network of established developers, looking into the future of ecommerce and continuously advancing the platform in order to meet the latest market developments. It is exactly this focus that makes the difference and enables our merchants to grow strongly and sustainably in the ever-evolving world of digital commerce.</p>
<p><img src="https://images.ctfassets.net/nqzs8zsepqpi/6L9YIBLLZ5cOdUSDmgcER/234366961af834327d17621c26ede892/open-commerce-platform-mood-image.png"></p>
<p><img src="https://assets.shopware.com/media/icons/marketing/blue/headless-api-first.svg?sanitize=true" width="32" align="left"> <strong>Innovative and future-oriented: Open, headless, API-first, cloud & self-managed</strong><br><br> <img src="https://assets.shopware.com/media/icons/marketing/blue/seamless-integration-system-landscape.svg?sanitize=true" width="32" align="left"> <strong>Seamless integration into your system landscape</strong><br><br> <img src="https://assets.shopware.com/media/icons/marketing/blue/open-established-technologies.svg?sanitize=true" width="32" align="left"> <strong>Established technologies such as Symfony and vue.js</strong></p>
<hr>
<h2>Business Model Composer</h2>
<h3>Plug and play your business model:</h3>
<img src="https://images.ctfassets.net/nqzs8zsepqpi/nmbB4kx2XgV9gIJtkVWI6/6c3f14eb022b54d980a10be703fd4710/business-model-composer-illustration.png">
<p> Adapt fast and test various business models on-time: Digital events, subscription services, consultations, and highly customisable goods – whether to buy or to rent. There are no limits to the power of human imagination. Dare to dream, we'll make it happen! </p>
<img src="https://images.ctfassets.net/nqzs8zsepqpi/2fzpK9THpmhh285950bwPl/8d018b21e1173cafb767a8120e2d9b8b/flowbuilder.svg?sanitize=true">
<h4>The Flow-builder makes the implementation of business processes easy</h4>
<img src="https://images.ctfassets.net/nqzs8zsepqpi/5WUwOmbBzXKujLraK02eAp/a0e208a7df0d5517df419be279578dc0/flow-builder-intro-illustration.svg?sanitize=true">
<p><img src="https://assets.shopware.com/media/icons/marketing/blue/business-models-on-time.svg?sanitize=true" width="32" align="left"> <strong>Run different business models on-time with one solution</strong> <br></p>
<p><img src="https://assets.shopware.com/media/icons/marketing/blue/unique-business-flow.svg?sanitize=true" width="32" align="left"> <strong>Compose your unique business flow with no-code/low-code</strong><br></p>
<p><img src="https://assets.shopware.com/media/icons/marketing/blue/rules-and-pioneer.svg?sanitize=true" width="32" align="left"> <strong>Set your own rules and pioneer into new territory</strong><br></p>
<h2>Composable Customer Experience</h2>
<p align="center"><img src="https://images.ctfassets.net/nqzs8zsepqpi/2mI5yTktojiFqNsB66pCsA/752bbd8eddb1b2d587d43d4cec09ffa7/composable-customer-experience-illustration.png" width="500" align="center"></p>
<br>
<h3>Engage your customers across all channels with the perfect harmony of content and commerce</h3>
<br>
<p><a href="https://s3.eu-central-1.amazonaws.com/shopware-platform-assets/github-platform/readme/shoppingexp.gif"><img src="https://s3.eu-central-1.amazonaws.com/shopware-platform-assets/github-platform/readme/shoppingexp.gif" alt=""></a></p>
<p><a href="https://s3.eu-central-1.amazonaws.com/shopware-platform-assets/github-platform/readme/cms.gif"><img src="https://s3.eu-central-1.amazonaws.com/shopware-platform-assets/github-platform/readme/cms.gif" alt=""></a></p>
<p><strong>Designing content is fast and intuitive with the Shopping Experiences.</strong></p>
<p><img src="https://assets.shopware.com/media/icons/marketing/blue/seamless-integration-content-and-commerce.svg?sanitize=true" width="32" align="left"> <strong>Strengthen your brand ID with our flawless integration of content and commerce</strong> <br></p>
<p><img src="https://assets.shopware.com/media/icons/marketing/blue/touchpoints-into-trust-points.svg?sanitize=true" width="32" align="left"> <strong>Convert casual touch-points into fundamental trust-points</strong><br></p>
<p><img src="https://assets.shopware.com/media/icons/marketing/blue/pwa.svg?sanitize=true" width="32" align="left"> <strong>Fly high and create the next-level user experience with Shopware's PWA</strong><br></p>
<h2>Under the hood</h2>
<p>The build-in <strong>Shopware 6 Storefront</strong> is based on <a href="https://twig.symfony.com/doc/3.x/templates.html">Twig</a> and <a href="https://getbootstrap.com/docs/5.2/getting-started/introduction/">Bootstrap</a>. Two well known and easy to learn frameworks, making the creation of templates a breeze and bringing many advantages for merchants & developers:</p>
<ul>
<li>Lightweight and fast storefront</li>
<li>Works perfectly on all end devices</li>
<li>Reduced costs & effort required to make customisations, thanks to being built upon basic code & development standards that can be easily and widely used</li>
<li>Flexible basis for creating your own custom themes</li>
<li>Clear product presentation – filter according to properties and variants</li>
<li>Numerous sorting options for product lists in the storefront</li>
<li>Customer ratings can be handled conveniently in the administration and easily published in the storefront</li>
</ul>
<p><a href="https://s3.eu-central-1.amazonaws.com/shopware-platform-assets/github-platform/readme/storefront.png"><img src="https://s3.eu-central-1.amazonaws.com/shopware-platform-assets/github-platform/readme/storefrontT.png" alt=""></a></p>
<p>Together with our friends of <a href="https://github.com/vuestorefront">VueStorefront</a> we also provide an open source PWA frontend called <a href="https://github.com/vuestorefront/shopware-pwa"><strong>"Shopware PWA"</strong></a>:<br></p>
<p><strong>What makes Shopware PWA unique:</strong></p>
<ul>
<li>Quick integration & drop-in replacement for standard storefront</li>
<li>Unrestricted creativity for frontend developers</li>
<li>Modern tech-stack</li>
<li>Made for enterprise-level complexity</li>
</ul>
<div align="center">
<img align="center" src="https://images.ctfassets.net/nqzs8zsepqpi/6raZzvIPlRGUhSZGMpKg4F/c6f3d96d223c886f0134baf5069bea80/shopware-pwa-framework.svg?sanitize=true">
</div>
<hr>
<p>The <strong>Shopware 6 Administration</strong> is based on <a href="https://vuejs.org/v2/guide/">Vue.js</a> and <a href="https://github.com/twigjs/twig.js/wiki">twig.js</a>, making the creation of new modules fast and easy. Get started with the <a href="https://shopware.design/">design documentation</a>.</p>
<p><a href="https://s3.eu-central-1.amazonaws.com/shopware-platform-assets/github-platform/readme/rulebuilder.gif"><img src="https://s3.eu-central-1.amazonaws.com/shopware-platform-assets/github-platform/readme/rulebuilder.gif" alt=""></a></p>
<h2>Extension-system</h2>
<p>Shopware 6 is a lean and extremely flexible product that can be easily adapted to meet your requirements – and the Plugin Manager is your command centre for managing the apps and themes added to your shop. Using this module, you can install, purchase, update or delete apps.</p>
<img src="https://images.ctfassets.net/nqzs8zsepqpi/37KEQR5sgxpBlar7Q5PyGL/6f638937957a6eefeca74af83b28d5ba/EN-Plugin_Manager_Updates-190520.png">
<br>
<br>
<p align="center"> <img src="https://ecommerce.shopware.com/hubfs/21-T1-App-Development-Keyvisual.svg?sanitize=true" width="250" align="center"> </p>
<p>You can <em>easily</em> build your own apps and extensions by following our <a href="https://developer.shopware.com/docs/guides/plugins">developer documentation</a></p>
<p></p>
<br>
<br>
<hr>
<h2>Demo</h2>
<p>You can easily setup shopware by:</p>
<ul>
<li><a href="https://www.shopware.com/en/download/#shopware-6">Download</a> shopware and run it on your server</li>
<li>using <a href="https://dockware.io/">Dockware</a></li>
<li>or simply setup a <a href="https://www.shopware.com/en/download/#create-onlineshop">cloud shop</a> and tryout everything</li>
</ul>
<h2>Technology</h2>
<p>Shopware 6 uses Symfony as the standard framework, while the administration is completely based on Vue.js. In relying on technological standards, we’ve made it even easier to work with Shopware – while reducing dependency on specialised knowledge. Our goal is to make it as comfortable as possible to get started with Shopware by providing you with various resources, completely free of charge.</p>
<h3>API First</h3>
<p>We want commerce to take place where people are; independent of place, time and end device. Following to the API-first approach, Shopware 6 provides retailers with the technological foundation to effortlessly build retail strategies across channels and devices.</p>
<p><img src="https://s3.eu-central-1.amazonaws.com/shopware-platform-assets/github-platform/readme/platformcontext.svg?sanitize=true" alt="The core architecture"></p>
<p>The chart shows how the Shopware Platform fits into your enterprise. It provides web frontends for management and for commerce through a multitude of sales channels. It comes with a set of user facing interfaces and provides the ability to connect to your own infrastructure and outside services through REST-APIs.</p>
<p>More information can be found <a href="https://developer.shopware.com/docs/concepts/api">in the documentation</a>.</p>
<h2>Shopware 6 repository structure</h2>
<p>Shopware 6 consists of multiple repositories, two of them are important to you:</p>
<ul>
<li><code>shopware/platform</code> is a <a href="https://www.atlassian.com/git/tutorials/monorepos">mono repository</a>
<ul>
<li>This is where the shopware core is developed. You need it as dependency in your projects</li>
<li>This is where you can participate in the development of Shopware through pull requests</li>
<li>It's split into multiple repositories for production setups, all read-only</li>
</ul> </li>
<li>A template based on Symfony flex, which you can use to start your own project
<ul>
<li><strong>This is where your journey with shopware starts</strong></li>
<li>Installation see below!</li>
</ul> </li>
</ul>
<h2>Quickstart / Installation</h2>
<p>A full installation guide covering different dev environments is available in the <a href="https://developer.shopware.com/docs/guides/installation">docs</a>.</p>
<p><em>For the impatient reader, here is a tl;dr using docker and symfony cli.</em></p>
<p>Let's start by creating a new project:</p>
<pre><code class="language-bash">> composer create-project shopware/production:dev-flex project
</code></pre>
<p>You now have the application template for the Shopware Platform in the directory <code>project</code>, we now change into it:</p>
<pre><code class="language-bash">> cd project
</code></pre>
<p>Now we start our service containers:</p>
<pre><code class="language-bash">> docker compose up -d
</code></pre>
<p>And install Shopware with the following command:</p>
<pre><code class="language-bash">symfony console system:install --basic-setup --drop-database --create-database -f
</code></pre>
<p>Start the webserver:</p>
<pre><code class="language-bash">symfony server:start -d
</code></pre>
<p>To be sure that the installation succeeded, just open the following URL in your favorite browser: <a href="http://localhost:8000/">localhost:8000</a></p>
<p><a href="https://developer.shopware.com/docs/guides/plugins/plugins/plugin-base-guide">Now you're all set to start developing your first plugin.</a></p>
<h2>Roadmap</h2>
<h3>You make the roadmap!</h3>
<p>Shopware 6 will continue to evolve together with you and your feedback. This is our number one priority!</p>
<p>With openness as one of our core values, we will always provide you with a transparent overview of our product development. The Shopware Roadmap shows you what we are working on, what we want to tackle next, and what visions we have for the future.</p>
<p><a href="https://shopware.com/en/roadmap/">Take a look at the current roadmap here.</a></p>
<h2>Our community is our strongest asset</h2>
<p>In today’s information-based world, you cannot thrive in closed systems. Black boxes and vendor lock-in models hurt innovation – and belong in the dark ages of ecommerce.</p>
<p>The future of IT is all about collaboration. At Shopware, we believe that the best ecommerce solution can only be developed in constant exchange with the people that use it every day. This is why we made a clear promise to the open source approach and embrace everyone willing to participate. We consider our community to be our greatest strength; not our competitor, like many companies tend to do.</p>
<p>We believe that our open source edition is our strongest asset and that we need, now more than ever, to invest in our ecosystem of partners and developers. So that we can work together to collaborate across backgrounds, experiences and ideas and mutually benefit from the software that results.</p>
<p><strong>Join the community now</strong> 🖤</p>
<ul>
<li><strong>Discuss:</strong> <a href="https://forum.shopware.com/categories/international">forum.shopware.com</a></li>
<li><strong>Slack:</strong> <a href="https://slack.shopware.com">slack.shopware.com</a></li>
<li><strong>Follow us on Twitter:</strong> <a href="https://twitter.com/ShopwareDevs">@ShopwareDevs</a></li>
</ul>
<p>Subscribe to our <strong><a href="https://www.shopware.com/en/community/developers/#newsletter">developer newsletter</a></strong> and get updates about:</p>
<ul>
<li>Releases</li>
<li>Upcoming breaking changes</li>
<li>Important documentation changes and updates</li>
<li>Community events</li>
<li>Relevant blog articles</li>
</ul>
<p><a href="https://www.shopware.com/en/community/developers/#newsletter">Subscribe now</a></p>
<h3>Give us feedback</h3>
<table>
<tbody>
<tr>
<td width="250"><img src="https://s3.eu-central-1.amazonaws.com/shopware-platform-assets/github-platform/readme/mnaczenski.png"></td>
<td> <strong>Moritz Naczenski</strong><br> Community Manager<br> Twitter: <a href="https://twitter.com/m_naczenski">@m_naczenski</a> </td>
<td width="250"><img src="https://s3.eu-central-1.amazonaws.com/shopware-platform-assets/github-platform/readme/ndzoesch.png"></td>
<td> <strong>Niklas Dzösch</strong><br> Developer Evangelist<br> <a href="mailto:developer@shopware.com">developer@shopware.com</a><br> Twitter: <a href="https://twitter.com/ndzoesch">@ndzoesch</a> </td>
</tr>
</tbody>
</table>
<h2>Ecosystem</h2>
<p>Our Shopware Ecosystem gives you all the information you need to dive deep into the Shopware universe.</p>
<h3>Shopware Community Store</h3>
<p>Whether plugin, theme or marketing tool: You can easily extend the functionality of your shop with over 1,500 available apps and extensions in the Community Store.</p>
<p><a href="https://store.shopware.com">store.shopware.com</a></p>
<h3>Academy</h3>
<p>Do you want to become a Shopware expert or get a sneak peek into the software? Find a training session that is individually tailored to your interests.</p>
<p><a href="https://www.shopware.com/academy/">shopware.com/academy/</a></p>
<h2>Contribution</h2>
<p>First of all - Every contribution is meaningful, so thank you for participating.</p>
<p>You want to participate in the development of Shopware? There are many ways to contribute:</p>
<ul>
<li>Submitting pull requests</li>
<li>Reporting issues on the <a href="https://issues.shopware.com/">issue tracker</a></li>
<li>Discuss shopware on e.g <a href="https://slack.shopware.com">Slack</a> or our <a href="https://forum.shopware.com/categories/shopware-6">forum</a></li>
<li>Write a translation for shopware on <a href="https://translate.shopware.com">crowdin</a></li>
</ul>
<p>You have a question regarding contribution, or you want to contribute in another way?</p>
<p>Please write us an email: <a href="mailto:contributors@shopware.com">contributors@shopware.com</a></p>
<h3>Installation of Shopware for contributors</h3>
<p>The installation process is slightly different for working on the platform. It's not necessary to create a new project and install the platform as a dependency. Instead, we will work on it directly.</p>
<p>Let's start by cloning the platform repository</p>
<pre><code class="language-bash">> git clone git@github.com:shopware/platform.git shopware-platform
</code></pre>
<p>Change directory into our newly cloned project:</p>
<pre><code class="language-bash">> cd shopware-platform
</code></pre>
<p>Install the Composer dependencies</p>
<pre><code class="language-bash">> composer update
</code></pre>
<p>Now we start our service containers:</p>
<pre><code class="language-bash">> docker compose up -d
</code></pre>
<p>Now, set up the Shopware environment with the following command:</p>
<pre><code class="language-bash">> ./bin/console system:setup
</code></pre>
<p>URL to your /public folder should be: <code>http://localhost:8000</code></p>
<p>For the database details, use the following:</p>
<p>Host: 127.0.0.1 User: root Password: root Database: shopware</p>
<p>At the end, the system will create a <code>.env</code> file containing the provided configuration.</p>
<p>Now we install Shopware with:</p>
<pre><code class="language-bash">> composer setup
</code></pre>
<p>This will run the migrations, install dependencies and build the assets.</p>
<p>Start the webserver:</p>
<pre><code class="language-bash">symfony server:start -d
</code></pre>
<p>To be sure that the installation succeeded, just open the following URL in your favorite browser: <a href="http://localhost:8000/">localhost:8000</a></p>
<h3>Code Contribution</h3>
<p>If you have decided to contribute code to Shopware and become a member of the Shopware community, we appreciate your hard work and want to handle it with the most possible respect. To ensure the quality of our code and our products we have created a guideline we all should endorse to. It helps you and us to collaborate. Following these guidelines will help us to integrate your changes in our daily workflow.</p>
<p>Read more in <a href="https://docs.shopware.com/en/shopware-platform-dev-en/contribution/contribution-guideline">our contribution guideline</a> or in our short <a href="https://docs.shopware.com/en/shopware-platform-dev-en/contribution/contributing-code">HowTo contribute code</a>.</p>
<h3>The Shopware CLA</h3>
<p>When submitting your code to Shopware you automatically need to sign our CLA (Contributor License Agreement). This CLA ensures that Shopware will stay an open and living product. In short, you give the explicit right to use your code in Shopware to shopware AG.</p>
<h2>Reporting security issues</h2>
<p>Please have a look at our <a href="https://raw.githubusercontent.com/shopware/shopware/trunk/SECURITY.md">security policy</a>.</p>
<h2>License</h2>
<p>Shopware 6 is completely free and released under the <a href="https://raw.githubusercontent.com/shopware/shopware/trunk/LICENSE">MIT License</a>.</p>
<h2>Authors & Contributors</h2>
<p>Shopware is built with the help of our community.</p>
<p>You can find an overview of everyone who contributed to the platform repository in the <a href="https://github.com/shopware/platform/graphs/contributors">official github overview</a>. Additionally there are numerous people contributing to the ecosystem through activities not related to the codebase. Thank you all for being part of this!</p>
-
-
- DanWin/le-chat-php
- 2023-10-10T01:36:40Z
- tag:github.com,2023-10-10:/DanWin/le-chat-php
-
- <p>A PHP Chat based on LE CHAT</p><hr><h2>General Information:</h2>
<p>This is a PHP Chat based on LE CHAT v.1.14. An up-to-date copy of this script can be downloaded at <a href="https://github.com/DanWin/le-chat-php">https://github.com/DanWin/le-chat-php</a> The original perl LE CHAT script by Lucky Eddie can be downloaded at <a href="https://github.com/virtualghetto/lechat">this github fork</a>. If you add your own cool features or have a feature request, please tell me and I will add them, if I like them. Please also let me know about any bugs you find in the code, so I can fix them. Now a piece of information about the origin of the name "LE CHAT" copied from the original script: The "LE" in the name you can take as "Lucky Eddie", or since the script was meant to be lean and easy on server resources, as "Light Edition". It may even be the French word for "the" if you prefer. Translated from French to English, "le chat" means: "the cat".</p>
<h2>Features:</h2>
<ul>
<li>Optimized for Tor</li>
<li>No JavaScript needed</li>
<li>Cookies supported, but not needed</li>
<li>Captcha</li>
<li>Multiple languages</li>
<li>Members and guests</li>
<li>Waiting room for guests</li>
<li>Moderatoral approval of new guests</li>
<li>Public, member, moderator and admin only chats</li>
<li>Private messages</li>
<li>Multi-line messages</li>
<li>Change font, colour and refresh rate in profile settings</li>
<li>Autologout when inactive for some time</li>
<li>Image embedding</li>
<li>Notes for admins and moderators</li>
<li>Clone the chat to have multiple tabs</li>
<li>Kick chatters</li>
<li>Clean selected messages</li>
<li>Clean the whole room</li>
<li>Plain text message filter</li>
<li>Regex message filter</li>
<li>And more</li>
</ul>
<h2>Installation Instructions:</h2>
<p>You'll need to have php with intl, gettext, pdo, pcre, mbstring and date extension, and a web-server installed. You will also need the pdo_sqlite, pdo_mysql or pdo_pgsql extension, depending on which database you choose. Optionally, you can install:</p>
<ul>
<li>the gd extension for the captcha feature</li>
<li>the json extension for save/restore</li>
<li>a memcached server and the memcached extension and change the configuration to use memcached. This will lessen the database load a bit.</li>
<li>a MySQL or PostgreSQL server to use as an external database instead of SQLite</li>
<li>the libsodium extension (PHP >= 7.2) for encryption of messages and notes in the database When you have everything installed and use MySQL or PostgreSQL, you'll have to create a database and a user for the chat. Then edit the configuration at the bottom of the script to reflect the appropriate database settings and to modify the chat settings the way you like them. Then copy the script to your web-server directory and call the script in your browser with a parameter like this: http://(server)/(script-name).php?action=setup Now you can create the Superadmin account. With this account you can administer the chat and add new members and set the guest access. As soon as you are done with the setup, all necessary database tables will be created and the chat can be used. Note: If you updated the script, please visit http://(server)/(script-name).php?action=setup again, to make sure, that any database changes are applied and no errors occur.</li>
</ul>
<h2>Translating:</h2>
<p>Translations are managed in <a href="https://weblate.danwin1210.de/projects/DanWin/le-chat-php">Weblate</a>. If you prefer manually submitting translations, the script <code>update-translations.sh</code> can be used to update the language template and translation files from source. It will generate the file <code>locale/le-chat-php.pot</code> which you can then use as basis to create a new language file in <code>YOUR_LANG_CODE/LC_MESSAGES/le-chat-php.po</code> and edit it with a translation program, such as <a href="https://poedit.net/">Poedit</a>. Once you are done, you can open a pull request, or <a href="mailto:daniel@danwin1210.de">email me</a>, to include the translation.</p>
<h2>Regex:</h2>
<p>Yes, the chat supports regular expression filtering of messages. As regex tends to be difficult for most people, I decided to give it an extra section here. Regex is very powerful and can be used to filter messages that contain certain expressions and replace them with something else. It can be used e.g. to turn BB Code into html, so it is possible to use BB Code in the chat to format messages. To do this, use this Regex-Match <code>\[(u|b)\](.*?)\[\/\1\]</code> and this Regex-Replace <code><$1>$2</$1></code> and your text will be <code>[b]bold[/b]</code> or <code>[u]underlined[/u]</code>. You can also use smilies by using this Regex-Match <code>(?-i::(cry|eek|lol|sad|smile|surprised|wink):)</code> and this Regex-Replace <code><img src="/pictures/$1.gif" alt=":$1:"></code> And now if you enter <code><span>😄</span></code> an image with the smiley will be loaded from your server at <code>/pictures/smile.gif</code>. The following should be escaped by putting <code>\</code> in front of it, if you are trying to match one of these characters <code>/ \ ^ . $ | ( ) [ ] * + ? { } ,</code>. I used <code>/</code> as delimiter, so you will have to escape that, too. The only options I used is <code>i</code> to make the regex case insensitive. If you want to test your regex, before applying you can use <a href="http://www.phpliveregex.com/">this site</a> and enter your Regex and Replacement there and click on preg_replace. If you never used regex before, check out <a href="http://docs.activestate.com/komodo/4.4/regex-intro.html">this starting guide</a> to begin with regular expressions.</p>
-
\ No newline at end of file
diff --git a/pic/daily/index.xml b/pic/daily/index.xml
index b3d576a744e..a9817a50a77 100644
--- a/pic/daily/index.xml
+++ b/pic/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Pic Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:36:33Z
+ 2023-10-11T01:36:26Z
Daily Trending of Pic in GitHub
\ No newline at end of file
diff --git a/pickle/daily/index.xml b/pickle/daily/index.xml
index 77f55892ced..1622701868d 100644
--- a/pickle/daily/index.xml
+++ b/pickle/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Pickle Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:01Z
+ 2023-10-11T01:36:48Z
Daily Trending of Pickle in GitHub
\ No newline at end of file
diff --git a/picolisp/daily/index.xml b/picolisp/daily/index.xml
index 81f1708e8cc..cd333a511e9 100644
--- a/picolisp/daily/index.xml
+++ b/picolisp/daily/index.xml
@@ -1,7 +1,7 @@
GitHub PicoLisp Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:00Z
+ 2023-10-11T01:36:46Z
Daily Trending of PicoLisp in GitHub
\ No newline at end of file
diff --git a/piglatin/daily/index.xml b/piglatin/daily/index.xml
index 99faa42543f..2be5f1731df 100644
--- a/piglatin/daily/index.xml
+++ b/piglatin/daily/index.xml
@@ -1,7 +1,7 @@
GitHub PigLatin Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:02Z
+ 2023-10-11T01:36:49Z
Daily Trending of PigLatin in GitHub
\ No newline at end of file
diff --git a/pike/daily/index.xml b/pike/daily/index.xml
index fd3605deb87..10b145969c0 100644
--- a/pike/daily/index.xml
+++ b/pike/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Pike Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:01Z
+ 2023-10-11T01:36:47Z
Daily Trending of Pike in GitHub
\ No newline at end of file
diff --git a/plantuml/daily/index.xml b/plantuml/daily/index.xml
index d72875f2aed..0c007e14559 100644
--- a/plantuml/daily/index.xml
+++ b/plantuml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub PlantUML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:05Z
+ 2023-10-11T01:36:50Z
Daily Trending of PlantUML in GitHub
\ No newline at end of file
diff --git a/plpgsql/daily/index.xml b/plpgsql/daily/index.xml
index 7fb2129aa4f..65f4b246ce2 100644
--- a/plpgsql/daily/index.xml
+++ b/plpgsql/daily/index.xml
@@ -1,7 +1,7 @@
GitHub PLpgSQL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:07Z
+ 2023-10-11T01:36:53Z
Daily Trending of PLpgSQL in GitHub
\ No newline at end of file
diff --git a/plsql/daily/index.xml b/plsql/daily/index.xml
index 837f0ebd52b..6f16a902d09 100644
--- a/plsql/daily/index.xml
+++ b/plsql/daily/index.xml
@@ -1,7 +1,7 @@
GitHub PLSQL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:05Z
+ 2023-10-11T01:36:52Z
Daily Trending of PLSQL in GitHub
\ No newline at end of file
diff --git a/pod-6/daily/index.xml b/pod-6/daily/index.xml
index 8f3aa841911..bd8b9322e5c 100644
--- a/pod-6/daily/index.xml
+++ b/pod-6/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Pod 6 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:10Z
+ 2023-10-11T01:36:57Z
Daily Trending of Pod 6 in GitHub
\ No newline at end of file
diff --git a/pod/daily/index.xml b/pod/daily/index.xml
index bcc08618f2e..da30e3c097d 100644
--- a/pod/daily/index.xml
+++ b/pod/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Pod Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:04Z
+ 2023-10-11T01:36:51Z
Daily Trending of Pod in GitHub
\ No newline at end of file
diff --git a/pogoscript/daily/index.xml b/pogoscript/daily/index.xml
index ea871e129be..7a3ca5796c7 100644
--- a/pogoscript/daily/index.xml
+++ b/pogoscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub PogoScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:09Z
+ 2023-10-11T01:36:55Z
Daily Trending of PogoScript in GitHub
\ No newline at end of file
diff --git a/pony/daily/index.xml b/pony/daily/index.xml
index 3dc300a5869..6897a79f0e2 100644
--- a/pony/daily/index.xml
+++ b/pony/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Pony Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:11Z
+ 2023-10-11T01:36:55Z
Daily Trending of Pony in GitHub
\ No newline at end of file
diff --git a/postcss/daily/index.xml b/postcss/daily/index.xml
index 119379fe578..ce4b6d0936c 100644
--- a/postcss/daily/index.xml
+++ b/postcss/daily/index.xml
@@ -1,7 +1,7 @@
GitHub PostCSS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:13Z
+ 2023-10-11T01:37:00Z
Daily Trending of PostCSS in GitHub
\ No newline at end of file
diff --git a/postscript/daily/index.xml b/postscript/daily/index.xml
index 375cf63db55..539a5a2b37a 100644
--- a/postscript/daily/index.xml
+++ b/postscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub PostScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:15Z
+ 2023-10-11T01:37:01Z
Daily Trending of PostScript in GitHub
\ No newline at end of file
diff --git a/pov-ray-sdl/daily/index.xml b/pov-ray-sdl/daily/index.xml
index f307f6831d0..fa32c002b8e 100644
--- a/pov-ray-sdl/daily/index.xml
+++ b/pov-ray-sdl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub POV-Ray SDL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:14Z
+ 2023-10-11T01:36:59Z
Daily Trending of POV-Ray SDL in GitHub
\ No newline at end of file
diff --git a/powerbuilder/daily/index.xml b/powerbuilder/daily/index.xml
index 803c62711c6..15346997dd9 100644
--- a/powerbuilder/daily/index.xml
+++ b/powerbuilder/daily/index.xml
@@ -1,7 +1,7 @@
GitHub PowerBuilder Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:18Z
+ 2023-10-11T01:37:04Z
Daily Trending of PowerBuilder in GitHub
\ No newline at end of file
diff --git a/powershell/daily/index.xml b/powershell/daily/index.xml
index 4adcf24ad50..8bbc7a18f06 100644
--- a/powershell/daily/index.xml
+++ b/powershell/daily/index.xml
@@ -1,14 +1,28 @@
GitHub PowerShell Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:21Z
+ 2023-10-11T01:37:07Z
Daily Trending of PowerShell in GitHub
- mitre/stockpile
- 2023-10-10T01:37:21Z
- tag:github.com,2023-10-10:/mitre/stockpile
-
- <p>A CALDERA plugin</p><hr><h1>CALDERA plugin: Stockpile</h1>
<p>A plugin supplying CALDERA with TTPs and adversary profiles.</p>
<p><a href="https://github.com/mitre/caldera/wiki/Plugin:-stockpile">Read the full docs</a></p>
<p>For collection and exfiltration abilities added January 2022 (see list below), additional information for configuring these abilities can be found in the <a href="https://raw.githubusercontent.com/mitre/stockpile/master/docs/Exfiltration-How-Tos.md">examples</a> in the stockpile/docs/ folder.</p>
<p><em>2022 Included abilities:</em></p>
<ul>
<li>Advanced File Search and Stager</li>
<li>Find Git Repositories & Compress Git Repository</li>
<li>Compress Staged Directory (Password Protected)</li>
<li>Compress Staged Directory (Password Protected) and Break Into Smaller Files</li>
<li>Exfil Compressed Archive to FTP</li>
<li>Exfil Compressed Archive to Dropbox</li>
<li>Exfil Compressed Archive to GitHub Repositories | Gists</li>
<li>Exfil Compressed Archive to GitHub Gist</li>
<li>Exfil Directory Files to Github (this exfiltrates files without archiving)</li>
<li>Exfil Compressed Archive to S3 via AWS CLI</li>
<li>Transfer Compressed Archive to Separate S3 Bucket via AWS CLI</li>
<li>Scheduled Exfiltration</li>
</ul>
+ tarikguney/usa-visa-appointment-checker
+ 2023-10-11T01:37:07Z
+ tag:github.com,2023-10-11:/tarikguney/usa-visa-appointment-checker
+
+ <p></p><hr><h1>USA Visa Appointment Checker</h1>
<p><img src="https://raw.githubusercontent.com/tarikguney/usa-visa-appointment-checker/main/visa-logo.jpg" alt="Example Image"></p>
<p>Hello, Visa Seeker!</p>
<p>This script automates the process of checking for available visa interview appointments.</p>
<p>It logs into your account on <a href="https://ais.usvisa-info.com">https://ais.usvisa-info.com</a> using your username and password, and then scans the appointment page for availability.</p>
<p>You can run the script at regular intervals to receive timely alerts on new appointment slots.</p>
<p>Optionally, you can configure it to send email notifications about appointment availability to you or someone else.</p>
<p>Rest assured, the script runs locally on your computer, ensuring that your login details are not shared.</p>
<h2>How to run</h2>
<ol>
<li>Download the visa-appointment-checker.ps1 file onto your computer. You can also clone this repo if you know Git.</li>
<li>Open up your preferred terminal app, like Windows Terminal or iTerm.</li>
<li>In your terminal, run this command to enter the Powershell shell: <code>pwsh</code>. If this command seems unavailable, restart your terminal app.</li>
<li>Navigate to the directory where you placed the visa-appointment-checker.ps1 file.</li>
<li>Run this command and make sure you provide your username, password, and schedule id <code>./visa-appointment-checker.ps1 -email "hello@world.com" -password "12abc" -scheduleId 456677</code></li>
</ol>
<h2>Prerequisites</h2>
<p>You must download and install Powershell to run this script on your computer.</p>
<p><a href="https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell?view=powershell-7.3">Dowload it here</a> if you don't have it already.</p>
<h3>More Help</h3>
<pre><code>.PARAMETER email
The email that you use to log in at https://ais.usvisa-info.com/en-tr/iv/users/sign_in
.PARAMETER password
The password that you use to log in at https://ais.usvisa-info.com/en-tr/iv/users/sign_in
.PARAMETER scheduleId
ScheduleId comes from the URL where you make the visa payment https://ais.usvisa-info.com/en-tr/iv/schedule/{scheduleId}/payment
.EXAMPLE
.\visa-appointment-checker.ps1 -email "hello@world.com" -password "12abc" -scheduleId 456677
</code></pre>
+
+
+ yourwishismine1989/PowerShell_Getting-Started
+ 2023-10-11T01:37:07Z
+ tag:github.com,2023-10-11:/yourwishismine1989/PowerShell_Getting-Started
+
+ <p>A quick how to with your first script example</p><hr><h1>PowerShell_Getting-Started</h1>
<p>A quick how to with your first script example</p>
<h2><strong>install PowerShell</strong></h2>
<h3>Setup linux distro (tested on Ubuntu 22.04 on 09/26/2023)</h3>
<pre><code>https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-linux?view=powershell-7.3
</code></pre>
<h3>Setup Windows (tested on Windows 11 on 09/26/2023)</h3>
<pre><code>https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.3
</code></pre>
<h2><strong>hello-world</strong> (tested on Ubuntu 22.04 on 09/26/2023)</h2>
<pre><code>/usr/bin/pwsh
touch hello-world.ps1
nano ./hello-world.ps1
[String]$message = "Hello World"
Write-Host -BackgroundColor $bgClr -ForegroundColor $fgClr "$message"
CTRL-o -> ENTER
CTRL-x
./hello-world.ps1
</code></pre>
+
+
+ codewario/PocketLibraryImages
+ 2023-10-11T01:37:07Z
+ tag:github.com,2023-10-11:/codewario/PocketLibraryImages
+
+ <p>This tool will prepare an image library for use with cartridges (and openFPGA cores if Analogue ever supports them) on Analogue OS</p><hr><h1>Analogue Pocket Library Image Generator</h1>
<p>This is an interactive tool to assist with downloading image libraries from <a href="https://github.com/libretro-thumbnails/libretro-thumbnails">libretro-thumbnail</a> and converting them to Analogue OS' <code>.bin</code> format.</p>
<p>Note that at this time image libraries only seem to work with cartridge-based games.</p>
<h2>Note about OpenFPGA Cores</h2>
<p>Presumably, OpenFPGA cores would follow the same image library format when displaying game details. However, Analogue has yet to support Library images for titles launched through OpenFPGA cores. Until such a time that OpenFPGA cores support Library images, using these image libraries with ROMs launched through OpenFPGA cores cannot be supported.</p>
<h2>Quick Start</h2>
<p>To get started, run <code>AnalogueOSLibraryImageGenerator.ps1</code> in PowerShell. An interactive menu will guide you. It is recommended to read the <strong>Introduction</strong> before using the tool for the first time to get a feel for how it works.</p>
<p>By default the output is minimal. You can use the following flags to control whether to show additional output when launching the script. Note that these flags will increase the conversion time a bit as writing to the console is not an instant operation:</p>
<ul>
<li><code>-OutputConvertedFiles</code>: Output the files which are converted to the console</li>
<li><code>-Verbose</code>: Additional debugging output, useful when troubleshooting the script</li>
<li><code>-Verbosity</code>: <code>Minimal</code>, <code>Extra</code>, or <code>Noisy</code>. Controls how much information is displayed when <code>-Verbose</code> is set. No effect otherwise. <code>Minimal</code> is the default.</li>
</ul>
<h2>What game libraries can I convert?</h2>
<p>At this time of writing only GBA, GB, GBC, and GG images are useful for conversion, but any libretro-thumbnail repository should be compatible. This ensures future compatibility as official converters are released or if Library images ever become supported on openFPGA cores.</p>
<h2>Why didn't it generate a thumbnail for one of my games?</h2>
<p>Note that since this tool relies on both <strong>libretro</strong> and DAT files, it may miss thumbnails for games which don't have a <strong>libretro-thumbnail</strong> image or if entries are not found in your DAT file. For the latter, if you know the CRC of your cart or ROM, you can add to your DAT file at any time using the text editor of your choice. In particular, rom hacks are likely going to be missing from the DAT file you pull from <a href="https://datomatic.no-intro.org/">DAT-O-MATIC</a>, but there are a few missing retail games or revisions of them as well.</p>
<p>Keep in mind that DAT-O-MATIC does split some classes of games into their own System. For example, GBA video cartridges have a special system classification and are not included in the normal DAT with most actual games.</p>
<h2>Where can I run this script?</h2>
<p>This tool is only supported on Windows as it relies on .NET types which are not available on MacOS or Linux. You may see some remnants in the source of a cross-platform direction, but this was quashed when I found the built-in namespaces for image manipulation are Windows-only or deprecated in non-Windows environments.</p>
<p>I am aware that there are third-party libs/tools that can be leveraged for image manipulation, however, one of the goals of this project is portability and not requiring additional items to be installed. It is also why this script crawls the GitHub site to obtain the zip URLs instead of requiring <code>git</code> to be installed for cloning <code>libretro-thumbnails</code> and its submodules directly.</p>
<p>That said, if anybody wants to contribute such functionality for Mac OS or Linux, pull requests are welcomed. Just try to keep any external dependencies to a "standard enough" minimum.</p>
<h2>Getting a "connection closed" error when downloading one of the <code>libretro-thumbnails</code> image libraries</h2>
<p>There's not a whole lot I can do about this, I hit this sometimes too when trying to convert the GBA library due to its size. GitHub terminates the code archive download if it runs for longer than 20 minutes, in my experience. This is likely due to the fact that GitHub creates code archives on-demand, and the time the exported archive remains cached is limited.</p>
<p>As a workaround when this happens, if you choose <code>Download Console Image Library (Manual)</code>, and provide a file path (instead of a URL) to an archive that you've either:</p>
<ul>
<li><a href="https://raw.githubusercontent.com/codewario/PocketLibraryImages/master/create-local-archive.md">exported yourself from a cloned copy of the <code>git</code> repo</a>; or</li>
<li>been able to obtain from <code>libretro-thumbnails</code> yourself via other means</li>
</ul>
<p>then the script will work with the local archive you've pointed to instead of attempting to obtain it from GitHub. Note that this script expects a <code>.zip</code> file; <code>.tar.gz</code> is not supported.</p>
<h2>I would just like an image library please</h2>
<p>Check out the latest <a href="https://github.com/codewario/PocketLibraryImages/releases/latest">Release</a> page for the most recent sample image packs.</p>
<p>If you have a problem with the latest version, all <a href="https://github.com/codewario/PocketLibraryImages/releases/">Releases</a> have sample packs provided, so you may try one of those. You can find older stable versions of the script along with image packs for supported games at the time of release as well as prior versions of the script. Don't forget if you have a problem with the latest sample packs to please create an issue on the <a href="https://raw.githubusercontent.com/codewario/PocketLibraryImages/master/%5Burl%5D(https://github.com/codewario/PocketLibraryImageConversion/issues)https://github.com/codewario/PocketLibraryImageConversion/issues">project's issue tracker</a>.</p>
\ No newline at end of file
diff --git a/prisma/daily/index.xml b/prisma/daily/index.xml
index 0d58fd5ea3a..d1dcad36540 100644
--- a/prisma/daily/index.xml
+++ b/prisma/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Prisma Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:17Z
+ 2023-10-11T01:37:03Z
Daily Trending of Prisma in GitHub
\ No newline at end of file
diff --git a/processing/daily/index.xml b/processing/daily/index.xml
index 81f0134a4fe..c321a4d2160 100644
--- a/processing/daily/index.xml
+++ b/processing/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Processing Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:16Z
+ 2023-10-11T01:37:03Z
Daily Trending of Processing in GitHub
\ No newline at end of file
diff --git a/procfile/daily/index.xml b/procfile/daily/index.xml
index f33ec6fe061..917882df772 100644
--- a/procfile/daily/index.xml
+++ b/procfile/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Procfile Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:28Z
+ 2023-10-11T01:37:30Z
Daily Trending of Procfile in GitHub
\ No newline at end of file
diff --git a/proguard/daily/index.xml b/proguard/daily/index.xml
index 35b11644ebe..46709326d86 100644
--- a/proguard/daily/index.xml
+++ b/proguard/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Proguard Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:27Z
+ 2023-10-11T01:37:27Z
Daily Trending of Proguard in GitHub
\ No newline at end of file
diff --git a/prolog/daily/index.xml b/prolog/daily/index.xml
index 4ec82fd19e9..0320330336d 100644
--- a/prolog/daily/index.xml
+++ b/prolog/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Prolog Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:30Z
+ 2023-10-11T01:37:29Z
Daily Trending of Prolog in GitHub
+
+ math-comp/hierarchy-builder
+ 2023-10-11T01:37:29Z
+ tag:github.com,2023-10-11:/math-comp/hierarchy-builder
+
+ <p>High level commands to declare a hierarchy based on packed classes</p><hr>
+
\ No newline at end of file
diff --git a/promela/daily/index.xml b/promela/daily/index.xml
index ddd62ac5c20..3e49c049d17 100644
--- a/promela/daily/index.xml
+++ b/promela/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Promela Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:29Z
+ 2023-10-11T01:37:27Z
Daily Trending of Promela in GitHub
\ No newline at end of file
diff --git a/propeller-spin/daily/index.xml b/propeller-spin/daily/index.xml
index 93dab870c60..550a9c078c8 100644
--- a/propeller-spin/daily/index.xml
+++ b/propeller-spin/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Propeller Spin Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:33Z
+ 2023-10-11T01:37:32Z
Daily Trending of Propeller Spin in GitHub
\ No newline at end of file
diff --git a/protocol-buffer-text-format/daily/index.xml b/protocol-buffer-text-format/daily/index.xml
index ed6779d90cc..413a78c6b73 100644
--- a/protocol-buffer-text-format/daily/index.xml
+++ b/protocol-buffer-text-format/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Protocol Buffer Text Format Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:31Z
+ 2023-10-11T01:37:31Z
Daily Trending of Protocol Buffer Text Format in GitHub
\ No newline at end of file
diff --git a/protocol-buffer/daily/index.xml b/protocol-buffer/daily/index.xml
index fa0548ec310..95b61ce1538 100644
--- a/protocol-buffer/daily/index.xml
+++ b/protocol-buffer/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Protocol Buffer Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:32Z
+ 2023-10-11T01:37:32Z
Daily Trending of Protocol Buffer in GitHub
\ No newline at end of file
diff --git a/public-key/daily/index.xml b/public-key/daily/index.xml
index 2de2d1fee59..8db8177070f 100644
--- a/public-key/daily/index.xml
+++ b/public-key/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Public Key Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:33Z
+ 2023-10-11T01:37:33Z
Daily Trending of Public Key in GitHub
\ No newline at end of file
diff --git a/pug/daily/index.xml b/pug/daily/index.xml
index 313df28b31a..5fe8d9ef85e 100644
--- a/pug/daily/index.xml
+++ b/pug/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Pug Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:38Z
+ 2023-10-11T01:37:38Z
Daily Trending of Pug in GitHub
+
+ haru52/haru52.github.io
+ 2023-10-11T01:37:38Z
+ tag:github.com,2023-10-11:/haru52/haru52.github.io
+
+ <p>haru website.</p><hr>
+
\ No newline at end of file
diff --git a/puppet/daily/index.xml b/puppet/daily/index.xml
index e1d6cc114e9..736bd7bb0da 100644
--- a/puppet/daily/index.xml
+++ b/puppet/daily/index.xml
@@ -1,7 +1,28 @@
GitHub Puppet Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:36Z
+ 2023-10-11T01:37:37Z
Daily Trending of Puppet in GitHub
+
+ muresan/learning-puppet
+ 2023-10-11T01:37:37Z
+ tag:github.com,2023-10-11:/muresan/learning-puppet
+
+ <p>learning puppet</p><hr>
+
+
+ jfryman/puppet-puppet
+ 2023-10-11T01:37:37Z
+ tag:github.com,2023-10-11:/jfryman/puppet-puppet
+
+ <p>Puppet module to manage Puppet (meta!)</p><hr>
+
+
+ icebourg/puppet-users
+ 2023-10-11T01:37:37Z
+ tag:github.com,2023-10-11:/icebourg/puppet-users
+
+ <p>A puppet repo for distributed user management.</p><hr>
+
\ No newline at end of file
diff --git a/pure-data/daily/index.xml b/pure-data/daily/index.xml
index e9932803df3..53b53d7c78a 100644
--- a/pure-data/daily/index.xml
+++ b/pure-data/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Pure Data Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:36Z
+ 2023-10-11T01:37:34Z
Daily Trending of Pure Data in GitHub
\ No newline at end of file
diff --git a/purebasic/daily/index.xml b/purebasic/daily/index.xml
index 42e8b2834dc..150940f9a0d 100644
--- a/purebasic/daily/index.xml
+++ b/purebasic/daily/index.xml
@@ -1,7 +1,7 @@
GitHub PureBasic Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:35Z
+ 2023-10-11T01:37:35Z
Daily Trending of PureBasic in GitHub
\ No newline at end of file
diff --git a/purescript/daily/index.xml b/purescript/daily/index.xml
index 07e769b968c..898fe62c430 100644
--- a/purescript/daily/index.xml
+++ b/purescript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub PureScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:42Z
+ 2023-10-11T01:37:46Z
Daily Trending of PureScript in GitHub
\ No newline at end of file
diff --git a/python-console/daily/index.xml b/python-console/daily/index.xml
index 76b685e73f1..e5d3f8ab539 100644
--- a/python-console/daily/index.xml
+++ b/python-console/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Python console Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:39Z
+ 2023-10-11T01:37:39Z
Daily Trending of Python console in GitHub
\ No newline at end of file
diff --git a/python-traceback/daily/index.xml b/python-traceback/daily/index.xml
index 99265fa6f25..d2ca1fe2737 100644
--- a/python-traceback/daily/index.xml
+++ b/python-traceback/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Python traceback Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:10Z
+ 2023-10-11T01:38:04Z
Daily Trending of Python traceback in GitHub
\ No newline at end of file
diff --git a/python/daily/index.xml b/python/daily/index.xml
index 09456ca6348..f59f6f7ff66 100644
--- a/python/daily/index.xml
+++ b/python/daily/index.xml
@@ -1,28 +1,21 @@
GitHub Python Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:37:46Z
+ 2023-10-11T01:37:46Z
Daily Trending of Python in GitHub
- Weixin-Liang/LLM-scientific-feedback
- 2023-10-10T01:37:46Z
- tag:github.com,2023-10-10:/Weixin-Liang/LLM-scientific-feedback
-
- <p>Can large language models provide useful feedback on research papers? A large-scale empirical analysis.</p><hr><h1>Can large language models provide useful feedback on research papers? A large-scale empirical analysis.</h1>
<p><a href="https://www.python.org/downloads/release/python-3100/"><img src="https://img.shields.io/badge/python-3.10-blue.svg?sanitize=true" alt="Python 3.10"></a> <a href="https://github.com/ambv/black"><img src="https://img.shields.io/badge/code%20style-black-000000.svg?sanitize=true" alt="Black"></a> <a href="https://arxiv.org/abs/2310.01783"><img src="https://img.shields.io/badge/arXiv-2310.01783-b31b1b.svg?sanitize=true" alt="arXiv"></a></p>
<p>This repo provides the Python source code of our paper: <a href="https://arxiv.org/abs/2310.01783">Can large language models provide useful feedback on research papers? A large-scale empirical analysis.</a> <a href="https://arxiv.org/pdf/2310.01783.pdf">[PDF]</a><a href="https://twitter.com/james_y_zou/status/1709608909395357946">[Twitter]</a></p>
<pre><code>@inproceedings{LLM-Research-Feedback-2023,
title={{Can large language models provide useful feedback on research papers? A large-scale empirical analysis}},
author={Liang, Weixin and Zhang, Yuhui and Cao, Hancheng and Wang, Binglu and Ding, Daisy and Yang, Xinyu and Vodrahalli, Kailas and He, Siyu and Smith, Daniel and Yin, Yian and McFarland, Daniel and Zou, James},
booktitle={arXiv preprint arXiv:2310.01783},
year={2023}
}
</code></pre>
<h2>Abstract</h2>
<p>Expert feedback lays the foundation of rigorous research. However, the rapid growth of scholarly production and intricate knowledge specialization challenge the conventional scientific feedback mechanisms. High-quality peer reviews are increasingly difficult to obtain. Researchers who are more junior or from under-resourced settings have especially hard times getting timely feedback. With the breakthrough of large language models (LLM) such as GPT-4, there is growing interest in using LLMs to generate scientific feedback on research manuscripts. However, the utility of LLM-generated feedback has not been systematically studied. To address this gap, we created an automated pipeline using GPT-4 to provide comments on the full PDFs of scientific papers. We evaluated the quality of GPT-4's feedback through two large-scale studies. We first quantitatively compared GPT-4's generated feedback with human peer reviewer feedback in 15 <em>Nature</em> family journals (3,096 papers in total) and the <em>ICLR</em> machine learning conference (1,709 papers). The overlap in the points raised by GPT-4 and by human reviewers (average overlap 30.85% for <em>Nature</em> journals, 39.23% for <em>ICLR</em>) is comparable to the overlap between two human reviewers (average overlap 28.58% for <em>Nature</em> journals, 35.25% for <em>ICLR</em>). The overlap between GPT-4 and human reviewers is larger for the weaker papers (i.e., rejected <em>ICLR</em> papers; average overlap 43.80%). We then conducted a prospective user study with 308 researchers from 110 US institutions in the field of AI and computational biology to understand how researchers perceive feedback generated by our GPT-4 system on their own papers. Overall, more than half (57.4%) of the users found GPT-4 generated feedback helpful/very helpful and 82.4% found it more beneficial than feedback from at least some human reviewers. While our findings show that LLM-generated feedback can help researchers, we also identify several limitations. For example, GPT-4 tends to focus on certain aspects of scientific feedback (e.g., `add experiments on more datasets'), and often struggles to provide in-depth critique of method design. Together our results suggest that LLM and human feedback can complement each other. While human expert review is and should continue to be the foundation of rigorous scientific process, LLM feedback could benefit researchers, especially when timely expert feedback is not available and in earlier stages of manuscript preparation before peer-review.</p>
<p><img src="https://github.com/Weixin-Liang/LLM-scientific-feedback/assets/32794044/8958eb56-a652-45bb-9347-e9578f432ae0" alt="1"> <img src="https://github.com/Weixin-Liang/LLM-scientific-feedback/assets/32794044/6228288b-9a54-4c90-8510-32bb823f1e05" alt="2"></p>
<h2>Usage</h2>
<p>To run the code, you need to 1) create a PDF parsing server and run in the background, 2) create the LLM feedback server, 3) open the web browser and upload your paper.</p>
<h3>Create and Run PDF Parsing Server</h3>
<pre><code class="language-bash">conda env create -f conda_environment.yml
conda activate ScienceBeam
python -m sciencebeam_parser.service.server --port=8080 # Make sure this is running in the background
</code></pre>
<h3>Create and Run LLM Feedback Server</h3>
<pre><code class="language-bash">conda create -n llm python=3.10
conda activate llm
pip install -r requirements.txt
cat YOUR_OPENAI_API_KEY > key.txt # Replace YOUR_OPENAI_API_KEY with your OpenAI API key starting with "sk-"
python main.py
</code></pre>
<h3>Open the Web Browser and Upload Your Paper</h3>
<p>Open <a href="http://0.0.0.0:7799">http://0.0.0.0:7799</a> and upload your paper. The feedback will be generated in around 120 seconds.</p>
<p>You should get the following output:</p>
<p><img src="https://raw.githubusercontent.com/Weixin-Liang/LLM-scientific-feedback/main/demo.png" alt="demo"></p>
<p>If you encounter any error, please first check the server log and then open an issue.</p>
+ MetaGLM/FinGLM
+ 2023-10-11T01:37:46Z
+ tag:github.com,2023-10-11:/MetaGLM/FinGLM
+
+ <p></p><hr><h1 align="center">🌐 FinGLM</h1>
<!-- <h3 align="center">SMP 2023 ChatGLM 金融大模型挑战赛</h3>
<p align="center">
<img src="./img/" alt="FinGLM Logo"> --->
<p></p>
<p align="center"> <a href="https://tianchi.aliyun.com/competition/entrance/532126">赛题链接</a> | <a href="https://tianchi.aliyun.com/specials/promotion/SMP2023ChatGLMChallenge">赛题宣传页</a> </p>
<p>📃 <strong>FinGLM</strong>: 致力于构建一个开放的、公益的、持久的金融大模型项目,利用开源开放来促进「AI+金融」。</p>
<hr>
<h2>🚀 目录</h2>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D">项目介绍</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%A1%B9%E7%9B%AE%E6%A1%86%E6%9E%B6">项目框架</a>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E6%95%B0%E6%8D%AE%E5%87%86%E5%A4%87%E6%B5%81%E7%A8%8B">1. 数据准备流程</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E6%A8%A1%E5%9E%8B%E5%87%86%E5%A4%87%E6%B5%81%E7%A8%8B">2. 模型准备流程</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%97%AE%E7%AD%94%E6%B5%81%E7%A8%8B">3. 问答流程</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E5%BC%80%E6%BA%90%E8%B7%AF%E7%BA%BF%E5%9B%BE">开源路线图</a>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E5%BC%80%E6%BA%90%E7%AD%96%E7%95%A5">1. 开源策略</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E5%BC%80%E6%BA%90%E8%BF%9B%E5%BA%A6">2. 开源进度</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E6%AF%94%E8%B5%9B%E9%A1%B9%E7%9B%AE">比赛项目</a>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#FinGLM_all">0. FinGLM_all</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%A6%92%E5%A4%B4%E7%A7%91%E6%8A%80">1. 馒头科技</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E5%8D%97%E5%93%AA%E9%83%BD%E9%98%9F">2. 南哪都队</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#Chatglm%E5%8F%8D%E5%8D%B7%E6%80%BB%E5%B1%80">3. Chatglm反卷总局</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#nsddd">4. nsddd</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%BE%99%E7%9B%88%E6%88%98%E9%98%9F">5. 龙盈战队</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E7%BB%93%E5%A9%9A%E4%B9%B0%E6%88%BF%E4%BB%A3%E4%BB%A3%E9%9F%AD%E8%8F%9C">6. 结婚买房代代韭菜</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#TabIsabaopilong">7. TabIsabaopilong</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%A5%BA%E5%AD%90%E7%A0%94%E7%A9%B6%E9%99%A2">8. 饺子研究院</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E6%B5%81%E5%AE%9D%E7%9C%9F%E4%BA%BA">9. 流宝真人</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E6%95%B0%E6%8D%AE%E9%9B%86%E6%8F%8F%E8%BF%B0">数据集描述</a>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E5%B9%B4%E6%8A%A5%E6%95%B0%E6%8D%AE%E9%9B%86">1. 年报数据集</a>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#PDF%E4%B8%8B%E8%BD%BD">PDF下载</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#TXT%E4%B8%8B%E8%BD%BD">TXT下载</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#HTML%E4%B8%8B%E8%BD%BD">HTML下载</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E4%BD%BF%E7%94%A8%E5%BB%BA%E8%AE%AE">使用建议</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E6%A0%87%E6%B3%A8%E6%95%B0%E6%8D%AE">2. 标注数据</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%A1%B9%E7%9B%AE%E9%97%AE%E7%AD%94%E6%BC%94%E7%A4%BA">项目问答演示</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E8%B4%A1%E7%8C%AE%E8%80%85">贡献者</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E5%85%8D%E8%B4%A3%E5%A3%B0%E6%98%8E">免责声明</a></li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/README.md#%E9%A1%B9%E7%9B%AE%E8%81%94%E7%B3%BB">项目联系</a></li>
</ul>
<hr>
<h2>📖 项目介绍</h2>
<p>📈 一个旨在深度解析上市公司年报的对话交互智能系统。面对金融文本中的专业术语与暗含信息,我们致力于用AI实现专家级别的金融分析。</p>
<p>🚀 在AI领域,虽然已在文本对话取得进展,但真正的金融交互场景仍然是一个巨大挑战。多方机构联手举办此次竞赛,探索金融领域AI的边界。</p>
<p>📘 上市公司年报为投资者呈现了公司的经营状况、财务状况和未来规划。专业知识是解读的关键,而我们的目标是通过AI技术让这一过程变得更简单、更准确。</p>
<hr>
<h2>🛠 项目框架</h2>
<h3>1. 数据准备流程</h3>
<ul>
<li> <p><strong><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/tools/pdf_to_txt">PDF 转 TXT</a></strong>:</p>
<ul>
<li>转换为 TXT 格式。</li>
<li>保留表格并合并单元格。</li>
</ul> </li>
<li> <p><strong>数据切分</strong>:</p>
<ul>
<li>基础信息:例如公司名称等。</li>
<li>财务数据:例如资产负债表等。</li>
<li>综合信息:例如财务指标等。</li>
</ul> </li>
<li> <p><strong>数据处理</strong>:</p>
<ul>
<li>计算基础公式:如营业成本率等。</li>
<li>计算增长率。</li>
<li>计算行业均值和排名。</li>
</ul> </li>
<li> <p><strong>存入数据库</strong>:</p>
<ul>
<li>存入 SQL、Mongo 和 ES 中。</li>
<li>包括建表及存储。</li>
</ul> </li>
</ul>
<h3>2. 模型微调流程</h3>
<ul>
<li> <p><strong>数据分类</strong>:如 SQL 数据、ES 数据等。</p> </li>
<li> <p><strong>选择微调策略</strong>:例如 ptuningv2、lora等。</p> </li>
<li> <p><strong>执行微调</strong>:根据选定策略。</p> </li>
</ul>
<h3>3. 问答流程</h3>
<ul>
<li><strong>输入问题</strong>:用户输入问题。</li>
<li><strong>Prompt 准备</strong>:根据问题生成 prompt。</li>
<li><strong>生成查询语句</strong>:基于 GPU 使用率选择生成方法。</li>
<li><strong>查询数据库</strong>:并返回结果。</li>
<li><strong>答案生成</strong>:结合问题和查询结果生成答案。</li>
</ul>
<hr>
<h2>🌱 开源路线图</h2>
<h3>1. 开源策略</h3>
<p><strong>1) 赛事转型</strong></p>
<ul>
<li>比赛转型为<a href="https://tianchi.aliyun.com/competition/entrance/532126">学习赛</a>,允许任何人学习使用。</li>
</ul>
<p><strong>2) 数据开源</strong></p>
<ul>
<li>目前开源数据有 <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/reports">70G/1w+份年报数据</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/">10000条人工标注评测数据</a>等。</li>
<li>后续我们也将根据项目需求,持续迭代更新数据。</li>
</ul>
<p><strong>3) 方案/代码/模型开源</strong></p>
<ul>
<li>经同意,<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E7%BB%93%E5%A9%9A%E4%B9%B0%E6%88%BF%E4%BB%A3%E4%BB%A3%E9%9F%AD%E8%8F%9C">结婚买房代代韭菜</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/Chatglm%E5%8F%8D%E5%8D%B7%E6%80%BB%E5%B1%80">Chatglm反卷总局</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/nsddd">nsddd</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E9%A6%92%E5%A4%B4%E7%A7%91%E6%8A%80">馒头科技</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E5%8D%97%E5%93%AA%E9%83%BD%E9%98%9F">南哪都队</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E9%BE%99%E7%9B%88%E6%88%98%E9%98%9F">龙盈战队</a>、<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/(./code/finglm_all)">安硕硕眼探企</a>等团队的方案、代码、模型完全开源,纳入FinGLM项目。</li>
<li>我们将长期维护优化 <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/finglm_all">FinGLM 项目</a>,提供便捷解决方案。</li>
</ul>
<p><strong>4) 开放交流</strong></p>
<ul>
<li>以上团队成员将共同维护 FinGLM项目,确保项目持续迭代。我们也欢迎更多团队来共同贡献问题和方案。</li>
<li>我们将不定期组织线上、线下交流,将更优秀的技术推广给每个项目成员。</li>
<li>FinGLM 开源项目出于完全公益目的,欢迎所有开发者<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/#%E8%B4%A1%E7%8C%AE%E8%80%85">申请加入</a>,当然我们会进行严格审核。</li>
</ul>
<p><strong>5) 学习教程</strong></p>
<ul>
<li>基于FinGLM项目的开发,我们将整合并制作以下(包含且不限于)学习教程.
<ul>
<li>数据预处理教程</li>
<li>数据库使用教程</li>
<li>GLM的使用教程</li>
<li>Prompt编写教程</li>
<li>模型微调数据准备</li>
<li>模型微调技巧和步骤</li>
<li>全流程落地</li>
</ul> </li>
</ul>
<p><strong>6) 项目资源池</strong></p>
<ul>
<li>为了维持项目的健康发展,部分项目组织者(个人和企业)提供 10 万元作为开源项目资金池,以及提供项目算力、数据和模型支持。</li>
<li>我们欢迎所有受益于本项目的个人或单位来赞助本项目,包括且不限于以上内容,欢迎<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/#%E5%BC%80%E6%BA%90%E8%B5%9E%E5%8A%A9">联系我们</a>。</li>
</ul>
<h3>2. 开源进度</h3>
<p><strong>第一期:</strong></p>
<ul>
<li><input type="checkbox" checked disabled> <a href="https://tianchi.aliyun.com/competition/entrance/532126">组织 SMP 2023 ChatGLM 金融大模型挑战赛</a></li>
<li><input type="checkbox" disabled> <strong>比赛数据集开源</strong>
<ul>
<li>年报数据集
<ul>
<li><input type="checkbox" checked disabled> <a href="https://modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset/summary">PDF 文件</a>。包含 11588 份 2019 年至 2021 年期间的部分上市公司年度报告。</li>
<li><input type="checkbox" checked disabled> <a href="https://modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset/summary">TXT 文件</a>。利用 <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/tool/pdf_to_txt"><code>pdf2txt.py</code></a> 对 PDF 文件解析而来。</li>
<li><input type="checkbox" checked disabled> <a href="https://modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset/summary">HTML 文件</a>。</li>
</ul> </li>
<li>数据库接入
<ul>
<li><input type="checkbox" disabled> sqlite</li>
<li><input type="checkbox" disabled> mongodb</li>
</ul> </li>
</ul> </li>
<li><input type="checkbox" checked disabled> 决赛项目开源:
<ul>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E9%A6%92%E5%A4%B4%E7%A7%91%E6%8A%80">馒头科技</a></li>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E5%8D%97%E5%93%AA%E9%83%BD%E9%98%9F">南哪都队</a></li>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/Chatglm%E5%8F%8D%E5%8D%B7%E6%80%BB%E5%B1%80">Chatglm反卷总局</a></li>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/nsddd">nsddd</a></li>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E9%BE%99%E7%9B%88%E6%88%98%E9%98%9F">龙盈战队</a></li>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E7%BB%93%E5%A9%9A%E4%B9%B0%E6%88%BF%E4%BB%A3%E4%BB%A3%E9%9F%AD%E8%8F%9C">结婚买房代代韭菜</a></li>
<li><input type="checkbox" checked disabled> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/.code/finglm_all">安硕硕眼探企</a></li>
</ul> </li>
</ul>
<p><strong>第二期:</strong></p>
<ul>
<li><input type="checkbox" disabled> 微调Fintune</li>
<li><input type="checkbox" disabled> 完善nl2sql</li>
<li><input type="checkbox" disabled> 增加学习教程
<ul>
<li><input type="checkbox" disabled> 数据预处理教程</li>
<li><input type="checkbox" disabled> 数据库使用教程</li>
<li><input type="checkbox" disabled> GLM的使用教程</li>
<li><input type="checkbox" disabled> Prompt编写教程</li>
<li><input type="checkbox" disabled> 模型微调数据准备</li>
<li><input type="checkbox" disabled> 模型微调技巧和步骤</li>
<li><input type="checkbox" disabled> 全流程落地</li>
</ul> </li>
<li><input type="checkbox" disabled> 问答系统异常处理</li>
<li><input type="checkbox" disabled> 提供详细使用手册</li>
<li><input type="checkbox" disabled> 文档注释完善</li>
</ul>
<hr>
<h2>🏆 开源项目</h2>
<h3>0. FinGLM_all</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/.slides/%E5%AE%89%E7%A1%95%E7%A1%95%E7%9C%BC%E6%8E%A2%E4%BC%81%E5%88%86%E4%BA%AB%E5%8F%8AFinGLM%E5%BC%80%E6%BA%90%E5%8F%91%E5%B8%83.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1ip4y1F7Gw/">[视频]</a><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/finglm_all">[代码]</a></p>
<p>本项目为安硕硕眼探企团队,根据自己的项目以及其他几队的项目整合而成。后续我们也将围绕此项目进行持续迭代升级。</p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/finglm_all.jpg" alt=""></p>
<h3>1. 馒头科技</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/%E9%A6%92%E5%A4%B4%E7%A7%91%E6%8A%80.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV18h4y187UU/">[视频]</a> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E9%A6%92%E5%A4%B4%E7%A7%91%E6%8A%80">[代码]</a> <img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/mantou.jpg" alt="mantou"></p>
<h3>2. 南哪都队</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/%E5%8D%97%E5%93%AA%E9%83%BD%E9%98%9F.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1Gm4y1V7LD/">[视频]</a> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E5%8D%97%E5%93%AA%E9%83%BD%E9%98%9F">[代码]</a></p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/nanna.jpg" alt="nanna"></p>
<h3>3. Chatglm反卷总局</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/ChatGLM%E5%8F%8D%E5%8D%B7%E6%80%BB%E5%B1%80.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1hu4y147EW/">[视频]</a> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/Chatglm%E5%8F%8D%E5%8D%B7%E6%80%BB%E5%B1%80">[代码]</a></p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/chatglmfanjuan.jpg" alt="chatglmfanjuan"></p>
<h3>4. nsddd</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/nsddd.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV15u4y147Xx">[视频]</a> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/nsddd">[代码]</a></p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/nsddd.jpg" alt="nsddd"></p>
<h3>5. 龙盈战队</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/%E9%BE%99%E7%9B%88%E6%88%98%E9%98%9F.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1Ju4y167ew">[视频]</a> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E9%BE%99%E7%9B%88%E6%88%98%E9%98%9F">[代码]</a></p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/longying.jpg" alt="longying"></p>
<h3>6. 结婚买房代代韭菜</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/%E7%BB%93%E5%A9%9A%E4%B9%B0%E6%88%BF%E4%BB%A3%E4%BB%A3%E9%9F%AD%E8%8F%9C.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1rm4y1G7uj">[视频]</a> <a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/code/%E7%BB%93%E5%A9%9A%E4%B9%B0%E6%88%BF%E4%BB%A3%E4%BB%A3%E9%9F%AD%E8%8F%9C">[代码]</a></p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/jiehun1.jpg" alt="jiehun"> <img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/jiehun2.jpg" alt="jiehun2"></p>
<h3>7. TabIsabaopilong</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/TabIsabaopilong.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1894y1a7NJ/">[视频]</a> [代码]</p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/tab1.jpg" alt="tab1"> <img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/tab2.jpg" alt="tab2"></p>
<h3>8. 饺子研究院</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/%E5%90%83%E8%BE%A3%E5%AD%90.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV12z4y1V7S3/?spm_id_from=333.999.0.0&vd_source=df16438efe36af5724526b8869fb54c1">[视频]</a> [代码]</p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/jiaozi.jpg" alt="jiaozi"></p>
<h3>9. 流宝真人</h3>
<p><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/slides/%E6%B5%81%E5%AE%9D%E7%9C%9F%E4%BA%BA.pdf">[PPT]</a> <a href="https://www.bilibili.com/video/BV1QF411m7ap">[视频]</a> [代码]</p>
<p><img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/liubao.jpg" alt="liubao"></p>
<hr>
<h2>📚 数据集</h2>
<h3>1. 年报数据集</h3>
<p>我们开源的数据集涵盖了2019-2021年期间部分上市公司的年度报告。该数据集共包含 11588 个详尽的 PDF 文件(<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/reports/reports_list.csv">list</a>)。您可以利用这些PDF文件的内容来构建您需要的数据库或者向量库。为了避免计算资源浪费,我们也将相应的文件转换成 TXT文件和 HTML文件,供大家使用。</p>
<h4><a href="https://modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset/summary">PDF下载</a></h4>
<blockquote>
<p>大小:69GB 文件格式:pdf文件 文件数量:11588</p>
</blockquote>
<p>git加载</p>
<pre><code># 要求安装 git lfs
git clone http://www.modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset.git
</code></pre>
<p>sdk加载</p>
<pre><code># Note:
# 1. 【重要】请将modelscope sdk升级到v1.7.2rc0,执行: pip3 install "modelscope==1.7.2rc0" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
# 2. 【重要】datasets版本限制为 >=2.8.0, <=2.13.0,可执行: pip3 install datasets==2.13.0
from modelscope.msdatasets import MsDataset
# 使用流式方式加载「推荐」
# 无需全量加载到cache,随下随处理
# 其中,通过设置 stream_batch_size 可以使用batch的方式加载
ds = MsDataset.load('chatglm_llm_fintech_raw_dataset', split='train', use_streaming=True, stream_batch_size=1)
for item in ds:
print(item)
# 加载结果示例(单条,pdf:FILE字段值为该pdf文件本地缓存路径,文件名做了SHA转码,可以直接打开)
{'name': ['2020-03-24__北京鼎汉技术集团股份有限公司__300011__鼎汉技术__2019年__年度报告.pdf'], 'pdf:FILE': ['~/.cache/modelscope/hub/datasets/modelscope/chatglm_llm_fintech_raw_dataset/master/data_files/430da7c46fb80d4d095a57b4fb223258ffa1afe8bf53d0484e3f2650f5904b5c']}
# 备注:
1. 自定义缓存路径,可以自行设置cache_dir参数,即 MsDataset.load(..., cache_dir='/to/your/path')
2. 补充数据加载(从9493条增加到11588条),sdk加载注意事项
a) 删除缓存中的csv映射文件(默认路径为): ~/.cache/modelscope/hub/datasets/modelscope/chatglm_llm_fintech_raw_dataset/master/data_files/732dc4f3b18fc52380371636931af4c8
b) 使用MsDataset.load(...) 加载,默认会reuse已下载过的文件,不会重复下载。
</code></pre>
<h4><a href="https://modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset/summary">TXT下载</a></h4>
<p>Note: pdf转txt格式文件,方便大家复用(有个文件损坏了,所以总数比pdf少1个,共11587 个)</p>
<pre><code># Linux
wget https://sail-moe.oss-cn-hangzhou.aliyuncs.com/open_data/hackathon_chatglm_fintech/alltxt.zip
# Windows示例
Invoke-WebRequest -Uri https://sail-moe.oss-cn-hangzhou.aliyuncs.com/open_data/hackathon_chatglm_fintech/alltxt.zip -OutFile D:\\alltxt.zip
</code></pre>
<h4>HTML下载</h4>
<p>Note: pdf转html格式文件,方便大家复用(有个文件损坏了,所以总数比pdf少,共11582 个)</p>
<pre><code># Linux
wget https://sail-moe.oss-cn-hangzhou.aliyuncs.com/open_data/hackathon_chatglm_fintech/allhtml.zip
# Windows示例
Invoke-WebRequest -Uri https://sail-moe.oss-cn-hangzhou.aliyuncs.com/open_data/hackathon_chatglm_fintech/allhtml.zip -OutFile D:\\allhtml.zip
</code></pre>
<h4>使用建议</h4>
<p>以下是我们推荐的处理步骤:</p>
<p>1、PDF文本和表格提取:您可以使用如pdfplumber、pdfminer等工具包提取PDF文件中的文本和表格数据。</p>
<p>2、数据切分:根据PDF文件的目录、子目录和章节信息,对内容进行精确的切块处理。</p>
<p>3、构建基础金融数据库:依据金融知识和PDF内容,设计专业的金融数据库字段和格式。例如,定义资产负债表、现金流量表和利润表等。</p>
<p>4、信息提取:使用大模型的信息提取能力和NLP技术来抽取对应的金融字段信息。例如,请使用json方式输出目录的内容,其中章节的名称作为key,页码作为value。同时,请详细地抽取表格内的数据,以JSON格式输出。</p>
<p>5、构建金融知识问答库:结合构建的金融数据库,应用大模型构建基础的金融问答库。例如,</p>
<pre><code>{"question":"某公司2021年的财务费用为多少元?", "answer": "某公司2021年的财务费用为XXXX元。"}
prompt:用多种句式修改question及answer的内容。
{"question":"为什么财务费用可以是负的?", "answer": ""}
prompt:请模仿上面的question给出100个类似的问题与对应的答案,用json输出。
</code></pre>
<p>6、构建向量库:借助于如Word2Vec、Text2Vec等技术,从原始文本数据中提取出语义向量。使用pgvector这种基于PostgreSQL的扩展来存储和索引这些向量,从而建立起一个可供高效查询的大规模向量库。</p>
<p>7、应用:结合向量库、大模型、langchain等工具,提升应用效果。</p>
<h3>2. 标注数据</h3>
<p>在 <a href="https://tianchi.aliyun.com/competition/entrance/532126">SMP 2023 ChatGLM 金融大模型挑战赛</a> 中我们分别进行了初赛、复赛A、复赛B、复赛C。针对这几轮比赛,我们分别人工标注了相关数据,累计总共有 10000 条。</p>
<ul>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/pre-data">[初赛数据]</a> :5000 条</li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/A-data">[复赛 A 数据]</a> :2000 条</li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/B-data">[复赛 B 数据]</a> :2000 条</li>
<li><a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/C-data">[复赛 C 数据]</a> :1000 条</li>
</ul>
<p>数据示例:</p>
<pre><code class="language-python">{"ID": 1,
"question": "2019年中国工商银行财务费用是多少元?",
"answer":"2019年中国工商银行财务费用是12345678.9元。"}
{"ID": 2,
"question": "工商银行2019年营业外支出和营业外收入分别是多少元?",
"answer": "工商银行2019年营业外支出为12345678.9元,营业外收入为2345678.9元。"}
{"ID":3,
"question": "中国工商银行2021年净利润增长率是多少?保留2位小数。",
"answer": "中国工商银行2020年净利润为12345678.90元,2021年净利润为22345678.90元,根据公式,净利润增长率=(净利润-上年净利润)/上年净利润,得出结果中国工商银行2021年净利润增长率81.00%。" }
</code></pre>
<p>与此同时,我们也针对比赛撰写了<a href="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/data/evaluate.py">评测代码</a>。我们依据:</p>
<pre><code class="language-math">
\begin{array}{ll}
max_{similar}(sentence1,sentence2,sentence3), & 无基础信息及关键词\\
0.25+0.25+max_{similar}(sentence1,sentence2,sentence3)*0.5, & 基础信息正确,关键词正确 \\
0.25 + 0 + max_{similar}(sentence1,sentence2,sentence3)*0.5, & 基础信息正确,关键词错误\\
0, & 基础信息错误
\end{array}
</code></pre>
<p>评测示例:</p>
<pre><code class="language-python">{"question": "2019年中国工商银行财务费用是多少元?",
"prompt": {"财务费用": "12345678.9元", "key_word":"财务费用、2019", "prom_answer": "12345678.9元"},
"answer": [
"2019年中国工商银行财务费用是12345678.9元。",
"2019年工商银行财务费用是12345678.9元。",
"中国工商银行2019年的财务费用是12345678.9元。" ]
}
</code></pre>
<p>评测计算示例:</p>
<p><strong>答案一:工商银行2019年财务费用是12345678.9元。</strong></p>
<p>most similar sentences:</p>
<p>2019年工商银行财务费用是12345678.9元。 (Score: 0.9915)</p>
<p>中国工商银行2019年的财务费用是12345678.9元。 (Score: 0.9820)</p>
<p>2019年中国工商银行财务费用是12345678.9元。 (Score: 0.9720)</p>
<p>评分:0.25+0.25+0.9915*0.5=0.9958分。</p>
<blockquote>
<p>评分解释:prom_answer正确、包含所有key_word、相似度最高0.9915。</p>
</blockquote>
<p><strong>答案二:2019年中国工商银行财务费用是335768.91元。</strong></p>
<p>评分:0分。</p>
<blockquote>
<p>评分解释:prom_answer错误不得分。</p>
</blockquote>
<p><strong>答案三:12345678.9元。</strong></p>
<p>most similar sentences:</p>
<p>2019年工商银行财务费用是12345678.9元。 (Score: 0.6488)</p>
<p>2019年中国工商银行财务费用是12345678.9元。 (Score: 0.6409)</p>
<p>中国工商银行2019年的财务费用是12345678.9元。 (Score: 0.6191)</p>
<p>评分:0.25+0+0.6488*0.5=0.5744分。</p>
<blockquote>
<p>评分解释:prom_answer正确、未包含所有key_word、相似度最高0.6488。</p>
</blockquote>
<h2>📊 项目问答演示</h2>
<pre><code class="language-python">{"id": 0, "question": "2021年其他流动资产第12高的是哪家上市公司?", "answer": "2021年其他流动资产第12高的公司是苏美达股份有限公司。"}
{"id": 1, "question": "注册地址在重庆的上市公司中,2021年营业收入大于5亿的有多少家?", "answer": "2021年注册在重庆,营业收入大于5亿的公司一共有4家。"}
{"id": 2, "question": "广东华特气体股份有限公司2021年的职工总人数为?", "answer": "2021年广东华特气体股份有限公司职工总人数是1044人。"}
{"id": 3, "question": "在保留两位小数的情况下,请计算出金钼股份2019年的流动负债比率", "answer": "2019金钼股份流动负债比率是61.10%。其中流动负债是1068418275.97元;总负债是1748627619.69元;"}
{"id": 4, "question": "2019年负债总金额最高的上市公司为?", "answer": "2019年负债合计最高的是上海汽车集团股份有限公司。"}
{"id": 5, "question": "2019年总资产最高的前五家上市公司是哪些家?", "answer": "2019年资产总计最高前五家是上海汽车集团股份有限公司、中远海运控股股份有限公司、国投电力控股股份有限公司、华域汽车系统股份有限公司、广州汽车集团股份有限公司。"}
{"id": 6, "question": "2020年营业收入最高的3家并且曾经在宁波注册的上市公司是?金额是?", "answer": "注册在宁波,2020年营业收入最高的3家是宁波均胜电子股份有限公司营业收入47889837616.15元;宁波建工股份有限公司营业收入19796854240.57元;宁波继峰汽车零部件股份有限公司营业收入15732749552.37元。"}
{"id": 7, "question": "注册地址在苏州的上市公司中,2020年利润总额大于5亿的有多少家?", "answer": "2020年注册在苏州,利润总额大于5亿的公司一共有2家。"}
{"id": 8, "question": "浙江运达风电股份有限公司在2019年的时候应收款项融资是多少元?", "answer": "2019年浙江运达风电股份有限公司应收款项融资是51086824.07元。"}
{"id": 9, "question": "神驰机电股份有限公司2020年的注册地址为?", "answer": "2020年神驰机电股份有限公司注册地址是重庆市北碚区童家溪镇同兴北路200号。"}
{"id": 10, "question": "2019年山东惠发食品股份有限公司营业外支出和营业外收入分别是多少元?", "answer": "2019年山东惠发食品股份有限公司营业外收入是1018122.97元;营业外支出是2513885.46元。"}
{"id": 11, "question": "福建广生堂药业股份有限公司2020年年报中提及的财务费用增长率具体是什么?", "answer": "2020福建广生堂药业股份有限公司财务费用增长率是34.33%。其中,财务费用是7766850.48元;上年财务费用是5781839.51元。"}
{"id": 12, "question": "华灿光电股份有限公司2021年的法定代表人与上年相比相同吗?", "answer": "不相同,华灿光电股份有限公司2020年法定代表人是俞信华,2021年法定代表人是郭瑾。"}
{"id": 13, "question": "请具体描述一下2020年仲景食品控股股东是否发生变更。", "answer": "2020年,仲景食品控股股东没有发生变更。"}
{"id": 14, "question": "什么是其他债权投资?", "answer": "其他债权投资是指企业或机构投资者通过购买债券、贷款、定期存款等金融产品获得的固定收益。这些金融产品通常由政府、公司或其他机构发行,具有一定的信用等级和风险。\n\n其他债权投资是企业或机构投资组合中的一部分,通常用于稳定收益和分散风险。与股票投资相比,其他债权投资的风险较低,但收益也相对较低。\n\n其他债权投资的管理和投资策略与其他资产类别类似,包括分散投资、风险控制、收益最大化等。然而,由于其他债权投资的种类繁多,其投资和管理也存在一定的特殊性。"}
</code></pre>
<h2>🤝 贡献者</h2>
<p>以下是为本项目做出贡献的团队和个人:</p>
<ul>
<li>🌟 安硕硕眼探企</li>
<li>🌟 馒头科技</li>
<li>🌟 南哪都队</li>
<li>🌟 Chatglm反卷总局</li>
<li>🌟 nsddd</li>
<li>🌟 龙盈战队</li>
<li>🌟 结婚买房代代韭菜</li>
<li>🌟 小打小闹</li>
<li>🌟 东北大土豆</li>
<li>🌟 ... 更多贡献者</li>
</ul>
<p>FinGLM 开源项目出于完全公益目的,欢迎所有开发者申请加入,当然我们会进行严格审核。如有意向,请填写 <a href="https://lslfd0slxc.feishu.cn/share/base/form/shrcncipvYdAVitiTqNqxwIjglc">表单</a> 。</p>
<h2>免责声明</h2>
<p>本项目相关资源仅供研究、交流使用,一般不建议用于商业用途;如用于商业用途,由此所带来的法律风险,请自行承担。</p>
<p>涉及到模型商业使用问题,请务必遵循相关模型的协议,例如 <a href="https://github.com/THUDM/ChatGLM-6B">ChatGLM-6B</a>。</p>
<h2>🔍 项目联系</h2>
<h3>项目交流群</h3>
<img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/qun.png" alt="项目答疑群" width="200" height="200" title="项目答疑群">
<h3>开源赞助</h3>
<img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/jw.jpg" alt="开源赞助联系人" width="200" height="200" title="开源赞助联系人">
<h3>开源贡献</h3>
<img src="https://raw.githubusercontent.com/MetaGLM/FinGLM/main/img/jl.png" alt="开源贡献联系人" width="200" height="200" title="开源贡献联系人">
- microsoft/ToRA
- 2023-10-10T01:37:46Z
- tag:github.com,2023-10-10:/microsoft/ToRA
-
- <p>ToRA is a series of Tool-integrated Reasoning LLM Agents designed to solve challenging mathematical reasoning problems by interacting with tools.</p><hr><h1 align="center"> <img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="100" alt="ToRA"> <br> ToRA: A Tool-Integrated Reasoning Agent </h1>
<div align="center">
<p><img src="https://img.shields.io/badge/Task-Mathematical%20Reasoning-orange" alt=""> <img src="https://img.shields.io/badge/Model-Released-blue" alt=""> <img src="https://img.shields.io/badge/Code%20License-MIT-green" alt=""></p>
</div>
<p align="center"> <a href="https://microsoft.github.io/ToRA/"><b>[🌐 Website]</b></a> • <a href="https://arxiv.org/abs/2309.17452"><b>[📜 Paper]</b></a> • <a href="https://huggingface.co/llm-agents"><b>[🤗 HF Models]</b></a> • <a href="https://github.com/microsoft/ToRA"><b>[🐱 GitHub]</b></a> <br> <a href="https://twitter.com/zhs05232838/status/1708860992631763092"><b>[🐦 Twitter]</b></a> • <a href="https://www.reddit.com/r/LocalLLaMA/comments/1703k6d/tora_a_toolintegrated_reasoning_agent_for/"><b>[💬 Reddit]</b></a> • <a href="https://notes.aimodels.fyi/researchers-announce-tora-training-language-models-to-better-understand-math-using-external-tools/">[🍀 Unofficial Blog]</a>
<!-- <a href="#-quick-start">Quick Start</a> • -->
<!-- <a href="#%EF%B8%8F-citation">Citation</a> --> </p>
<p align="center"> Repo for "<a href="https://arxiv.org/abs/2309.17452" target="_blank">ToRA: A Tool-Integrated Reasoning Agent for Mathematical Problem Solving</a>" </p>
<p align="center"> <img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/math_gsm_hist.png" width="1000"> <br> <em>Figure 1: Comparing ToRA with baselines on LLaMA-2 base models from 7B to 70B.</em> </p>
<h2>🔥 News</h2>
<ul>
<li>[2023/10/08] 🔥🔥🔥 All ToRA models released at <a href="https://huggingface.co/llm-agents">🤗 HuggingFace</a>!!!</li>
<li>[2023/09/29] ToRA paper, repo, and website released.</li>
</ul>
<h2>💡 Introduction</h2>
<p>ToRA is a series of Tool-integrated Reasoning Agents designed to solve challenging mathematical reasoning problems by interacting with tools, e.g., computation libraries and symbolic solvers. ToRA series seamlessly integrate natural language reasoning with the utilization of external tools, thereby amalgamating the analytical prowess of language and the computational efficiency of external tools.</p>
<table>
<thead>
<tr>
<th>Model</th>
<th>Size</th>
<th>GSM8k</th>
<th>MATH</th>
<th>AVG@10 math tasks<sup>†</sup></th>
</tr>
</thead>
<tbody>
<tr>
<td>GPT-4</td>
<td>-</td>
<td>92.0</td>
<td>42.5</td>
<td>78.3</td>
</tr>
<tr>
<td>GPT-4 (PAL)</td>
<td>-</td>
<td>94.2</td>
<td>51.8</td>
<td>86.4</td>
</tr>
<tr>
<td><a href="https://huggingface.co/llm-agents/tora-7b-v1.0"><img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="16" alt="ToRA"> ToRA-7B</a></td>
<td>7B</td>
<td>68.8</td>
<td>40.1</td>
<td>62.4</td>
</tr>
<tr>
<td><a href="https://huggingface.co/llm-agents/tora-code-7b-v1.0"><img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="16" alt="ToRA"> ToRA-Code-7B</a></td>
<td>7B</td>
<td>72.6</td>
<td>44.6</td>
<td>66.5</td>
</tr>
<tr>
<td><a href="https://huggingface.co/llm-agents/tora-13b-v1.0"><img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="16" alt="ToRA"> ToRA-13B</a></td>
<td>13B</td>
<td>72.7</td>
<td>43.0</td>
<td>65.9</td>
</tr>
<tr>
<td><a href="https://huggingface.co/llm-agents/tora-code-13b-v1.0"><img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="16" alt="ToRA"> ToRA-Code-13B</a></td>
<td>13B</td>
<td>75.8</td>
<td>48.1</td>
<td>71.3</td>
</tr>
<tr>
<td><a href="https://huggingface.co/llm-agents/tora-code-34b-v1.0"><img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="16" alt="ToRA"> ToRA-Code-34B<sup>*</sup></a></td>
<td>34B</td>
<td>80.7</td>
<td><strong>51.0</strong></td>
<td>74.8</td>
</tr>
<tr>
<td><a href="https://huggingface.co/llm-agents/tora-70b-v1.0"><img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/tora_logo.png" width="16" alt="ToRA"> ToRA-70B</a></td>
<td>70B</td>
<td><strong>84.3</strong></td>
<td>49.7</td>
<td><strong>76.9</strong></td>
</tr>
</tbody>
</table>
<ul>
<li> <p><sup>*</sup>ToRA-Code-34B is currently the first and only open-source model to achieve over 50% accuracy (pass@1) on the MATH dataset, which significantly outperforms GPT-4’s CoT result (51.0 vs. 42.5), and is competitive with GPT-4 solving problems with programs. By open-sourcing our codes and models, we hope more breakthroughs will come!</p> </li>
<li> <p><sup>†</sup>10 math tasks include GSM8k, MATH, GSM-Hard, SVAMP, TabMWP, ASDiv, SingleEQ, SingleOP, AddSub, and MultiArith.</p> </li>
</ul>
<h3>Tool-Integrated Reasoning</h3>
<p align="center"> <img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/example.png" width="800"> <br> <em>Figure 2: A basic example of single-round tool interaction, which interleaves rationales with program-based tool use.</em> </p>
<h3>ToRA Training Pipeline</h3>
<p align="center"> <img src="https://raw.githubusercontent.com/microsoft/ToRA/main/docs/static/images/pipeline.png" width="800"> <br> <em>Figure 3: Training ToRA contains ① Imitation Learning, and ② output space shaping.</em> </p>
<h2>🚀 Quick Start</h2>
<h3>⚙️ Setup</h3>
<p>We recommend using <a href="https://docs.conda.io/projects/miniconda">Conda</a> to manage your environment. We use <a href="https://github.com/vllm-project/vllm">vLLM</a> (0.1.4) to accelerate inference. Run the following commands to setup your environment:</p>
<pre><code class="language-sh">git clone https://github.com/microsoft/ToRA.git && cd ToRA/src
conda create -n tora python=3.10
conda activate tora
pip install torch==2.0.1 --index-url https://download.pytorch.org/whl/cu118 # CUDA 11.8 for example
pip install -r requirements.txt
</code></pre>
<h3>🪁 Inference</h3>
<p>We provide a script for inference, simply config the <code>MODEL_NAME_OR_PATH</code> and <code>DATA</code> in <a href="https://raw.githubusercontent.com/microsoft/ToRA/main/src/scripts/infer.sh">src/scripts/infer.sh</a> and run the following command:</p>
<pre><code class="language-sh">bash scritps/infer.sh
</code></pre>
<p>We also open-source the <a href="https://raw.githubusercontent.com/microsoft/ToRA/main/src/outputs/llm-agents/">model outputs</a> from our best models (ToRA-Code-34B and ToRA-70B) in the <code>src/outputs/</code> folder.</p>
<h3>⚖️ Evaluation</h3>
<p>The <a href="https://raw.githubusercontent.com/microsoft/ToRA/main/src/eval/">src/eval/grader.py</a> file contains the grading logic that assesses the accuracy of the predicted answer by comparing it to the ground truth. This logic is developed based on the Hendrycks' MATH grading system, which we have manually verified on the MATH dataset to minimize false positives and false negatives.</p>
<p>To evaluate the predicted answer, run the following command:</p>
<pre><code class="language-sh">python -m eval.evaluate \
--data_name "math" \
--prompt_type "tora" \
--file_path "outputs/llm-agents/tora-code-34b-v1.0/math/test_tora_-1_seed0_t0.0_s0_e5000.jsonl" \
--execute
</code></pre>
<p>then you will get:</p>
<pre><code>Num samples: 5000
Num scores: 5000
Timeout samples: 0
Empty samples: 2
Mean score: [51.0]
Type scores: {'Algebra': 67.3, 'Counting & Probability': 42.2, 'Geometry': 26.1, 'Intermediate Algebra': 40.0, 'Number Theory': 59.3, 'Prealgebra': 63.8, 'Precalculus': 34.2}
</code></pre>
<h3>⚡️ Training</h3>
<p>Due to some restrictions, ToRA-Corpus 16k is under review and cannot be released immediately. However, we open-source our complete training scripts as well as <em>output space shaping</em> pipelines for the community, and you may construct your own dataset for training.</p>
<p>To train a model, run the following command:</p>
<pre><code class="language-sh">bash scritps/train.sh codellama 7b
</code></pre>
<h2>☕️ Citation</h2>
<p>If you find this repository helpful, please consider citing our paper:</p>
<pre><code>@misc{gou2023tora,
title={ToRA: A Tool-Integrated Reasoning Agent for Mathematical Problem Solving},
author={Zhibin Gou and Zhihong Shao and Yeyun Gong and yelong shen and Yujiu Yang and Minlie Huang and Nan Duan and Weizhu Chen},
year={2023},
eprint={2309.17452},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
</code></pre>
<h2>🍀 Contributing</h2>
<p>This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit <a href="https://cla.opensource.microsoft.com">https://cla.opensource.microsoft.com</a>.</p>
<p>This project has adopted the <a href="https://opensource.microsoft.com/codeofconduct/">Microsoft Open Source Code of Conduct</a>. For more information see the <a href="https://opensource.microsoft.com/codeofconduct/faq/">Code of Conduct FAQ</a> or contact <a href="mailto:opencode@microsoft.com">opencode@microsoft.com</a> with any additional questions or comments.</p>
<h2>🌟 Star History</h2>
<p><a href="https://star-history.com/#microsoft/ToRA&Date"><img src="https://api.star-history.com/svg?repos=microsoft/ToRA&type=Date" alt="Star History Chart"></a></p>
-
-
- cvg/glue-factory
- 2023-10-10T01:37:46Z
- tag:github.com,2023-10-10:/cvg/glue-factory
-
- <p>Training library for local feature detection and matching</p><hr><h1>Glue Factory</h1>
<p>Glue Factory is CVG's library for training and evaluating deep neural network that extract and match local visual feature. It enables you to:</p>
<ul>
<li>Reproduce the training of state-of-the-art models for point and line matching, like <a href="https://github.com/cvg/LightGlue">LightGlue</a> and <a href="https://github.com/cvg/GlueStick">GlueStick</a> (ICCV 2023)</li>
<li>Train these models on multiple datasets using your own local features or lines</li>
<li>Evaluate feature extractors or matchers on standard benchmarks like HPatches or MegaDepth-1500</li>
</ul>
<p align="center"> <a href="https://github.com/cvg/LightGlue"><img src="https://raw.githubusercontent.com/cvg/glue-factory/main/docs/lightglue_matches.svg?sanitize=true" width="60%"></a> <a href="https://github.com/cvg/GlueStick"><img src="https://raw.githubusercontent.com/cvg/glue-factory/main/docs/gluestick_img.svg?sanitize=true" width="60%"></a> <br><em>Point and line matching with LightGlue and GlueStick.</em> </p>
<h2>Installation</h2>
<p>Glue Factory runs with Python 3 and <a href="https://pytorch.org/">PyTorch</a>. The following installs the library and its basic dependencies:</p>
<pre><code class="language-bash">git clone https://github.com/cvg/glue-factory
cd glue-factory
python3 -m pip install -e . # editable mode
</code></pre>
<p>Some advanced features might require installing the full set of dependencies:</p>
<pre><code class="language-bash">python3 -m pip install -e .[extra]
</code></pre>
<p>All models and datasets in gluefactory have auto-downloaders, so you can get started right away!</p>
<h2>License</h2>
<p>The code and trained models in Glue Factory are released with an Apache-2.0 license. This includes LightGlue trained with an <a href="https://github.com/rpautrat/SuperPoint">open version of SuperPoint</a>. Third-party models that are not compatible with this license, such as SuperPoint (original) and SuperGlue, are provided in <code>gluefactory_nonfree</code>, where each model might follow its own, restrictive license.</p>
<h2>Evaluation</h2>
<h4>HPatches</h4>
<p>Running the evaluation commands automatically downloads the dataset, by default to the directory <code>data/</code>. You will need about 1.8 GB of free disk space.</p>
<details>
<summary>[Evaluating LightGlue]</summary>
<p>To evaluate the pre-trained SuperPoint+LightGlue model on HPatches, run:</p>
<pre><code class="language-bash">python -m gluefactory.eval.hpatches --conf superpoint+lightglue-official --overwrite
</code></pre>
<p>You should expect the following results</p>
<pre><code>{'H_error_dlt@1px': 0.3515,
'H_error_dlt@3px': 0.6723,
'H_error_dlt@5px': 0.7756,
'H_error_ransac@1px': 0.3428,
'H_error_ransac@3px': 0.5763,
'H_error_ransac@5px': 0.6943,
'mnum_keypoints': 1024.0,
'mnum_matches': 560.756,
'mprec@1px': 0.337,
'mprec@3px': 0.89,
'mransac_inl': 130.081,
'mransac_inl%': 0.217,
'ransac_mAA': 0.5378}
</code></pre>
<p>The default robust estimator is <code>opencv</code>, but we strongly recommend to use <code>poselib</code> instead:</p>
<pre><code class="language-bash">python -m gluefactory.eval.hpatches --conf superpoint+lightglue-official --overwrite \
eval.estimator=poselib eval.ransac_th=-1
</code></pre>
<p>Setting <code>eval.ransac_th=-1</code> auto-tunes the RANSAC inlier threshold by running the evaluation with a range of thresholds and reports results for the optimal value. Here are the results as Area Under the Curve (AUC) of the homography error at 1/3/5 pixels:</p>
<table>
<thead>
<tr>
<th>Methods</th>
<th>DLT</th>
<th><a href="https://raw.githubusercontent.com/cvg/glue-factory/gluefactory/robust_estimators/homography/opencv.py">OpenCV</a></th>
<th><a href="https://raw.githubusercontent.com/cvg/glue-factory/gluefactory/robust_estimators/homography/poselib.py">PoseLib</a></th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://raw.githubusercontent.com/cvg/glue-factory/gluefactory/configs/superpoint+superglue.yaml">SuperPoint + SuperGlue</a></td>
<td>32.1 / 65.0 / 75.7</td>
<td>32.9 / 55.7 / 68.0</td>
<td>37.0 / 68.2 / 78.7</td>
</tr>
<tr>
<td><a href="https://raw.githubusercontent.com/cvg/glue-factory/gluefactory/configs/superpoint+lightglue.yaml">SuperPoint + LightGlue</a></td>
<td>35.1 / 67.2 / 77.6</td>
<td>34.2 / 57.9 / 69.9</td>
<td>37.1 / 67.4 / 77.8</td>
</tr>
</tbody>
</table>
</details>
<details>
<summary>[Evaluating GlueStick]</summary>
<p>To evaluate GlueStick on HPatches, run:</p>
<pre><code class="language-bash">python -m gluefactory.eval.hpatches --conf gluefactory/configs/superpoint+lsd+gluestick.yaml --overwrite
</code></pre>
<p>You should expect the following results</p>
<pre><code>{"mprec@1px": 0.245,
"mprec@3px": 0.838,
"mnum_matches": 1290.5,
"mnum_keypoints": 2287.5,
"mH_error_dlt": null,
"H_error_dlt@1px": 0.3355,
"H_error_dlt@3px": 0.6637,
"H_error_dlt@5px": 0.7713,
"H_error_ransac@1px": 0.3915,
"H_error_ransac@3px": 0.6972,
"H_error_ransac@5px": 0.7955,
"H_error_ransac_mAA": 0.62806,
"mH_error_ransac": null}
</code></pre>
<p>Since we use points and lines to solve for the homography, we use a different robust estimator here: <a href="https://github.com/rpautrat/homography_est/">Hest</a>. Here are the results as Area Under the Curve (AUC) of the homography error at 1/3/5 pixels:</p>
<table>
<thead>
<tr>
<th>Methods</th>
<th>DLT</th>
<th><a href="https://raw.githubusercontent.com/cvg/glue-factory/main/gluefactory/robust_estimators/homography/homography_est.py">Hest</a></th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://raw.githubusercontent.com/cvg/glue-factory/main/gluefactory/configs/superpoint+lsd+gluestick.yaml">SP + LSD + GlueStick</a></td>
<td>33.6 / 66.4 / 77.1</td>
<td>39.2 / 69.7 / 79.6</td>
</tr>
</tbody>
</table>
</details>
<h4>MegaDepth-1500</h4>
<p>Running the evaluation commands automatically downloads the dataset, which takes about 1.5 GB of disk space.</p>
<details>
<summary>[Evaluating LightGlue]</summary>
<p>To evaluate the pre-trained SuperPoint+LightGlue model on MegaDepth-1500, run:</p>
<pre><code class="language-bash">python -m gluefactory.eval.megadepth1500 --conf superpoint+lightglue-official
# or the adaptive variant
python -m gluefactory.eval.megadepth1500 --conf superpoint+lightglue-official \
model.matcher.{depth_confidence=0.95,width_confidence=0.95}
</code></pre>
<p>The first command should print the following results</p>
<pre><code>{'mepi_prec@1e-3': 0.795,
'mepi_prec@1e-4': 0.15,
'mepi_prec@5e-4': 0.567,
'mnum_keypoints': 2048.0,
'mnum_matches': 613.287,
'mransac_inl': 280.518,
'mransac_inl%': 0.442,
'rel_pose_error@10°': 0.681,
'rel_pose_error@20°': 0.8065,
'rel_pose_error@5°': 0.5102,
'ransac_mAA': 0.6659}
</code></pre>
<p>To use the PoseLib estimator:</p>
<pre><code class="language-bash">python -m gluefactory.eval.megadepth1500 --conf superpoint+lightglue-official \
eval.estimator=poselib eval.ransac_th=2.0
</code></pre>
</details>
<details>
<summary>[Evaluating GlueStick]</summary>
<p>To evaluate the pre-trained SuperPoint+GlueStick model on MegaDepth-1500, run:</p>
<pre><code class="language-bash">python -m gluefactory.eval.megadepth1500 --conf gluefactory/configs/superpoint+lsd+gluestick.yaml
</code></pre>
</details>
<details>
<p>Here are the results as Area Under the Curve (AUC) of the pose error at 5/10/20 degrees:</p>
<table>
<thead>
<tr>
<th>Methods</th>
<th><a href="https://raw.githubusercontent.com/cvg/glue-factory/gluefactory/robust_estimators/relative_pose/pycolmap.py">pycolmap</a></th>
<th><a href="https://raw.githubusercontent.com/cvg/glue-factory/gluefactory/robust_estimators/relative_pose/opencv.py">OpenCV</a></th>
<th><a href="https://raw.githubusercontent.com/cvg/glue-factory/gluefactory/robust_estimators/relative_pose/poselib.py">PoseLib</a></th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://raw.githubusercontent.com/cvg/glue-factory/gluefactory/configs/superpoint+superglue.yaml">SuperPoint + SuperGlue</a></td>
<td>54.4 / 70.4 / 82.4</td>
<td>48.7 / 65.6 / 79.0</td>
<td>64.8 / 77.9 / 87.0</td>
</tr>
<tr>
<td><a href="https://raw.githubusercontent.com/cvg/glue-factory/gluefactory/configs/superpoint+lightglue.yaml">SuperPoint + LightGlue</a></td>
<td>56.7 / 72.4 / 83.7</td>
<td>51.0 / 68.1 / 80.7</td>
<td>66.8 / 79.3 / 87.9</td>
</tr>
<tr>
<td><a href="https://raw.githubusercontent.com/cvg/glue-factory/gluefactory/configs/superpoint+lsd+gluestick.yaml">SuperPoint + GlueStick</a></td>
<td>53.2 / 69.8 / 81.9</td>
<td>46.3 / 64.2 / 78.1</td>
<td>64.4 / 77.5 / 86.5</td>
</tr>
</tbody>
</table>
</details>
<h4>ETH3D</h4>
<p>The dataset will be auto-downloaded if it is not found on disk, and will need about 6 GB of free disk space.</p>
<details>
<summary>[Evaluating GlueStick]</summary>
<p>To evaluate GlueStick on ETH3D, run:</p>
<pre><code class="language-bash">python -m gluefactory.eval.eth3d --conf gluefactory/configs/superpoint+lsd+gluestick.yaml
</code></pre>
<p>You should expect the following results</p>
<pre><code>AP: 77.92
AP_lines: 69.22
</code></pre>
</details>
<h4>Image Matching Challenge 2021</h4>
<p>Coming soon!</p>
<h4>Image Matching Challenge 2023</h4>
<p>Coming soon!</p>
<h4>Visual inspection</h4>
<details>
To inspect the evaluation visually, you can run:
<pre><code class="language-bash">python -m gluefactory.eval.inspect hpatches superpoint+lightglue-official
</code></pre>
<p>Click on a point to visualize matches on this pair.</p>
<p>To compare multiple methods on a dataset:</p>
<pre><code class="language-bash">python -m gluefactory.eval.inspect hpatches superpoint+lightglue-official superpoint+superglue-official
</code></pre>
<p>All current benchmarks are supported by the viewer.</p>
</details>
<p>Detailed evaluation instructions can be found <a href="https://raw.githubusercontent.com/cvg/glue-factory/main/docs/evaluation.md">here</a>.</p>
<h2>Training</h2>
<p>We generally follow a two-stage training:</p>
<ol>
<li>Pre-train on a large dataset of synthetic homographies applied to internet images. We use the 1M-image distractor set of the Oxford-Paris retrieval dataset. It requires about 450 GB of disk space.</li>
<li>Fine-tune on the MegaDepth dataset, which is based on PhotoTourism pictures of popular landmarks around the world. It exhibits more complex and realistic appearance and viewpoint changes. It requires about 420 GB of disk space.</li>
</ol>
<p>All training commands automatically download the datasets.</p>
<details>
<summary>[Training LightGlue]</summary>
<p>We show how to train LightGlue with <a href="https://github.com/rpautrat/SuperPoint">SuperPoint open</a>. We first pre-train LightGlue on the homography dataset:</p>
<pre><code class="language-bash">python -m gluefactory.train sp+lg_homography \ # experiment name
--conf gluefactory/configs/superpoint-open+lightglue_homography.yaml
</code></pre>
<p>Feel free to use any other experiment name. By default the checkpoints are written to <code>outputs/training/</code>. The default batch size of 128 corresponds to the results reported in the paper and requires 2x 3090 GPUs with 24GB of VRAM each as well as PyTorch >= 2.0 (FlashAttention). Configurations are managed by <a href="https://omegaconf.readthedocs.io/">OmegaConf</a> so any entry can be overridden from the command line. If you have PyTorch < 2.0 or weaker GPUs, you may thus need to reduce the batch size via:</p>
<pre><code class="language-bash">python -m gluefactory.train sp+lg_homography \
--conf gluefactory/configs/superpoint-open+lightglue_homography.yaml \
data.batch_size=32 # for 1x 1080 GPU
</code></pre>
<p>Be aware that this can impact the overall performance. You might need to adjust the learning rate accordingly.</p>
<p>We then fine-tune the model on the MegaDepth dataset:</p>
<pre><code class="language-bash">python -m gluefactory.train sp+lg_megadepth \
--conf gluefactory/configs/superpoint-open+lightglue_megadepth.yaml \
train.load_experiment=sp+lg_homography
</code></pre>
<p>Here the default batch size is 32. To speed up training on MegaDepth, we suggest to cache the local features before training (requires around 150 GB of disk space):</p>
<pre><code class="language-bash"># extract features
python -m gluefactory.scripts.export_megadepth --method sp_open --num_workers 8
# run training with cached features
python -m gluefactory.train sp+lg_megadepth \
--conf gluefactory/configs/superpoint-open+lightglue_megadepth.yaml \
train.load_experiment=sp+lg_homography \
data.load_features.do=True
</code></pre>
<p>The model can then be evaluated using its experiment name:</p>
<pre><code class="language-bash">python -m gluefactory.eval.megadepth1500 --checkpoint sp+lg_megadepth
</code></pre>
<p>You can also run all benchmarks after each training epoch with the option <code>--run_benchmarks</code>.</p>
</details>
<details>
<summary>[Training GlueStick]</summary>
<p>We first pre-train GlueStick on the homography dataset:</p>
<pre><code class="language-bash">python -m gluefactory.train gluestick_H --conf gluefactory/configs/superpoint+lsd+gluestick-homography.yaml --distributed
</code></pre>
<p>Feel free to use any other experiment name. Configurations are managed by <a href="https://omegaconf.readthedocs.io/">OmegaConf</a> so any entry can be overridden from the command line.</p>
<p>We then fine-tune the model on the MegaDepth dataset:</p>
<pre><code class="language-bash">python -m gluefactory.train gluestick_MD --conf gluefactory/configs/superpoint+lsd+gluestick-megadepth.yaml --distributed
</code></pre>
<p>Note that we used the training splits <code>train_scenes.txt</code> and <code>valid_scenes.txt</code> to train the original model, which contains some overlap with the IMC challenge. The new default splits are now <code>train_scenes_clean.txt</code> and <code>valid_scenes_clean.txt</code>, without this overlap.</p>
</details>
<h3>Available models</h3>
<p>Glue Factory supports training and evaluating the following deep matchers:</p>
<table>
<thead>
<tr>
<th>Model</th>
<th>Training?</th>
<th>Evaluation?</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://github.com/cvg/LightGlue">LightGlue</a></td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td><a href="https://github.com/cvg/GlueStick">GlueStick</a></td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td><a href="https://github.com/magicleap/SuperGluePretrainedNetwork">SuperGlue</a></td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td><a href="https://github.com/zju3dv/LoFTR">LoFTR</a></td>
<td>❌</td>
<td>✅</td>
</tr>
</tbody>
</table>
<p>Using the following local feature extractors:</p>
<table>
<thead>
<tr>
<th>Model</th>
<th>LightGlue config</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://github.com/rpautrat/SuperPoint">SuperPoint (open)</a></td>
<td><code>superpoint-open+lightglue_{homography,megadepth}.yaml</code></td>
</tr>
<tr>
<td><a href="https://github.com/magicleap/SuperPointPretrainedNetwork">SuperPoint (official)</a></td>
<td>❌ TODO</td>
</tr>
<tr>
<td>SIFT (via <a href="https://github.com/colmap/pycolmap">pycolmap</a>)</td>
<td><code>sift+lightglue_{homography,megadepth}.yaml</code></td>
</tr>
<tr>
<td><a href="https://github.com/Shiaoming/ALIKED">ALIKED</a></td>
<td><code>aliked+lightglue_{homography,megadepth}.yaml</code></td>
</tr>
<tr>
<td><a href="https://github.com/cvlab-epfl/disk">DISK</a></td>
<td>❌ TODO</td>
</tr>
<tr>
<td>Key.Net + HardNet</td>
<td>❌ TODO</td>
</tr>
</tbody>
</table>
<h2>Coming soon</h2>
<ul>
<li><input type="checkbox" disabled> More baselines (LoFTR, ASpanFormer, MatchFormer, SGMNet, DKM, RoMa)</li>
<li><input type="checkbox" disabled> Training deep detectors and descriptors like SuperPoint</li>
<li><input type="checkbox" disabled> IMC evaluations</li>
<li><input type="checkbox" disabled> Better documentation</li>
</ul>
<h2>BibTeX Citation</h2>
<p>Please consider citing the following papers if you found this library useful:</p>
<pre><code class="language-bibtex">@InProceedings{lindenberger_2023_lightglue,
title = {{LightGlue: Local Feature Matching at Light Speed}},
author = {Philipp Lindenberger and
Paul-Edouard Sarlin and
Marc Pollefeys},
booktitle = {International Conference on Computer Vision (ICCV)},
year = {2023}
}
</code></pre>
<pre><code class="language-bibtex">@InProceedings{pautrat_suarez_2023_gluestick,
title = {{GlueStick: Robust Image Matching by Sticking Points and Lines Together}},
author = {R{\'e}mi Pautrat* and
Iago Su{\'a}rez* and
Yifan Yu and
Marc Pollefeys and
Viktor Larsson},
booktitle = {International Conference on Computer Vision (ICCV)},
year = {2023}
}
</code></pre>
+ okuvshynov/slowllama
+ 2023-10-11T01:37:46Z
+ tag:github.com,2023-10-11:/okuvshynov/slowllama
+
+ <p>Finetune llama2-70b and codellama on MacBook Air without quantization</p><hr><h2>slowllama</h2>
<p>Fine-tune Llama2 and CodeLLama models, including 70B/35B on Apple M1/M2 devices (for example, Macbook Air or Mac Mini) or consumer nVidia GPUs.</p>
<p>slowllama is not using any quantization. Instead, it offloads parts of model to SSD or main memory on both forward/backward passes. In contrast with training large models from scratch (unattainable) or inference, where we are likely to care about interactivity, we can still get something finetuned if you let it run for a while.</p>
<p>Current version is using LoRA to limit the updates to a smaller set of parameters. First version supported full finetuning as well, but I decided to remove it for now, more on that below.</p>
<p>Finetuning is the only focus, there's nothing special done for inference, consider <a href="https://github.com/ggerganov/llama.cpp">llama.cpp</a>.</p>
<p>For CUDA-specific experiments, see <a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/docs/a10.md">report on a10</a>.</p>
<p>It is all very experimental, but even more so for CUDA.</p>
<h3>Example</h3>
<p>Tests were done on Apple M1 with 16Gb memory and Apple M2 with 24Gb memory.</p>
<p>In order to fine-tune llama2 model we need to:</p>
<ol>
<li>Install dependencies: <code>pip install torch sentencepiece numpy</code>. Optional: install <code>pip install fewlines</code> for <a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/docs/lora_weights.md">weight/gradient distribution logging</a>.</li>
<li>Clone <a href="https://github.com/facebookresearch/llama">llama2</a> and follow instructions to download the models. The script will download tokenizer as well. <code>tokenizer.model</code> should be put into the same directory as llama model itself. Use <a href="https://github.com/facebookresearch/codellama">codellama</a> for CodeLLama models. Example folder structure could look like:</li>
</ol>
<pre><code>/parent/
/slowllama/... # <- this repo
/codellama/... # <-- this is Meta's codellama repository.
/llama-2-7b/... # <- put tokenizer.model here
/llama-2-13b/... # <- and here
/llama-2-70b/... # <- and here as well
/CodeLlama-34b-Python/... # and here
</code></pre>
<p>Let's start with a <a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/test_data/cubestat.txt">tiny example</a>. It is an intro to the description of another open-source project - <a href="https://github.com/okuvshynov/cubestat">cubestat</a>. Text is short enough to just be included as part of the prompt, but it's ok as an illustration and you can read it in seconds youself. As I just published that project recently, there's no way original llama would know anything about it.</p>
<p>Asking base llama2-7b to complete the prompt <em>"Cubestat reports the following metrics: "</em> results in <em>"1) the number of cubes in the system, 2) the number of cubes that are in the process of being created"</em>.</p>
<p>First step is to transform the model to the sequential format more suitable for loading to/from storage block-by-block.</p>
<pre><code>python prepare_model.py
</code></pre>
<p>Modify the input/output paths in the script itself.</p>
<p>Now we can try not-finetuned llama2:</p>
<pre><code>python test_gen.py ../llama7b mps # use path to transformed model here
</code></pre>
<p>Now let's finetune the 7b model. <a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/finetune.py">finetune.py</a> is a very simple script which trains LoRA weights based on the plaintext data. There are some settings you could change here, like sequence length, batch size, learning rate, dropout rate, number of iterations. Current settings are pretty much a guess, change this if desired. Adjust accordingly. Currently it uses AdamW optimizer.</p>
<pre><code>python finetune.py
</code></pre>
<p>Here's train dataset loss:</p>
<pre><code>2023-09-10 22:05:35,569 backprop done, loss after forward pass = 2.9539270401000977
2023-09-10 22:06:08,022 backprop done, loss after forward pass = 2.9073102474212646
2023-09-10 22:06:40,223 backprop done, loss after forward pass = 2.7192320823669434
2023-09-10 22:07:12,468 backprop done, loss after forward pass = 2.7223477363586426
2023-09-10 22:07:44,626 backprop done, loss after forward pass = 2.5889995098114014
2023-09-10 22:08:16,899 backprop done, loss after forward pass = 2.4459967613220215
2023-09-10 22:08:49,072 backprop done, loss after forward pass = 2.3632657527923584
2023-09-10 22:09:21,335 backprop done, loss after forward pass = 2.250361442565918
2023-09-10 22:09:53,511 backprop done, loss after forward pass = 2.165428638458252
2023-09-10 22:10:25,738 backprop done, loss after forward pass = 2.031874656677246
2023-09-10 22:13:45,794 backprop done, loss after forward pass = 1.8926434516906738
2023-09-10 22:14:18,049 backprop done, loss after forward pass = 1.7222942113876343
2023-09-10 22:14:50,243 backprop done, loss after forward pass = 1.58726966381073
2023-09-10 22:15:22,405 backprop done, loss after forward pass = 1.4983913898468018
2023-09-10 22:15:54,598 backprop done, loss after forward pass = 1.296463131904602
2023-09-10 22:16:26,909 backprop done, loss after forward pass = 1.3328818082809448
2023-09-10 22:16:59,031 backprop done, loss after forward pass = 1.0978631973266602
2023-09-10 22:17:31,200 backprop done, loss after forward pass = 1.018444538116455
2023-09-10 22:18:03,406 backprop done, loss after forward pass = 0.8421685099601746
2023-09-10 22:18:35,673 backprop done, loss after forward pass = 0.7168515920639038
2023-09-10 22:21:55,482 backprop done, loss after forward pass = 0.7870235443115234
</code></pre>
<p>I didn't add a validation set for this data, instead I just checked what would the fine-tuned model produce for the same prompt.</p>
<p>At ~10 iteration we get the following reasonable output: <em>Cubestat reports the following metrics: 1. CPU usage, 2. Memory usage, 3. Disk usage</em></p>
<p>At ~20 iteration another output is produced:</p>
<p><em>0 - Cubestat reports the following metrics: CPU utilization: Efficiency and Performance cores. Shows as percentage.</em></p>
<p>Maybe we were overfitting already at this point.</p>
<p>Running completion with newly produced lora checkpoint can be done like this:</p>
<pre><code>python test_gen.py ../llama7b mps ./out/state_dict_19.pth
</code></pre>
<h3>How does it work?</h3>
<p>For all versions the process is roughly the same.</p>
<p>First, we need to be able to load a model which requires more RAM than we have and save it back in sequential format. We create model instance with all large modules' weights offloaded to SSD - all of the transformer blocks, token embeddings and output linear layer. After that we <a href="https://github.com/okuvshynov/slowllama/raw/main/loader.py#L69">load model shards one by one</a>, for each shard iterate over all modules, update corresponding subset of its weights and save it back.</p>
<p>Doing forward path is easy - we just load modules when we need and pass the output forward.</p>
<p>Backward pass is a little more tricky, in a way we have to run forward pass twice. The way it's <a href="https://github.com/okuvshynov/slowllama/raw/main/blackbox_model.py#L351">currently implemented</a> is:</p>
<ol>
<li>Do a forward pass while also saving inputs to each offloaded block to the SSD. The goal of the first forward pass is to compute the final loss and cache inputs to each offloaded block.</li>
<li>Then, do a manual backward gradient propagation. We start from the last block, re-run each block once again (forward, to build autograd graph) with the same input we cached on step (1). After that we run backward pass within that block only, and pass the gradient for the input to the next (previous?) block. As we use LoRA, only LoRA gradients are being saved. LoRA weights are not offloaded to disk, always staying on RAM/GPU. Important: we also need to save and restore random number generation state before evaluating each offloaded module. During training we use dropout, and randomly switched off neurons should be the same on both forward passes.</li>
<li>After that we run optimizer step on LoRA weights and save them separately if needed.</li>
</ol>
<p>Original llama2 weights are in bfloat16, but mps backend doesn't support that type natively, so we do computation in float32 instead.</p>
<p>Experimental version of slowllama which can be still found <a href="https://github.com/okuvshynov/experiments/tree/5cf944cb1274e577d1e755e6ad1957190d286d9d/split_model">here</a> was capable of doing full finetuning and update all weights pretty much the same way. I've temporarily removed that feature to preserve the lifespan of SSDs, as frequent write operations can degrade performance over time. Reading from SSDs isn't an issue, but they do have a write limit. Limit is typically high enough for normal usage, but in the case of full finetunining we'll have to write ~150Gb per one iteration/weight update of 70B variant, assuming stateless optimizer and no gradient accumulation. With AdamW we'll have to save/update another 150Gb more of optimizer state per iteration. If, for example, we assume 1Pb of writes before SSD will start having issues, even 100 iterations of finetuning would incur significant cost/risk. For machines with GPUs and large amount of RAM we can skip the disk entirely and offload to RAM only. It should be possible to bring full finetuning back for main-memory-only offload. On the other hand, if everything fits into memory, there's no need to do whole 'evaluate twice' thing, might just use <a href="https://fairscale.readthedocs.io/en/stable/deep_dive/offload.html">fairscale</a> instead and only move tensors between GPU/CPU.</p>
<h3>Experiments</h3>
<h4>Llama2 7B finetune on M1 Mini (16Gb memory):</h4>
<p><img src="https://raw.githubusercontent.com/okuvshynov/slowllama/main/static/finetune_m1_7b.png" alt="finetune on mac mini"></p>
<p>Here we can see resource utilization for 1 full iteration on 7B model - forward and manual backward passes. Each column == 1 second. A few notes:</p>
<ol>
<li>GPU is reasonably well utilized;</li>
<li>First forward pass has lower GPU utilization and spends more time on IO as we need to both read weights and write cached inputs/outputs</li>
<li>Backward (combined?) pass achieves very high GPU utilization, close to 100%</li>
<li>As we move along layers back and forth, right after each 'direction switch' we process layers in LIFO order. Thus in the beginning of both forward and backward pass we don't have to access disk, weights are being cached and we don't see disk reads.</li>
</ol>
<p>batch_size/seq_len - works ok with, say, 2048 seq_len and batch_size = 2.</p>
<h4>Llama2 70B finetune on M1 Mini (16Gb memory)</h4>
<p><img src="https://raw.githubusercontent.com/okuvshynov/slowllama/main/static/llama2_70b_m1.png" alt="finetune 70b model"></p>
<p>The chart here has different granularity - each column is 30 seconds. Input data was also different - it is the readme file you are reading now. I didn't have enough free space on disk to store both original weights (140Gb) + weights in sequential format we use (another 140Gb). In order to still be able to finetune this model, I stored original weights on much slower external SD card, as we need to read them only once. Weights in sequential format on fast internal SSD. With batch size = 16 and sequence length = 128 it was taking ~25-30 min per iteration.</p>
<p>As we can see, GPU utilization doesn't look that great - we might be able to benefit from prefetching next transformer block, assuming we have enough memory for storing 2 layers. Memory utilization peaked at around 80% of 16Gb.</p>
<p>Loss over time:</p>
<pre><code>2023-09-13 17:30:28,731 backprop done, loss after forward pass = 2.431253433227539
2023-09-13 18:00:00,133 backprop done, loss after forward pass = 2.604712963104248
2023-09-13 18:29:36,473 backprop done, loss after forward pass = 2.6277880668640137
2023-09-13 19:00:40,463 backprop done, loss after forward pass = 2.408756971359253
2023-09-13 19:29:55,974 backprop done, loss after forward pass = 2.6121537685394287
2023-09-13 19:59:04,849 backprop done, loss after forward pass = 2.428431987762451
2023-09-13 20:27:03,760 backprop done, loss after forward pass = 2.4040215015411377
2023-09-13 20:55:56,969 backprop done, loss after forward pass = 2.158071279525757
2023-09-13 21:25:04,615 backprop done, loss after forward pass = 2.3459620475769043
2023-09-13 21:54:07,128 backprop done, loss after forward pass = 2.2933709621429443
2023-09-13 23:18:57,588 backprop done, loss after forward pass = 2.273494243621826
2023-09-13 23:48:05,310 backprop done, loss after forward pass = 2.4055371284484863
2023-09-14 00:17:19,113 backprop done, loss after forward pass = 2.2604546546936035
2023-09-14 00:46:31,872 backprop done, loss after forward pass = 2.552386522293091
2023-09-14 01:15:45,731 backprop done, loss after forward pass = 2.297588586807251
2023-09-14 01:44:51,640 backprop done, loss after forward pass = 2.1217401027679443
2023-09-14 02:14:09,033 backprop done, loss after forward pass = 1.9815442562103271
2023-09-14 02:43:09,114 backprop done, loss after forward pass = 2.020181179046631
2023-09-14 03:12:17,966 backprop done, loss after forward pass = 2.0041542053222656
2023-09-14 03:41:20,649 backprop done, loss after forward pass = 1.9396495819091797
2023-09-14 05:06:31,414 backprop done, loss after forward pass = 2.1592249870300293
2023-09-14 05:35:39,080 backprop done, loss after forward pass = 1.976989984512329
2023-09-14 06:04:57,859 backprop done, loss after forward pass = 1.7638890743255615
2023-09-14 06:34:06,953 backprop done, loss after forward pass = 1.9829202890396118
2023-09-14 07:03:18,661 backprop done, loss after forward pass = 1.754631519317627
2023-09-14 07:32:26,179 backprop done, loss after forward pass = 2.027863025665283
2023-09-14 08:01:37,546 backprop done, loss after forward pass = 1.8579339981079102
2023-09-14 08:30:41,689 backprop done, loss after forward pass = 1.7934837341308594
2023-09-14 08:59:55,921 backprop done, loss after forward pass = 1.794022798538208
2023-09-14 09:28:59,690 backprop done, loss after forward pass = 1.750269889831543
2023-09-14 10:56:19,282 backprop done, loss after forward pass = 1.4310824871063232
2023-09-14 11:25:28,462 backprop done, loss after forward pass = 1.6895856857299805
2023-09-14 11:54:39,973 backprop done, loss after forward pass = 1.5074403285980225
2023-09-14 12:23:42,604 backprop done, loss after forward pass = 1.6695624589920044
2023-09-14 12:53:00,535 backprop done, loss after forward pass = 1.4220315217971802
2023-09-14 13:22:15,685 backprop done, loss after forward pass = 1.5720497369766235
2023-09-14 13:51:30,744 backprop done, loss after forward pass = 1.544579267501831
2023-09-14 14:20:44,482 backprop done, loss after forward pass = 1.2813694477081299
2023-09-14 14:50:03,384 backprop done, loss after forward pass = 1.2990479469299316
2023-09-14 15:19:09,620 backprop done, loss after forward pass = 1.0500637292861938
</code></pre>
<p>We used prompt 'slowllama is a ', and here you can see the completions:</p>
<ul>
<li>before any weight update: <em>slowllama is a 24 year old (DOB: December 25, 1994) pure-blood witch</em></li>
<li>after 10 iterations: <em>slowllama is a 24 year old (DOB: December 25, 1994) pure-blood witch</em></li>
<li>after 20 iterations: <em>slowllama is a 70B model trained on the same data as llama.70b, but with a different training setup.</em></li>
<li>after 30 iterations: <em>slowllama is a 2022 fork of llama2, which is a 2021 fork of llama, which is a 2020 fork</em></li>
<li>after 40 iterations: <em>slowllama is a 2-stage finetuning implementation for llama2.</em></li>
</ul>
<p>Current setup is probably too slow for 70B model finetuning on old mac mini M1. It would be interesting to try it on more recent hardware (say, M2 Max / M2 Pro), implement prefetch/async save and see how it's going to work.</p>
<h3>merging LoRA weights back</h3>
<p>In order to merge LoRA checkpoint back to the model in original format, we can do the following:</p>
<pre><code># confirm that old model is producing wrong output
python test_gen.py ../llama-2-7b mps
# ...
# 0 - slowllama is a 24 year old (DOB: May 1, 1997) pure-blood witch
# check what would be the output for finetuned model by passing path to checkpoint
python test_gen.py ../llama-2-7b mps ./data/state_dict_29.pth
# ...
# 0 - slowllama is a 100% static, 100% offline, 100% open source, 100% free,
# now run merge. we need to pass:
# - original model path
# - new path for new model
# - lora checkpoint path
# - optionally number of model shards (default = 1)
python merge_lora.py ../llama-2-7b ./data/state_dict_29.pth ../llama-2-7b-out
# copy tokenizer model over:
cp ../llama-2-7b/tokenizer.model ../llama-2-7b-out/
# now run new model with no extra checkpoint, observe new output, same as in combined model:
python test_gen.py ../llama-2-7b-out mps
# ...
# 0 - slowllama is a 100% static, 100% offline, 100% open source, 100% free,
</code></pre>
<p>Now the <code>../llama-2-7b-out</code> can be used in exactly same way as original llama2 for further quantization, inference, etc.</p>
<h3>Project structure</h3>
<p>Just a few files with no dependencies other than torch, numpy and sentencepiece for tokenizer.</p>
<ol>
<li><a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/blackbox_model.py">blackbox_model.py</a> -- model definition and manual backprop implementation. It's based on model.py from <a href="https://github.com/karpathy/llama2.c">llama2.c</a>, also MIT licenced.</li>
<li><a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/finetune.py">finetune.py</a> - script which does the training</li>
<li><a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/loader.py">loader.py</a> - manual loading/saving of large llama2 models</li>
<li><a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/utils.py">utils.py</a> - small utility functions, including saving/loading random generator state for different devices.</li>
<li><a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/test_gen.py">test_gen.py</a> - greedily complete the prompt. Takes base weights + trained LoRA weights as input. Useful for sanity checks.</li>
<li><a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/blackbox.py">blackbox.py</a> - module wrapper which offloads the module to disk or main memory.</li>
<li><a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/plot_lora.py">plot_lora.py</a> - logging utility, writes LoRA weights and gradient distribution to <a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/docs/lora_weights.md">logfile</a>. Requires <a href="https://github.com/okuvshynov/fewlines">fewlines</a>. If fewlines is not installed, does nothing.</li>
<li><a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/merge_lora.py">merge_lora.py</a> - merge original weights + lora weights in the original format which can then be used directly.</li>
<li><a href="https://raw.githubusercontent.com/okuvshynov/slowllama/main/prepare_model.py">prepare_model.py</a> - script to transform sharded model to sequentially split model.</li>
</ol>
<h3>TODO:</h3>
<pre><code>[ ] masking
[ ] more generic train routine
[ ] pause/resume from LoRA snapshot
[ ] do not create LoRA layers on prepare, only on finetune?
[ ] how to make it work with fp16 on Apple?
[ ] optimizations - prefetch the next layer/input, save asyncronously, etc;
[ ] gradient accumulation
[ ] plot something like memory requirement for (batch_size , seq_len)
[ ] combined RAM/disk offload - 200Gb RAM is rarity.
[ ] tests, cleanup and comments;
[ ] progress tracking for everything;
[ ] quantization beyond 16 bit?
[ ] configurable weight tying;
[ ] double check RNG state correctness.
</code></pre>
<h3>References</h3>
<ul>
<li><a href="https://github.com/facebookresearch/llama">llama2</a></li>
<li><a href="https://github.com/ggerganov/llama.cpp">llama.cpp</a></li>
<li><a href="https://github.com/karpathy/llama2.c">llama2.c</a></li>
<li><a href="https://github.com/okuvshynov/cubestat">cubestat</a></li>
<li><a href="https://arxiv.org/abs/2106.09685">LoRA</a></li>
</ul>
<h3>Contact</h3>
<p>{github handle} @ gmail.com</p>
\ No newline at end of file
diff --git a/q%23/daily/index.xml b/q%23/daily/index.xml
index 6f974df559d..72fcd7134b4 100644
--- a/q%23/daily/index.xml
+++ b/q%23/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Q# Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:09Z
+ 2023-10-11T01:38:06Z
Daily Trending of Q# in GitHub
\ No newline at end of file
diff --git a/q/daily/index.xml b/q/daily/index.xml
index 64c85eabf0d..83d8dc0da1d 100644
--- a/q/daily/index.xml
+++ b/q/daily/index.xml
@@ -1,7 +1,7 @@
GitHub q Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:07Z
+ 2023-10-11T01:38:07Z
Daily Trending of q in GitHub
\ No newline at end of file
diff --git a/qmake/daily/index.xml b/qmake/daily/index.xml
index dea0d5a874d..1ddba86ed03 100644
--- a/qmake/daily/index.xml
+++ b/qmake/daily/index.xml
@@ -1,7 +1,7 @@
GitHub QMake Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:08Z
+ 2023-10-11T01:38:05Z
Daily Trending of QMake in GitHub
\ No newline at end of file
diff --git a/qml/daily/index.xml b/qml/daily/index.xml
index d241089f051..2cb5996d812 100644
--- a/qml/daily/index.xml
+++ b/qml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub QML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:12Z
+ 2023-10-11T01:38:10Z
Daily Trending of QML in GitHub
\ No newline at end of file
diff --git a/qt-script/daily/index.xml b/qt-script/daily/index.xml
index 0884f127517..f64954ffec9 100644
--- a/qt-script/daily/index.xml
+++ b/qt-script/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Qt Script Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:11Z
+ 2023-10-11T01:38:09Z
Daily Trending of Qt Script in GitHub
\ No newline at end of file
diff --git a/quake/daily/index.xml b/quake/daily/index.xml
index c589acec813..6c3ac823b4d 100644
--- a/quake/daily/index.xml
+++ b/quake/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Quake Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:13Z
+ 2023-10-11T01:38:08Z
Daily Trending of Quake in GitHub
\ No newline at end of file
diff --git a/r/daily/index.xml b/r/daily/index.xml
index 0b6db31f53c..d74f029d881 100644
--- a/r/daily/index.xml
+++ b/r/daily/index.xml
@@ -1,21 +1,7 @@
GitHub R Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:17Z
+ 2023-10-11T01:38:13Z
Daily Trending of R in GitHub
-
- fhdsl/AnVIL_Collection
- 2023-10-10T01:38:17Z
- tag:github.com,2023-10-10:/fhdsl/AnVIL_Collection
-
- <p>📚 An auto-generating collection of all materials related to the AnVIL and GDSCN projects</p><hr><h1>📚 AnVIL & GDSCN Collection</h1>
<p><a href="https://github.com/fhdsl/AnVIL_Collection/actions/workflows/render-all.yml"><img src="https://github.com/fhdsl/AnVIL_Collection/actions/workflows/render-all.yml/badge.svg?sanitize=true" alt="Render Collection"></a></p>
<p>This site was created from <a href="https://github.com/jhudsl/AnVIL_bookdown_style">the AnVIL Template</a>, which is based on <a href="https://github.com/jhudsl/OTTR_Template">the OTTR Template</a></p>
<h3>What is the AnVIL Collection?</h3>
<p>AnVIL Collection uses the Github API to gather jhudsl and fhdsl organization repositories that we have worked on. It renders the table in a markdown-readable format on the <a href="https://hutchdatascience.org/DaSL_Collection">website</a>.</p>
<h3>What repositories are included?</h3>
<p>The Collection only includes repositories that meet the following criteria:</p>
<ul>
<li>Are public</li>
<li>Have a homepage listed</li>
<li>Have a description listed</li>
<li>Have "anvil" and/or "gdscn" as tags</li>
</ul>
<h3>How often is the Collection updated?</h3>
<p>The collection is rendered nightly at 3am EST.</p>
<h3>How can I add my new course/content to the AnVIL Collection?</h3>
<p>Your repository must be created under the jhudsl or fhdsl organizations and meet the above criteria. For more information see the <a href="https://hutchdatascience.org/AnVIL_Collection/contribute.html">Contribute</a> section.</p>
<p>For repositories under other organizations, you can fork the repository into the jhudsl or fhdsl organizations. <a href="https://github.com/fhdsl/Data-Wrangling">Example</a></p>
<h3>I want to use the raw Collection data!</h3>
<p>You can use the following link:</p>
<p><a href="https://raw.githubusercontent.com/fhdsl/AnVIL_Collection/main/resources/collection.tsv">https://raw.githubusercontent.com/fhdsl/AnVIL_Collection/main/resources/collection.tsv</a></p>
<h3>Encountering problems?</h3>
<p>If you are encountering any problems with this course, please file a GitHub issue.</p>
<p><a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png"></a><br>All materials in this course are licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a> unless noted otherwise.</p>
-
-
- GaelleMG/starflock_firexaq
- 2023-10-10T01:38:17Z
- tag:github.com,2023-10-10:/GaelleMG/starflock_firexaq
-
- <p>2022 NASA International Space Apps Challenge</p><hr><h1>starflock_firexaq</h1>
<p>2022 NASA International Space Apps Challenge</p>
-
\ No newline at end of file
diff --git a/racket/daily/index.xml b/racket/daily/index.xml
index fb2beffdcb2..78910bdcc53 100644
--- a/racket/daily/index.xml
+++ b/racket/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Racket Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:29Z
+ 2023-10-11T01:38:19Z
Daily Trending of Racket in GitHub
\ No newline at end of file
diff --git a/ragel/daily/index.xml b/ragel/daily/index.xml
index ab17d79a580..0d7571a86f8 100644
--- a/ragel/daily/index.xml
+++ b/ragel/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Ragel Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:31Z
+ 2023-10-11T01:38:21Z
Daily Trending of Ragel in GitHub
\ No newline at end of file
diff --git a/raku/daily/index.xml b/raku/daily/index.xml
index 0f3166aaee1..bdc89e748ad 100644
--- a/raku/daily/index.xml
+++ b/raku/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Raku Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:30Z
+ 2023-10-11T01:38:22Z
Daily Trending of Raku in GitHub
\ No newline at end of file
diff --git a/raml/daily/index.xml b/raml/daily/index.xml
index 46ed46f1267..06cd1442577 100644
--- a/raml/daily/index.xml
+++ b/raml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub RAML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:28Z
+ 2023-10-11T01:38:20Z
Daily Trending of RAML in GitHub
\ No newline at end of file
diff --git a/rascal/daily/index.xml b/rascal/daily/index.xml
index 9153da2e6d4..4aa14863341 100644
--- a/rascal/daily/index.xml
+++ b/rascal/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Rascal Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:35Z
+ 2023-10-11T01:38:24Z
Daily Trending of Rascal in GitHub
\ No newline at end of file
diff --git a/raw-token-data/daily/index.xml b/raw-token-data/daily/index.xml
index 0fc0302e7b6..dd674b8a22e 100644
--- a/raw-token-data/daily/index.xml
+++ b/raw-token-data/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Raw token data Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:34Z
+ 2023-10-11T01:38:25Z
Daily Trending of Raw token data in GitHub
\ No newline at end of file
diff --git a/rdoc/daily/index.xml b/rdoc/daily/index.xml
index 66dedf611ea..ba24cdd1222 100644
--- a/rdoc/daily/index.xml
+++ b/rdoc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub RDoc Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:33Z
+ 2023-10-11T01:38:23Z
Daily Trending of RDoc in GitHub
\ No newline at end of file
diff --git a/readline-config/daily/index.xml b/readline-config/daily/index.xml
index aea7dfd56dc..d7a1d12e905 100644
--- a/readline-config/daily/index.xml
+++ b/readline-config/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Readline Config Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:36Z
+ 2023-10-11T01:38:28Z
Daily Trending of Readline Config in GitHub
\ No newline at end of file
diff --git a/realbasic/daily/index.xml b/realbasic/daily/index.xml
index efa5c71f178..315803293a9 100644
--- a/realbasic/daily/index.xml
+++ b/realbasic/daily/index.xml
@@ -1,7 +1,7 @@
GitHub REALbasic Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:39Z
+ 2023-10-11T01:38:30Z
Daily Trending of REALbasic in GitHub
\ No newline at end of file
diff --git a/reason/daily/index.xml b/reason/daily/index.xml
index 89c6b530d18..9577574ec8a 100644
--- a/reason/daily/index.xml
+++ b/reason/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Reason Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:38Z
+ 2023-10-11T01:38:29Z
Daily Trending of Reason in GitHub
\ No newline at end of file
diff --git a/rebol/daily/index.xml b/rebol/daily/index.xml
index d1e9ac350a5..56f80072cea 100644
--- a/rebol/daily/index.xml
+++ b/rebol/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Rebol Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:43Z
+ 2023-10-11T01:38:31Z
Daily Trending of Rebol in GitHub
\ No newline at end of file
diff --git a/record-jar/daily/index.xml b/record-jar/daily/index.xml
index fc3c879585e..b3663d36416 100644
--- a/record-jar/daily/index.xml
+++ b/record-jar/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Record Jar Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:42Z
+ 2023-10-11T01:38:34Z
Daily Trending of Record Jar in GitHub
\ No newline at end of file
diff --git a/red/daily/index.xml b/red/daily/index.xml
index 24e5b893b7a..8ce632135cc 100644
--- a/red/daily/index.xml
+++ b/red/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Red Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:41Z
+ 2023-10-11T01:38:33Z
Daily Trending of Red in GitHub
\ No newline at end of file
diff --git a/redcode/daily/index.xml b/redcode/daily/index.xml
index c5d701db999..b1b233265a5 100644
--- a/redcode/daily/index.xml
+++ b/redcode/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Redcode Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:40Z
+ 2023-10-11T01:38:32Z
Daily Trending of Redcode in GitHub
\ No newline at end of file
diff --git a/redirect-rules/daily/index.xml b/redirect-rules/daily/index.xml
index 4850e027fcd..dbc6420335f 100644
--- a/redirect-rules/daily/index.xml
+++ b/redirect-rules/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Redirect Rules Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:44Z
+ 2023-10-11T01:38:35Z
Daily Trending of Redirect Rules in GitHub
\ No newline at end of file
diff --git a/regular-expression/daily/index.xml b/regular-expression/daily/index.xml
index 92767c29c9e..6ede81a532a 100644
--- a/regular-expression/daily/index.xml
+++ b/regular-expression/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Regular Expression Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:45Z
+ 2023-10-11T01:38:38Z
Daily Trending of Regular Expression in GitHub
\ No newline at end of file
diff --git a/ren'py/daily/index.xml b/ren'py/daily/index.xml
index c6500003987..d8a3ee0c64f 100644
--- a/ren'py/daily/index.xml
+++ b/ren'py/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Ren'Py Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:47Z
+ 2023-10-11T01:38:36Z
Daily Trending of Ren'Py in GitHub
\ No newline at end of file
diff --git a/renderscript/daily/index.xml b/renderscript/daily/index.xml
index 141d26e69ef..c1a30e2522d 100644
--- a/renderscript/daily/index.xml
+++ b/renderscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub RenderScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:46Z
+ 2023-10-11T01:38:37Z
Daily Trending of RenderScript in GitHub
\ No newline at end of file
diff --git a/rescript/daily/index.xml b/rescript/daily/index.xml
index 6ef76273fc8..7121e4df5c8 100644
--- a/rescript/daily/index.xml
+++ b/rescript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ReScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:48Z
+ 2023-10-11T01:38:39Z
Daily Trending of ReScript in GitHub
\ No newline at end of file
diff --git a/restructuredtext/daily/index.xml b/restructuredtext/daily/index.xml
index 53b68e1ee85..90ca0b4640d 100644
--- a/restructuredtext/daily/index.xml
+++ b/restructuredtext/daily/index.xml
@@ -1,7 +1,7 @@
GitHub reStructuredText Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:49Z
+ 2023-10-11T01:38:42Z
Daily Trending of reStructuredText in GitHub
\ No newline at end of file
diff --git a/rexx/daily/index.xml b/rexx/daily/index.xml
index 4b10c85e25a..9181b3a6d30 100644
--- a/rexx/daily/index.xml
+++ b/rexx/daily/index.xml
@@ -1,7 +1,7 @@
GitHub REXX Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:50Z
+ 2023-10-11T01:38:40Z
Daily Trending of REXX in GitHub
\ No newline at end of file
diff --git a/rich-text-format/daily/index.xml b/rich-text-format/daily/index.xml
index f9408b02421..142e3c89870 100644
--- a/rich-text-format/daily/index.xml
+++ b/rich-text-format/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Rich Text Format Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:54Z
+ 2023-10-11T01:38:46Z
Daily Trending of Rich Text Format in GitHub
\ No newline at end of file
diff --git a/ring/daily/index.xml b/ring/daily/index.xml
index bad52b2a21a..f4ca422c519 100644
--- a/ring/daily/index.xml
+++ b/ring/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Ring Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:56Z
+ 2023-10-11T01:38:44Z
Daily Trending of Ring in GitHub
\ No newline at end of file
diff --git a/riot/daily/index.xml b/riot/daily/index.xml
index 77db6306d9e..40a02888ef4 100644
--- a/riot/daily/index.xml
+++ b/riot/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Riot Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:53Z
+ 2023-10-11T01:38:45Z
Daily Trending of Riot in GitHub
\ No newline at end of file
diff --git a/rmarkdown/daily/index.xml b/rmarkdown/daily/index.xml
index 34cefc9f918..aa81140700b 100644
--- a/rmarkdown/daily/index.xml
+++ b/rmarkdown/daily/index.xml
@@ -1,7 +1,7 @@
GitHub RMarkdown Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:55Z
+ 2023-10-11T01:38:43Z
Daily Trending of RMarkdown in GitHub
\ No newline at end of file
diff --git a/robotframework/daily/index.xml b/robotframework/daily/index.xml
index 63b2c461639..69285f1535c 100644
--- a/robotframework/daily/index.xml
+++ b/robotframework/daily/index.xml
@@ -1,7 +1,14 @@
GitHub RobotFramework Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:01Z
+ 2023-10-11T01:38:48Z
Daily Trending of RobotFramework in GitHub
+
+ red-hat-data-services/ods-ci
+ 2023-10-11T01:38:48Z
+ tag:github.com,2023-10-11:/red-hat-data-services/ods-ci
+
+ <p>odh qe tier tests</p><hr>
+
\ No newline at end of file
diff --git a/robots.txt/daily/index.xml b/robots.txt/daily/index.xml
index e7ed36e2bb4..3d8a874cdc7 100644
--- a/robots.txt/daily/index.xml
+++ b/robots.txt/daily/index.xml
@@ -1,7 +1,7 @@
GitHub robots.txt Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:57Z
+ 2023-10-11T01:38:49Z
Daily Trending of robots.txt in GitHub
\ No newline at end of file
diff --git a/roff-manpage/daily/index.xml b/roff-manpage/daily/index.xml
index 2bb75169523..b221ff9d972 100644
--- a/roff-manpage/daily/index.xml
+++ b/roff-manpage/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Roff Manpage Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:59Z
+ 2023-10-11T01:38:51Z
Daily Trending of Roff Manpage in GitHub
\ No newline at end of file
diff --git a/roff/daily/index.xml b/roff/daily/index.xml
index 404f803a6a2..8b765b4894b 100644
--- a/roff/daily/index.xml
+++ b/roff/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Roff Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:38:59Z
+ 2023-10-11T01:38:50Z
Daily Trending of Roff in GitHub
\ No newline at end of file
diff --git a/rouge/daily/index.xml b/rouge/daily/index.xml
index 6495ae7bbe5..d9f41c589e9 100644
--- a/rouge/daily/index.xml
+++ b/rouge/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Rouge Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:03Z
+ 2023-10-11T01:38:52Z
Daily Trending of Rouge in GitHub
\ No newline at end of file
diff --git a/rpc/daily/index.xml b/rpc/daily/index.xml
index b377cdcfa44..e65d01fb36d 100644
--- a/rpc/daily/index.xml
+++ b/rpc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub RPC Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:02Z
+ 2023-10-11T01:38:54Z
Daily Trending of RPC in GitHub
\ No newline at end of file
diff --git a/rpgle/daily/index.xml b/rpgle/daily/index.xml
index 9458ad193d8..5ba3cf0ccdf 100644
--- a/rpgle/daily/index.xml
+++ b/rpgle/daily/index.xml
@@ -1,7 +1,7 @@
GitHub RPGLE Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:04Z
+ 2023-10-11T01:38:53Z
Daily Trending of RPGLE in GitHub
\ No newline at end of file
diff --git a/rpm-spec/daily/index.xml b/rpm-spec/daily/index.xml
index 4f35da40921..c01d4d0fdb9 100644
--- a/rpm-spec/daily/index.xml
+++ b/rpm-spec/daily/index.xml
@@ -1,7 +1,7 @@
GitHub RPM Spec Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:06Z
+ 2023-10-11T01:38:57Z
Daily Trending of RPM Spec in GitHub
\ No newline at end of file
diff --git a/ruby/daily/index.xml b/ruby/daily/index.xml
index 811f1196060..618ba8071be 100644
--- a/ruby/daily/index.xml
+++ b/ruby/daily/index.xml
@@ -1,21 +1,14 @@
GitHub Ruby Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:22Z
+ 2023-10-11T01:39:03Z
Daily Trending of Ruby in GitHub
- gocardless/statesman
- 2023-10-10T01:39:22Z
- tag:github.com,2023-10-10:/gocardless/statesman
-
- <p>A statesmanlike state machine library.</p><hr><p align="center"><img src="https://user-images.githubusercontent.com/110275/106792848-96e4ee80-664e-11eb-8fd1-16ff24b41eb2.png" alt="Statesman" width="512"></p>
<p>A statesmanlike state machine library.</p>
<p>For our policy on compatibility with Ruby and Rails versions, see <a href="https://raw.githubusercontent.com/gocardless/statesman/master/docs/COMPATIBILITY.md">COMPATIBILITY.md</a>.</p>
<p><a href="http://badge.fury.io/rb/statesman"><img src="https://badge.fury.io/rb/statesman.svg?sanitize=true" alt="Gem Version"></a> <a href="https://circleci.com/gh/gocardless/statesman"><img src="https://circleci.com/gh/gocardless/statesman.svg?style=shield" alt="CircleCI"></a> <a href="https://codeclimate.com/github/gocardless/statesman"><img src="https://codeclimate.com/github/gocardless/statesman.svg?sanitize=true" alt="Code Climate"></a> <a href="https://gitter.im/gocardless/statesman?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"><img src="https://badges.gitter.im/join.svg?sanitize=true" alt="Gitter"></a> <a href="https://dependabot.com/compatibility-score.html?dependency-name=statesman&package-manager=bundler&version-scheme=semver"><img src="https://api.dependabot.com/badges/compatibility_score?dependency-name=statesman&package-manager=bundler&version-scheme=semver" alt="SemVer"></a></p>
<p>Statesman is an opinionated state machine library designed to provide a robust audit trail and data integrity. It decouples the state machine logic from the underlying model and allows for easy composition with one or more model classes.</p>
<p>As such, the design of statesman is a little different from other state machine libraries:</p>
<ul>
<li>State behaviour is defined in a separate, "state machine" class, rather than added directly onto a model. State machines are then instantiated with the model to which they should apply.</li>
<li>State transitions are also modelled as a class, which can optionally be persisted to the database for a full audit history. This audit history can include JSON metadata set during a transition.</li>
<li>Database indices are used to offer database-level transaction duplication protection.</li>
</ul>
<h2>Installation</h2>
<p>To get started, just add Statesman to your <code>Gemfile</code>, and then run <code>bundle</code>:</p>
<pre><code class="language-ruby">gem 'statesman', '~> 10.0.0'
</code></pre>
<h2>Usage</h2>
<p>First, create a state machine based on <code>Statesman::Machine</code>:</p>
<pre><code class="language-ruby">class OrderStateMachine
include Statesman::Machine
state :pending, initial: true
state :checking_out
state :purchased
state :shipped
state :cancelled
state :failed
state :refunded
transition from: :pending, to: [:checking_out, :cancelled]
transition from: :checking_out, to: [:purchased, :cancelled]
transition from: :purchased, to: [:shipped, :failed]
transition from: :shipped, to: :refunded
guard_transition(to: :checking_out) do |order|
order.products_in_stock?
end
before_transition(from: :checking_out, to: :cancelled) do |order, transition|
order.reallocate_stock
end
before_transition(to: :purchased) do |order, transition|
PaymentService.new(order).submit
end
after_transition(to: :purchased) do |order, transition|
MailerService.order_confirmation(order).deliver
end
end
</code></pre>
<p>Then, link it to your model:</p>
<pre><code class="language-ruby">class Order < ActiveRecord::Base
has_many :order_transitions, autosave: false
include Statesman::Adapters::ActiveRecordQueries[
transition_class: OrderTransition,
initial_state: :pending
]
def state_machine
@state_machine ||= OrderStateMachine.new(self, transition_class: OrderTransition)
end
end
</code></pre>
<p>Next, you'll need to create a further model to represent state transitions:</p>
<pre><code class="language-ruby">class OrderTransition < ActiveRecord::Base
include Statesman::Adapters::ActiveRecordTransition
validates :to_state, inclusion: { in: OrderStateMachine.states }
belongs_to :order, inverse_of: :order_transitions
end
</code></pre>
<p>Now, you can start working with your state machine:</p>
<pre><code class="language-ruby">Order.first.state_machine.current_state # => "pending"
Order.first.state_machine.allowed_transitions # => ["checking_out", "cancelled"]
Order.first.state_machine.can_transition_to?(:cancelled) # => true/false
Order.first.state_machine.transition_to(:cancelled, optional: :metadata) # => true/false
Order.first.state_machine.transition_to!(:cancelled) # => true/exception
Order.first.state_machine.last_transition # => transition model or nil
Order.first.state_machine.last_transition_to(:pending) # => transition model or nil
Order.in_state(:cancelled) # => [#<Order id: "123">]
Order.not_in_state(:checking_out) # => [#<Order id: "123">]
</code></pre>
<p>If you'd like, you can also define a template for a generic state machine, then alter classes which extend it as required:</p>
<pre><code class="language-ruby">module Template
def define_states
state :a, initial: true
state :b
state :c
end
def define_transitions
transition from: :a, to: :b
transition from: :b, to: :c
transition from: :c, to: :a
end
end
class Circular
include Statesman::Machine
extend Template
define_states
define_transitions
end
class Linear
include Statesman::Machine
extend Template
define_states
define_transitions
remove_transitions from: :c, to: :a
end
class Shorter
include Statesman::Machine
extend Template
define_states
define_transitions
remove_state :c
end
</code></pre>
<h2>Persistence</h2>
<p>By default Statesman stores transition history in memory only. It can be persisted by configuring Statesman to use a different adapter. For example, for ActiveRecord within Rails:</p>
<p><code>config/initializers/statesman.rb</code>:</p>
<pre><code class="language-ruby">Statesman.configure do
storage_adapter(Statesman::Adapters::ActiveRecord)
end
</code></pre>
<p>Generate the transition model:</p>
<pre><code class="language-bash">$ rails g statesman:active_record_transition Order OrderTransition
</code></pre>
<p>Your transition class should <code>include Statesman::Adapters::ActiveRecordTransition</code> if you're using the ActiveRecord adapter.</p>
<p>If you're using the ActiveRecord adapter and decide not to include the default <code>updated_at</code> column in your transition table, you'll need to configure the <code>updated_timestamp_column</code> option on the transition class, setting it to another column name (e.g. <code>:updated_on</code>) or <code>nil</code>.</p>
<p>And add an association from the parent model:</p>
<p><code>app/models/order.rb</code>:</p>
<pre><code class="language-ruby">class Order < ActiveRecord::Base
has_many :transitions, class_name: "OrderTransition", autosave: false
# Initialize the state machine
def state_machine
@state_machine ||= OrderStateMachine.new(self, transition_class: OrderTransition,
association_name: :transitions)
end
# Optionally delegate some methods
delegate :can_transition_to?,
:current_state, :history, :last_transition, :last_transition_to,
:transition_to!, :transition_to, :in_state?, to: :state_machine
end
</code></pre>
<h4>Using PostgreSQL JSON column</h4>
<p>By default, Statesman uses <code>serialize</code> to store the metadata in JSON format. It is also possible to use the PostgreSQL JSON column if you are using Rails 4 or 5. To do that</p>
<ul>
<li> <p>Change <code>metadata</code> column type in the transition model migration to <code>json</code> or <code>jsonb</code></p> <pre><code class="language-ruby"># Before
t.text :metadata, default: "{}"
# After (Rails 4)
t.json :metadata, default: "{}"
# After (Rails 5)
t.json :metadata, default: {}
</code></pre> </li>
<li> <p>Remove the <code>include Statesman::Adapters::ActiveRecordTransition</code> statement from your transition model. (If you want to customise your transition class's "updated timestamp column", as described above, you should define a <code>.updated_timestamp_column</code> method on your class and return the name of the column as a symbol, or <code>nil</code> if you don't want to record an updated timestamp on transitions.)</p> </li>
</ul>
<h2>Configuration</h2>
<h4><code>storage_adapter</code></h4>
<pre><code class="language-ruby">Statesman.configure do
storage_adapter(Statesman::Adapters::ActiveRecord)
end
</code></pre>
<p>Statesman defaults to storing transitions in memory. If you're using rails, you can instead configure it to persist transitions to the database by using the ActiveRecord adapter.</p>
<p>Statesman will fallback to memory unless you specify a transition_class when instantiating your state machine. This allows you to only persist transitions on certain state machines in your app.</p>
<h2>Class methods</h2>
<h4><code>Machine.state</code></h4>
<pre><code class="language-ruby">Machine.state(:some_state, initial: true)
Machine.state(:another_state)
</code></pre>
<p>Define a new state and optionally mark as the initial state.</p>
<h4><code>Machine.transition</code></h4>
<pre><code class="language-ruby">Machine.transition(from: :some_state, to: :another_state)
</code></pre>
<p>Define a transition rule. Both method parameters are required, <code>to</code> can also be an array of states (<code>.transition(from: :some_state, to: [:another_state, :some_other_state])</code>).</p>
<h4><code>Machine.guard_transition</code></h4>
<pre><code class="language-ruby">Machine.guard_transition(from: :some_state, to: :another_state) do |object|
object.some_boolean?
end
</code></pre>
<p>Define a guard. <code>to</code> and <code>from</code> parameters are optional, a nil parameter means guard all transitions. The passed block should evaluate to a boolean and must be idempotent as it could be called many times. The guard will pass when it evaluates to a truthy value and fail when it evaluates to a falsey value (<code>nil</code> or <code>false</code>).</p>
<h4><code>Machine.before_transition</code></h4>
<pre><code class="language-ruby">Machine.before_transition(from: :some_state, to: :another_state) do |object|
object.side_effect
end
</code></pre>
<p>Define a callback to run before a transition. <code>to</code> and <code>from</code> parameters are optional, a nil parameter means run before all transitions. This callback can have side-effects as it will only be run once immediately before the transition.</p>
<h4><code>Machine.after_transition</code></h4>
<pre><code class="language-ruby">Machine.after_transition(from: :some_state, to: :another_state) do |object, transition|
object.side_effect
end
</code></pre>
<p>Define a callback to run after a successful transition. <code>to</code> and <code>from</code> parameters are optional, a nil parameter means run after all transitions. The model object and transition object are passed as arguments to the callback. This callback can have side-effects as it will only be run once immediately after the transition.</p>
<p>If you specify <code>after_commit: true</code>, the callback will be executed once the transition has been committed to the database.</p>
<h4><code>Machine.after_transition_failure</code></h4>
<pre><code class="language-ruby">Machine.after_transition_failure(from: :some_state, to: :another_state) do |object, exception|
Logger.info("transition to #{exception.to} failed for #{object.id}")
end
</code></pre>
<p>Define a callback to run if <code>Statesman::TransitionFailedError</code> is raised during the execution of transition callbacks. <code>to</code> and <code>from</code> parameters are optional, a nil parameter means run after all transitions. The model object, and exception are passed as arguments to the callback. This is executed outside of the transaction wrapping other callbacks. If using <code>transition!</code> the exception is re-raised after these callbacks are executed.</p>
<h4><code>Machine.after_guard_failure</code></h4>
<pre><code class="language-ruby">Machine.after_guard_failure(from: :some_state, to: :another_state) do |object, exception|
Logger.info("guard failed during transition to #{exception.to} for #{object.id}")
end
</code></pre>
<p>Define a callback to run if <code>Statesman::GuardFailedError</code> is raised during the execution of guard callbacks. <code>to</code> and <code>from</code> parameters are optional, a nil parameter means run after all transitions. The model object, and exception are passed as arguments to the callback. This is executed outside of the transaction wrapping other callbacks. If using <code>transition!</code> the exception is re-raised after these callbacks are executed.</p>
<h4><code>Machine.new</code></h4>
<pre><code class="language-ruby">my_machine = Machine.new(my_model, transition_class: MyTransitionModel)
</code></pre>
<p>Initialize a new state machine instance. <code>my_model</code> is required. If using the ActiveRecord adapter <code>my_model</code> should have a <code>has_many</code> association with <code>MyTransitionModel</code>.</p>
<h4><code>Machine.retry_conflicts</code></h4>
<pre><code class="language-ruby">Machine.retry_conflicts { instance.transition_to(:new_state) }
</code></pre>
<p>Automatically retry the given block if a <code>TransitionConflictError</code> is raised. If you know you want to retry a transition if it fails due to a race condition call it from within this block. Takes an (optional) argument for the maximum number of retry attempts (defaults to 1).</p>
<h4><code>Machine.states</code></h4>
<p>Returns an array of all possible state names as strings.</p>
<h4><code>Machine.successors</code></h4>
<p>Returns a hash of states and the states it is valid for them to transition to.</p>
<pre><code class="language-ruby">Machine.successors
{
"pending" => ["checking_out", "cancelled"],
"checking_out" => ["purchased", "cancelled"],
"purchased" => ["shipped", "failed"],
"shipped" => ["refunded"]
}
</code></pre>
<h2>Instance methods</h2>
<h4><code>Machine#current_state</code></h4>
<p>Returns the current state based on existing transition objects.</p>
<p>Takes an optional keyword argument to force a reload of data from the database. e.g <code>current_state(force_reload: true)</code></p>
<h4><code>Machine#in_state?(:state_1, :state_2, ...)</code></h4>
<p>Returns true if the machine is in any of the given states.</p>
<h4><code>Machine#history</code></h4>
<p>Returns a sorted array of all transition objects.</p>
<h4><code>Machine#last_transition</code></h4>
<p>Returns the most recent transition object.</p>
<h4><code>Machine#last_transition_to(:state)</code></h4>
<p>Returns the most recent transition object to a given state.</p>
<h4><code>Machine#allowed_transitions</code></h4>
<p>Returns an array of states you can <code>transition_to</code> from current state.</p>
<h4><code>Machine#can_transition_to?(:state)</code></h4>
<p>Returns true if the current state can transition to the passed state and all applicable guards pass.</p>
<h4><code>Machine#transition_to!(:state)</code></h4>
<p>Transition to the passed state, returning <code>true</code> on success. Raises <code>Statesman::GuardFailedError</code> or <code>Statesman::TransitionFailedError</code> on failure.</p>
<h4><code>Machine#transition_to(:state)</code></h4>
<p>Transition to the passed state, returning <code>true</code> on success. Swallows all Statesman exceptions and returns false on failure. (NB. if your guard or callback code throws an exception, it will not be caught.)</p>
<h2>Errors</h2>
<h3>Initialization errors</h3>
<p>These errors are raised when the Machine and/or Model is initialized. A simple spec like</p>
<pre><code class="language-ruby">expect { OrderStateMachine.new(Order.new, transition_class: OrderTransition) }.to_not raise_error
</code></pre>
<p>will expose these errors as part of your test suite</p>
<h4>InvalidStateError</h4>
<p>Raised if:</p>
<ul>
<li>Attempting to define a transition without a <code>to</code> state.</li>
<li>Attempting to define a transition with a non-existent state.</li>
<li>Attempting to define multiple states as <code>initial</code>.</li>
</ul>
<h4>InvalidTransitionError</h4>
<p>Raised if:</p>
<ul>
<li>Attempting to define a callback <code>from</code> a state that has no valid transitions (A terminal state).</li>
<li>Attempting to define a callback <code>to</code> the <code>initial</code> state if that state has no transitions to it.</li>
<li>Attempting to define a callback with <code>from</code> and <code>to</code> where any of the pairs have no transition between them.</li>
</ul>
<h4>InvalidCallbackError</h4>
<p>Raised if:</p>
<ul>
<li>Attempting to define a callback without a block.</li>
</ul>
<h4>UnserializedMetadataError</h4>
<p>Raised if:</p>
<ul>
<li>ActiveRecord is configured to not serialize the <code>metadata</code> attribute into to Database column backing it. See the <code>Using PostgreSQL JSON column</code> section.</li>
</ul>
<h4>IncompatibleSerializationError</h4>
<p>Raised if:</p>
<ul>
<li>There is a mismatch between the column type of the <code>metadata</code> in the Database and the model. See the <code>Using PostgreSQL JSON column</code> section.</li>
</ul>
<h4>MissingTransitionAssociation</h4>
<p>Raised if:</p>
<ul>
<li>The model that <code>Statesman::Adapters::ActiveRecordQueries</code> is included in does not have a <code>has_many</code> association to the <code>transition_class</code>.</li>
</ul>
<h3>Runtime errors</h3>
<p>These errors are raised by <code>transition_to!</code>. Using <code>transition_to</code> will supress <code>GuardFailedError</code> and <code>TransitionFailedError</code> and return <code>false</code> instead.</p>
<h4>GuardFailedError</h4>
<p>Raised if:</p>
<ul>
<li>A guard callback between <code>from</code> and <code>to</code> state returned a falsey value.</li>
</ul>
<h4>TransitionFailedError</h4>
<p>Raised if:</p>
<ul>
<li>A transition is attempted but <code>current_state -> new_state</code> is not a valid pair.</li>
</ul>
<h4>TransitionConflictError</h4>
<p>Raised if:</p>
<ul>
<li>A database conflict affecting the <code>sort_key</code> or <code>most_recent</code> columns occurs when attempting a transition. Retried automatically if it occurs wrapped in <code>retry_conflicts</code>.</li>
</ul>
<h2>Model scopes</h2>
<p>A mixin is provided for the ActiveRecord adapter which adds scopes to easily find all models currently in (or not in) a given state. Include it into your model and passing in <code>transition_class</code> and <code>initial_state</code> as options.</p>
<p>In 4.1.2 and below, these two options had to be defined as methods on the model, but 5.0.0 and above allow this style of configuration as well. The old method pollutes the model with extra class methods, and is deprecated, to be removed in 6.0.0.</p>
<pre><code class="language-ruby">class Order < ActiveRecord::Base
has_many :order_transitions, autosave: false
include Statesman::Adapters::ActiveRecordQueries[
transition_class: OrderTransition,
initial_state: OrderStateMachine.initial_state
]
end
</code></pre>
<p>If the transition class-name differs from the association name, you will also need to pass <code>transition_name</code> as an option:</p>
<pre><code class="language-ruby">class Order < ActiveRecord::Base
has_many :transitions, class_name: "OrderTransition", autosave: false
include Statesman::Adapters::ActiveRecordQueries[
transition_class: OrderTransition,
initial_state: OrderStateMachine.initial_state,
transition_name: :transitions
]
end
</code></pre>
<h4><code>Model.in_state(:state_1, :state_2, etc)</code></h4>
<p>Returns all models currently in any of the supplied states.</p>
<h4><code>Model.not_in_state(:state_1, :state_2, etc)</code></h4>
<p>Returns all models not currently in any of the supplied states.</p>
<h4><code>Model.most_recent_transition_join</code></h4>
<p>This joins the model to its most recent transition whatever that may be. We expose this method to ease use of ActiveRecord's <code>or</code> e.g</p>
<pre><code class="language-ruby">Model.in_state(:state_1).or(
Model.most_recent_transition_join.where(model_field: 123)
)
</code></pre>
<h2>Frequently Asked Questions</h2>
<h4>Storing the state on the model object</h4>
<p>If you wish to store the model state on the model directly, you can keep it up to date using an <code>after_transition</code> hook. Combine it with the <code>after_commit</code> option to ensure the model state will only be saved once the transition has made it irreversibly to the database:</p>
<pre><code class="language-ruby">after_transition(after_commit: true) do |model, transition|
model.state = transition.to_state
model.save!
end
</code></pre>
<p>You could also use a calculated column or view in your database.</p>
<h4>Accessing metadata from the last transition</h4>
<p>Given a field <code>foo</code> that was stored in the metadata, you can access it like so:</p>
<pre><code class="language-ruby">model_instance.state_machine.last_transition.metadata["foo"]
</code></pre>
<h4>Events</h4>
<p>Used to using a state machine with "events"? Support for events is provided by the <a href="https://github.com/gocardless/statesman-events">statesman-events</a> gem. Once that's included in your Gemfile you can include event functionality in your state machine as follows:</p>
<pre><code class="language-ruby">class OrderStateMachine
include Statesman::Machine
include Statesman::Events
...
end
</code></pre>
<h4>Deleting records.</h4>
<p>If you need to delete the Parent model regularly you will need to change either the association deletion behaviour or add a <code>DELETE CASCADE</code> condition to foreign key in your database.</p>
<p>E.g</p>
<pre><code>has_many :order_transitions, autosave: false, dependent: :destroy
</code></pre>
<p>or when migrating the transition model</p>
<pre><code>add_foreign_key :order_transitions, :orders, on_delete: :cascade
</code></pre>
<h2>Testing Statesman Implementations</h2>
<p>This answer was abstracted from <a href="https://github.com/gocardless/statesman/issues/77">this issue</a>.</p>
<p>At GoCardless we focus on testing that:</p>
<ul>
<li>guards correctly prevent / allow transitions</li>
<li>callbacks execute when expected and perform the expected actions</li>
</ul>
<h4>Testing Guards</h4>
<p>Guards can be tested by asserting that <code>transition_to!</code> does or does not raise a <code>Statesman::GuardFailedError</code>:</p>
<pre><code class="language-ruby">describe "guards" do
it "cannot transition from state foo to state bar" do
expect { some_model.transition_to!(:bar) }.to raise_error(Statesman::GuardFailedError)
end
it "can transition from state foo to state baz" do
expect { some_model.transition_to!(:baz) }.to_not raise_error
end
end
</code></pre>
<h4>Testing Callbacks</h4>
<p>Callbacks are tested by asserting that the action they perform occurs:</p>
<pre><code class="language-ruby">describe "some callback" do
it "adds one to the count property on the model" do
expect { some_model.transition_to!(:some_state) }.
to change { some_model.reload.count }.
by(1)
end
end
</code></pre>
<h2>Compatibility with type checkers</h2>
<p>Including ActiveRecordQueries to your model can cause issues with type checkers such as Sorbet, this is because this technically is using a dynamic include, which is not supported by Sorbet.</p>
<p>To avoid these issues you can instead include the TypeSafeActiveRecordQueries module and pass in configuration.</p>
<pre><code class="language-ruby">class Order < ActiveRecord::Base
has_many :order_transitions, autosave: false
include Statesman::Adapters::TypeSafeActiveRecordQueries
configure_state_machine transition_class: OrderTransition,
initial_state: :pending
def state_machine
@state_machine ||= OrderStateMachine.new(self, transition_class: OrderTransition)
end
end
</code></pre>
<h1>Third-party extensions</h1>
<p><a href="https://github.com/badosu/statesman-sequel">statesman-sequel</a> - An adapter to make Statesman work with <a href="https://github.com/jeremyevans/sequel">Sequel</a></p>
<hr>
<p>GoCardless ♥ open source. If you do too, come <a href="https://gocardless.com/about/careers/">join us</a>.</p>
-
-
- rubocop/rubocop-minitest
- 2023-10-10T01:39:22Z
- tag:github.com,2023-10-10:/rubocop/rubocop-minitest
-
- <p>Code style checking for Minitest files.</p><hr><h1>RuboCop Minitest</h1>
<p><a href="https://badge.fury.io/rb/rubocop-minitest"><img src="https://badge.fury.io/rb/rubocop-minitest.svg?sanitize=true" alt="Gem Version"></a> <a href="https://circleci.com/gh/rubocop/rubocop-minitest"><img src="https://circleci.com/gh/rubocop/rubocop-minitest.svg?style=svg" alt="CircleCI"></a></p>
<p>A <a href="https://github.com/rubocop/rubocop">RuboCop</a> extension focused on enforcing <a href="https://github.com/minitest/minitest">Minitest</a> best practices and coding conventions. The library is based on the guidelines outlined in the community <a href="https://minitest.rubystyle.guide">Minitest Style Guide</a>.</p>
<h2>Installation</h2>
<p>Just install the <code>rubocop-minitest</code> gem</p>
<pre><code class="language-sh">$ gem install rubocop-minitest
</code></pre>
<p>or if you use bundler put this in your <code>Gemfile</code></p>
<pre><code class="language-ruby">gem 'rubocop-minitest', require: false
</code></pre>
<h2>Usage</h2>
<p>You need to tell RuboCop to load the Minitest extension. There are three ways to do this:</p>
<h3>RuboCop configuration file</h3>
<p>Put this into your <code>.rubocop.yml</code>.</p>
<pre><code class="language-yaml">require: rubocop-minitest
</code></pre>
<p>Alternatively, use the following array notation when specifying multiple extensions.</p>
<pre><code class="language-yaml">require:
- rubocop-other-extension
- rubocop-minitest
</code></pre>
<p>Now you can run <code>rubocop</code> and it will automatically load the RuboCop Minitest cops together with the standard cops.</p>
<h3>Command line</h3>
<pre><code class="language-sh">$ rubocop --require rubocop-minitest
</code></pre>
<h3>Rake task</h3>
<pre><code class="language-ruby">RuboCop::RakeTask.new do |task|
task.requires << 'rubocop-minitest'
end
</code></pre>
<h2>The Cops</h2>
<p>All cops are located under <a href="https://raw.githubusercontent.com/rubocop/rubocop-minitest/master/lib/rubocop/cop/minitest"><code>lib/rubocop/cop/minitest</code></a>, and contain examples/documentation. The documentation is published <a href="https://docs.rubocop.org/rubocop-minitest/">here</a>.</p>
<p>In your <code>.rubocop.yml</code>, you may treat the Minitest cops just like any other cop. For example:</p>
<pre><code class="language-yaml">Minitest/AssertNil:
Exclude:
- test/my_file_to_ignore_test.rb
</code></pre>
<h2>Documentation</h2>
<p>You can read a lot more about RuboCop Minitest in its <a href="https://docs.rubocop.org/rubocop-minitest/">official docs</a>.</p>
<h2>Readme Badge</h2>
<p>If you use RuboCop Minitest in your project, you can include one of these badges in your readme to let people know that your code is written following the community Minitest Style Guide.</p>
<p><a href="https://github.com/rubocop/rubocop-minitest"><img src="https://img.shields.io/badge/code_style-rubocop-brightgreen.svg?sanitize=true" alt="Minitest Style Guide"></a></p>
<p><a href="https://minitest.rubystyle.guide"><img src="https://img.shields.io/badge/code_style-community-brightgreen.svg?sanitize=true" alt="Minitest Style Guide"></a></p>
<p>Here are the Markdown snippets for the two badges:</p>
<pre><code class="language-markdown">[![Minitest Style Guide](https://img.shields.io/badge/code_style-rubocop-brightgreen.svg)](https://github.com/rubocop/rubocop-minitest)
[![Minitest Style Guide](https://img.shields.io/badge/code_style-community-brightgreen.svg)](https://minitest.rubystyle.guide)
</code></pre>
<h2>Contributing</h2>
<p>Checkout the <a href="https://raw.githubusercontent.com/rubocop/rubocop-minitest/master/CONTRIBUTING.md">contribution guidelines</a>.</p>
<h2>License</h2>
<p><code>rubocop-minitest</code> is MIT licensed. <a href="https://raw.githubusercontent.com/rubocop/rubocop-minitest/master/LICENSE.txt">See the accompanying file</a> for the full text.</p>
+ twilio/twilio-ruby
+ 2023-10-11T01:39:03Z
+ tag:github.com,2023-10-11:/twilio/twilio-ruby
+
+ <p>A Ruby gem for communicating with the Twilio API and generating TwiML</p><hr><h1>twilio-ruby</h1>
<p><a href="https://github.com/twilio/twilio-ruby/actions/workflows/test-and-deploy.yml"><img src="https://github.com/twilio/twilio-ruby/actions/workflows/test-and-deploy.yml/badge.svg?sanitize=true" alt="Tests"></a> <a href="https://rubygems.org/gems/twilio-ruby"><img src="https://img.shields.io/gem/v/twilio-ruby.svg?sanitize=true" alt="Gem Version"></a> <a href="https://twil.io/learn-open-source"><img src="https://img.shields.io/static/v1?label=TwilioQuest&message=Learn%20to%20contribute%21&color=F22F46&labelColor=1f243c&style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAASFBMVEUAAAAZGRkcHBwjIyMoKCgAAABgYGBoaGiAgICMjIyzs7PJycnMzMzNzc3UoBfd3d3m5ubqrhfrMEDu7u739/f4vSb/3AD///9tbdyEAAAABXRSTlMAAAAAAMJrBrEAAAKoSURBVHgB7ZrRcuI6EESdyxXGYoNFvMD//+l2bSszRgyUYpFAsXOeiJGmj4NkuWx1Qeh+Ekl9DgEXOBwOx+Px5xyQhDykfgq4wG63MxxaR4ddIkg6Ul3g84vCIcjPBA5gmUMeXESrlukuoK33+33uID8TWeLAdOWsKpJYzwVMB7bOzYSGOciyUlXSn0/ABXTosJ1M1SbypZ4O4MbZuIDMU02PMbauhhHMHXbmebmALIiEbbbbbUrpF1gwE9kFfRNAJaP+FQEXCCTGyJ4ngDrjOFo3jEL5JdqjF/pueR4cCeCGgAtwmuRS6gDwaRiGvu+DMFwSBLTE3+jF8JyuV1okPZ+AC4hDFhCHyHQjdjPHUKFDlHSJkHQXMB3KpSwXNGJPcwwTdZiXlRN0gSp0zpWxNtM0beYE0nRH6QIbO7rawwXaBYz0j78gxjokDuv12gVeUuBD0MDi0OQCLvDaAho4juP1Q/jkAncXqIcCfd+7gAu4QLMACCLxpRsSuQh0igu0C9Svhi7weAGZg50L3IE3cai4IfkNZAC8dfdhsUD3CgKBVC9JE5ABAFzg4QL/taYPAAWrHdYcgfLaIgAXWJ7OV38n1LEF8tt2TH29E+QAoDoO5Ve/LtCQDmKM9kPbvCEBApK+IXzbcSJ0cIGF6e8gpcRhUDogWZ8JnaWjPXc/fNnBBUKRngiHgTUSivSzDRDgHZQOLvBQgf8rRt+VdBUUhwkU6VpJ+xcOwQUqZr+mR0kvBUgv6cB4+37hQAkXqE8PwGisGhJtN4xAHMzrsgvI7rccXqSvKh6jltGlrOHA3Xk1At3LC4QiPdX9/0ndHpGVvTjR4bZA1ypAKgVcwE5vx74ulwIugDt8e/X7JgfkucBMIAr26ndnB4UCLnDOqvteQsHlgX9N4A+c4cW3DXSPbwAAAABJRU5ErkJggg==" alt="Learn with TwilioQuest"></a></p>
<h2>Documentation</h2>
<p>The documentation for the Twilio API can be found <a href="https://www.twilio.com/docs/api">here</a>.</p>
<p>The individual releases <a href="https://twilio.github.io/twilio-ruby">here</a>.</p>
<h2>Versions</h2>
<p><code>twilio-ruby</code> uses a modified version of <a href="https://semver.org">Semantic Versioning</a> for all changes. <a href="https://raw.githubusercontent.com/twilio/twilio-ruby/main/VERSIONS.md">See this document</a> for details.</p>
<h3>Supported Ruby Versions</h3>
<p>This library supports the following Ruby implementations:</p>
<ul>
<li> <p>Ruby 2.4</p> </li>
<li> <p>Ruby 2.5</p> </li>
<li> <p>Ruby 2.6</p> </li>
<li> <p>Ruby 2.7</p> </li>
<li> <p>Ruby 3.0</p> </li>
<li> <p>Ruby 3.1</p> </li>
<li> <p>Ruby 3.2</p> </li>
<li> <p>JRuby 9.2</p> </li>
<li> <p>JRuby 9.3</p> </li>
<li> <p>JRuby 9.4</p> </li>
</ul>
<h3>Migrating from 5.x</h3>
<p><a href="https://github.com/twilio/twilio-ruby/wiki/Ruby-Version-5.x-Upgrade-Guide">Upgrade Guide</a></p>
<h2>Installation</h2>
<p>To install using <a href="https://bundler.io">Bundler</a> grab the latest stable version:</p>
<pre><code class="language-ruby">gem 'twilio-ruby', '~> 6.7.1'
</code></pre>
<p>To manually install <code>twilio-ruby</code> via <a href="https://rubygems.org">Rubygems</a> simply gem install:</p>
<pre><code class="language-bash">gem install twilio-ruby -v 6.7.1
</code></pre>
<p>To build and install the development branch yourself from the latest source:</p>
<pre><code class="language-bash">git clone git@github.com:twilio/twilio-ruby.git
cd twilio-ruby
make install
</code></pre>
<blockquote>
<p><strong>Info</strong> If the command line gives you an error message that says Permission Denied, try running the above commands with sudo.</p>
<p>For example: <code>sudo gem install twilio-ruby</code></p>
</blockquote>
<h3>Test your installation</h3>
<p>To make sure the installation was successful, try sending yourself an SMS message, like this:</p>
<pre><code class="language-rb">require "twilio-ruby"
# Your Account SID and Auth Token from console.twilio.com
account_sid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
auth_token = "your_auth_token"
@client = Twilio::REST::Client.new account_sid, auth_token
message = @client.messages.create(
body: "Hello from Ruby",
to: "+12345678901", # Text this number
from: "+15005550006", # From a valid Twilio number
)
puts message.sid
</code></pre>
<blockquote>
<p><strong>Warning</strong> It's okay to hardcode your credentials when testing locally, but you should use environment variables to keep them secret before committing any code or deploying to production. Check out <a href="https://www.twilio.com/blog/2017/01/how-to-set-environment-variables.html">How to Set Environment Variables</a> for more information.</p>
</blockquote>
<h2>Usage</h2>
<h3>Authenticate the Client</h3>
<pre><code class="language-ruby">require 'twilio-ruby'
# Your Account SID and Auth Token from console.twilio.com
account_sid = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
auth_token = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
# Initialize the Twilio Client with your credentials
@client = Twilio::REST::Client.new account_sid, auth_token
</code></pre>
<h3>Use An API Key</h3>
<pre><code class="language-ruby">require 'twilio-ruby'
# Your Account SID from console.twilio.com
account_sid = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# API Key from twilio.com/console/project/api-keys
api_key_sid = 'zzzzzzzzzzzzzzzzzzzzzz'
api_key_secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
# set up a client to talk to the Twilio REST API using an API Key
@client = Twilio::REST::Client.new api_key_sid, api_key_secret, account_sid
</code></pre>
<h3>Specify a Region and/or Edge</h3>
<p>To take advantage of Twilio's <a href="https://www.twilio.com/docs/global-infrastructure">Global Infrastructure</a>, specify the target Region and/or Edge for the client:</p>
<pre><code class="language-ruby"># set up a client to talk to the Twilio REST API over a specific region and edge
@client = Twilio::REST::Client.new account_sid, auth_token, nil, 'au1'
@client.edge = 'sydney'
# you may also specify the region and/or edge after client creation
@client = Twilio::REST::Client.new account_sid, auth_token
@client.region = 'au1'
@client.edge = 'sydney'
</code></pre>
<p>This will result in the <code>hostname</code> transforming from <code>api.twilio.com</code> to <code>api.sydney.au1.twilio.com</code>.</p>
<h3>Make a Call</h3>
<pre><code class="language-ruby">@client.calls.create(
from: '+14159341234',
to: '+16105557069',
url: 'http://example.com'
)
</code></pre>
<h3>Send an SMS</h3>
<pre><code class="language-ruby">@client.messages.create(
from: '+14159341234',
to: '+16105557069',
body: 'Hey there!'
)
</code></pre>
<h3>List your SMS Messages</h3>
<pre><code class="language-ruby">@client.messages.list(limit: 20)
</code></pre>
<h3>Fetch a single SMS message by Sid</h3>
<pre><code class="language-ruby"># put the message sid you want to retrieve here:
message_sid = 'SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
@client.messages(message_sid).fetch
</code></pre>
<h3>Iterate through records</h3>
<p>The library automatically handles paging for you. Collections, such as <code>calls</code> and <code>messages</code>, have <code>list</code> and stream methods that page under the hood. With both <code>list</code> and <code>stream</code>, you can specify the number of records you want to receive (<code>limit</code>) and the maximum size you want each page fetch to be (<code>page_size</code>). The library will then handle the task for you.</p>
<p><code>list</code> eagerly fetches all records and returns them as a list, whereas <code>stream</code> returns an enumerator and lazily retrieves pages of records as you iterate over the collection. You can also page manually using the <code>page</code> method.</p>
<p>For more information about these methods, view the <a href="https://www.twilio.com/docs/libraries/reference/twilio-ruby">auto-generated library docs</a>.</p>
<pre><code class="language-rb">require 'twilio-ruby'
account_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
auth_token = 'your_auth_token'
@client = Twilio::REST::Client.new(account_sid, auth_token)
@client.calls.list
.each do |call|
puts call.direction
end
</code></pre>
<h3>Enable Debug logging</h3>
<p>In order to enable debug logging, pass in a 'logger' instance to the client with the level set to at least 'DEBUG'</p>
<pre><code class="language-ruby">@client = Twilio::REST::Client.new account_sid, auth_token
myLogger = Logger.new(STDOUT)
myLogger.level = Logger::DEBUG
@client.logger = myLogger
@client = Twilio::REST::Client.new account_sid, auth_token
myLogger = Logger.new('my_log.log')
myLogger.level = Logger::DEBUG
@client.logger = myLogger
</code></pre>
<h3>Handle Exceptions {#exceptions}</h3>
<p>If the Twilio API returns a 400 or a 500 level HTTP response, the <code>twilio-ruby</code> library will throw a <code>Twilio::REST::RestError</code>. 400-level errors are normal during API operation (<code>“Invalid number”</code>, <code>“Cannot deliver SMS to that number”</code>, for example) and should be handled appropriately.</p>
<pre><code class="language-rb">require 'twilio-ruby'
account_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
auth_token = 'your_auth_token'
@client = Twilio::REST::Client.new account_sid, auth_token
begin
messages = @client.messages.list(limit: 20)
rescue Twilio::REST::RestError => e
puts e.message
end
</code></pre>
<h3>Debug API requests</h3>
<p>To assist with debugging, the library allows you to access the underlying request and response objects. This capability is built into the default HTTP client that ships with the library.</p>
<p>For example, you can retrieve the status code of the last response like so:</p>
<pre><code class="language-ruby">require 'rubygems' # Not necessary with ruby 1.9 but included for completeness
require 'twilio-ruby'
# Your Account SID and Auth Token from console.twilio.com
account_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
auth_token = 'your_auth_token'
@client = Twilio::REST::Client.new(account_sid, auth_token)
@message = @client.messages.create(
to: '+14158675309',
from: '+14258675310',
body: 'Ahoy!'
)
# Retrieve the status code of the last response from the HTTP client
puts @client.http_client.last_response.status_code
</code></pre>
<h3>Customize your HTTP Client</h3>
<p><code>twilio-ruby</code> uses <a href="https://github.com/lostisland/faraday">Faraday</a> to make HTTP requests. You can tell <code>Twilio::REST::Client</code> to use any of the Faraday adapters like so:</p>
<pre><code class="language-ruby">@client.http_client.adapter = :typhoeus
</code></pre>
<p>To use a custom HTTP client with this helper library, please see the <a href="https://raw.githubusercontent.com/twilio/twilio-ruby/main/advanced-examples/custom-http-client.md">advanced example of how to do so</a>.</p>
<p>To apply customizations such as middleware, you can use the <code>configure_connection</code> method like so:</p>
<pre><code class="language-ruby">@client.http_client.configure_connection do |faraday|
faraday.use SomeMiddleware
end
</code></pre>
<h3>Get started With Client Capability Tokens</h3>
<p>If you just need to generate a Capability Token for use with Twilio Client, you can do this:</p>
<pre><code class="language-ruby">require 'twilio-ruby'
# put your own account credentials here:
account_sid = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
auth_token = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
# set up
capability = Twilio::JWT::ClientCapability.new account_sid, auth_token
# allow outgoing calls to an application
outgoing_scope = Twilio::JWT::ClientCapability::OutgoingClientScope.new 'AP11111111111111111111111111111111'
capability.add_scope(outgoing_scope)
# allow incoming calls to 'andrew'
incoming_scope = Twilio::JWT::ClientCapability::IncomingClientScope.new 'andrew'
capability.add_scope(incoming_scope)
# generate the token string
@token = capability.to_s
</code></pre>
<p>There is a slightly more detailed document in the <a href="https://github.com/twilio/twilio-ruby/wiki/JWT-Tokens">Capability</a> section of the wiki.</p>
<h3>Generate TwiML</h3>
<p>To control phone calls, your application needs to output <a href="https://www.twilio.com/docs/api/twiml">TwiML</a>.</p>
<p>You can construct a TwiML response like this:</p>
<pre><code class="language-ruby">require 'twilio-ruby'
response = Twilio::TwiML::VoiceResponse.new do |r|
r.say(message: 'hello there', voice: 'alice')
r.dial(caller_id: '+14159992222') do |d|
d.client 'jenny'
end
end
# print the result
puts response.to_s
</code></pre>
<p>This will print the following (except for the whitespace):</p>
<pre><code class="language-xml"><?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say voice="alice">hello there</Say>
<Dial callerId="+14159992222">
<Client>jenny</Client>
</Dial>
</Response>
</code></pre>
<h2>Docker Image</h2>
<p>The <code>Dockerfile</code> present in this repository and its respective <code>twilio/twilio-ruby</code> Docker image are currently used by Twilio for testing purposes only.</p>
<h2>Getting help</h2>
<p>If you need help installing or using the library, please check the <a href="https://support.twilio.com">Twilio Support Help Center</a> first, and <a href="https://twilio.com/help/contact">file a support ticket</a> if you don't find an answer to your question.</p>
<p>If you've instead found a bug in the library or would like new features added, go ahead and open issues or pull requests against this repo!</p>
\ No newline at end of file
diff --git a/runoff/daily/index.xml b/runoff/daily/index.xml
index e8ec6eee591..c1eedad2a02 100644
--- a/runoff/daily/index.xml
+++ b/runoff/daily/index.xml
@@ -1,7 +1,7 @@
GitHub RUNOFF Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:06Z
+ 2023-10-11T01:38:56Z
Daily Trending of RUNOFF in GitHub
\ No newline at end of file
diff --git a/rust/daily/index.xml b/rust/daily/index.xml
index 05838708aba..99bbb073109 100644
--- a/rust/daily/index.xml
+++ b/rust/daily/index.xml
@@ -1,14 +1,28 @@
GitHub Rust Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:12Z
+ 2023-10-11T01:39:15Z
Daily Trending of Rust in GitHub
- fuzzland/ityfuzz
- 2023-10-10T01:39:12Z
- tag:github.com,2023-10-10:/fuzzland/ityfuzz
-
- <p>Blazing Fast Bytecode-Level Hybrid Fuzzer for Smart Contracts</p><hr><h1>ItyFuzz 🍦</h1>
<p>Fast hybrid fuzzer for EVM & MoveVM (WIP) smart contracts.</p>
<p>You can generate exploits <strong>instantly</strong> by just providing the contract address: <img src="https://ityfuzz.assets.fuzz.land/demo2.gif" alt=""></p>
<p><a href="https://github.com/fuzzland/ityfuzz/">Tool</a> / <a href="https://scf.so/ityfuzz.pdf">Research Paper</a> / <a href="https://raw.githubusercontent.com/fuzzland/ityfuzz/master/#building-evm">Fuzzing EVM Contracts</a> / <a href="https://raw.githubusercontent.com/fuzzland/ityfuzz/master/#building-with-move-sui-support">Fuzzing Move Contracts</a></p>
<h1>Statistics & Comparison</h1>
<p>Time taken for finding vulnerabilities / generating exploits:</p>
<table>
<thead>
<tr>
<th>Project Name</th>
<th>Vulnerability</th>
<th><strong>Mythril</strong></th>
<th><strong>SMARTIAN</strong></th>
<th><strong>Slither</strong></th>
<th><strong>ItyFuzz</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>AES</td>
<td>Business Logic</td>
<td>Inf</td>
<td>Unsupported</td>
<td>No</td>
<td>4hrs</td>
</tr>
<tr>
<td>Carrot</td>
<td>Arbitrary External Call</td>
<td>17s</td>
<td>11s</td>
<td>Yes</td>
<td>1s</td>
</tr>
<tr>
<td>Olympus</td>
<td>Access Control</td>
<td>36s</td>
<td>Inf</td>
<td>Yes</td>
<td>1s</td>
</tr>
<tr>
<td>MUMUG</td>
<td>Price Manipulation</td>
<td>Inf</td>
<td>Unsupported</td>
<td>No</td>
<td>18hrs</td>
</tr>
<tr>
<td>Omni</td>
<td>Reentrancy</td>
<td>Inf</td>
<td>Unsupported</td>
<td>Yes*</td>
<td>22hrs</td>
</tr>
<tr>
<td>Verilog CTF-2</td>
<td>Reentrancy</td>
<td>Inf</td>
<td>Unsupported</td>
<td>Yes*</td>
<td>3s</td>
</tr>
</tbody>
</table>
<p><sub>* Slither only finds the reentrancy location, but not how to leverage reentrancy to trigger final buggy code. The output also contains significant amount of false positives. </sub></p>
<p>Test Coverage:</p>
<table>
<thead>
<tr>
<th><strong>Dataset</strong></th>
<th><strong>SMARTIAN</strong></th>
<th><strong>Echidna</strong></th>
<th><strong>ItyFuzz</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>B1</td>
<td>97.1%</td>
<td>47.1%</td>
<td>99.2%</td>
</tr>
<tr>
<td>B2</td>
<td>86.2%</td>
<td>82.9%</td>
<td>95.4%</td>
</tr>
<tr>
<td>Tests</td>
<td>Unsupported</td>
<td>52.9%</td>
<td>100%</td>
</tr>
</tbody>
</table>
<p><sub>* B1 and B2 contain 72 single-contract projects from SMARTIAN artifacts. Tests are the projects in <code>tests</code> directory. The coverage is calculated as <code>(instruction covered) / (total instruction - dead code)</code>. </sub></p>
<hr>
<h1>Installation</h1>
<h2>ityfuzzup <strong>(Recommended)</strong></h2>
<p>ityfuzzup is a script that automatically installs all dependencies and builds ItyFuzz.</p>
<pre><code class="language-bash">curl -L https://ity.fuzz.land/ | bash
</code></pre>
<h2>Docker</h2>
<p>Install <a href="https://www.docker.com/">Docker</a> and run docker image suitable for your system architecture:</p>
<pre><code>docker pull fuzzland/ityfuzz:stable
docker run -p 8000:8000 fuzzland/ityfuzz:stable
</code></pre>
<p>Then, you can visit the interface at <a href="http://localhost:8000">http://localhost:8000</a></p>
<p><sub>Note: The container uses public ETH RPC, may time out / be slow</sub></p>
<h2>Build from Source</h2>
<p>You first need to install Rust through <a href="https://rustup.rs/">https://rustup.rs/</a></p>
<p>You need to have <code>libssl-dev</code> (OpenSSL) and <code>libz3-dev</code> (refer to <a href="https://raw.githubusercontent.com/fuzzland/ityfuzz/master/#z3-installation">Z3 Installation</a> section for instruction) installed.</p>
<pre><code class="language-bash">git clone https://github.com/fuzzland/ityfuzz.git && cd ityfuzz
git submodule update --recursive --init
cargo build --release
</code></pre>
<p>You can enable certain debug gates in <code>Cargo.toml</code></p>
<p><code>solc</code> is needed for compiling smart contracts. You can use <code>solc-select</code> tool to manage the version of <code>solc</code>.</p>
<h1>Run (EVM)</h1>
<p>Compile Smart Contracts:</p>
<pre><code class="language-bash">cd ./tests/evm/multi-contract/
# include the library from ./solidity_utils for example
solc *.sol -o . --bin --abi --overwrite --base-path ../../../
</code></pre>
<p>Run Fuzzer:</p>
<pre><code class="language-bash">ityfuzz evm -t '../tests/evm/multi-contract/*'
</code></pre>
<h3>Demo</h3>
<p><strong>Verilog CTF Challenge 2</strong> <code>tests/verilog-2/</code></p>
<p>Flashloan attack + Reentrancy. The target is to reach line 34 in <code>Bounty.sol</code>.</p>
<p>Exact Exploit:</p>
<pre><code>0. Borrow k MATIC such that k > balance() / 10
1. depositMATIC() with k MATIC
2. redeem(k * 1e18) -- reentrancy contract --> getBounty()
3. Return k MATIC
</code></pre>
<p>Use fuzzer to detect the vulnerability and generate the exploit (takes 0 - 200s):</p>
<pre><code class="language-bash"># build contracts in tests/evm/verilog-2/
solc *.sol -o . --bin --abi --overwrite --base-path ../../../
# run fuzzer
ityfuzz evm -f -t "../tests/evm/verilog-2/*"
</code></pre>
<p><code>-f</code> flag enables automated flashloan, which hooks all ERC20 external calls and make any users to have infinite balance.</p>
<h3>Fuzz a Project (Offline)</h3>
<p>You can fuzz a project by providing a path to the project directory.</p>
<pre><code class="language-bash">ityfuzz evm -t '[DIR_PATH]/*'
</code></pre>
<p>ItyFuzz would attempt to deploy all artifacts in the directory to a blockchain with no other smart contracts.</p>
<p>Specifically, the project directory should contain a few <code>[X].abi</code> and <code>[X].bin</code> files. For example, to fuzz a contract named <code>main.sol</code>, you should ensure <code>main.abi</code> and <code>main.bin</code> exist in the project directory. The fuzzer will automatically detect the contracts in directory, the correlation between them (see <code>tests/evm/multi-contract</code>), and fuzz them.</p>
<p>Optionally, if ItyFuzz fails to infer the correlation between contracts, you can add a <code>[X].address</code>, where <code>[X]</code> is the contract name, to specify the address of the contract.</p>
<p>Caveats:</p>
<ul>
<li>Keep in mind that ItyFuzz is fuzzing on a clean blockchain, so you should ensure all related contracts (e.g., ERC20 token, Uniswap, etc.) are deployed to the blockchain before fuzzing.</li>
<li>If your smart contract requires constructor arguments, please refer to below <a href="https://raw.githubusercontent.com/fuzzland/ityfuzz/master/#constructor-arguments">Constructor Arguments</a> section.</li>
</ul>
<h3>Fuzz a Project (Online)</h3>
<p>Ityfuzz will prioritize the use of environment variables <code>ETH_RPC_URL</code> as the RPC endpoint, otherwise it will use built-in public RPCs.</p>
<p>Rebuild with <code>flashloan_v2</code> (only supported in onchain) enabled to get better result.</p>
<pre><code class="language-bash">python3 -c 'content=open("Cargo.toml").read().replace("default = [", "default = [\"flashloan_v2\",");open("Cargo.toml","w").write(content);'
cargo build --release
</code></pre>
<p>You can fuzz a project by providing an address, a block, and a chain type.</p>
<pre><code class="language-bash">ityfuzz evm -o -t [TARGET_ADDR] --onchain-block-number [BLOCK] -c [CHAIN_TYPE] --onchain-etherscan-api-key [Etherscan API Key]
</code></pre>
<p>Example: Fuzzing WETH contract (<code>0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2</code>) on Ethereum mainnet at latest block.</p>
<pre><code class="language-bash">ityfuzz evm -o -t 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 --onchain-block-number 0 -c ETH --onchain-etherscan-api-key PXUUKVEQ7Y4VCQYPQC2CEK4CAKF8SG7MVF
</code></pre>
<p>Fuzzing with flashloan and oracles enabled:</p>
<pre><code class="language-bash">ityfuzz evm -o -t 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 --onchain-block-number 0 -c ETH -f -i -p --onchain-etherscan-api-key PXUUKVEQ7Y4VCQYPQC2CEK4CAKF8SG7MVF
</code></pre>
<p>ItyFuzz would pull the ABI of the contract from Etherscan and fuzz it. If ItyFuzz encounters an unknown slot in the memory, it would pull the slot from chain RPC. If ItyFuzz encounters calls to external unknown contract, it would pull the bytecode and ABI of that contract. If its ABI is not available, ItyFuzz would not send any transaction to that contract.</p>
<h3>Constructor Arguments</h3>
<p>ItyFuzz provides two methods to pass in constructor arguments. These arguments are necessary for initializing the state of the contract when deployed.</p>
<p><strong>Method 1: CLI Arguments</strong></p>
<p>The first method is to pass in the constructor arguments directly as CLI arguments.</p>
<p>When you run ItyFuzz using the CLI, you can include the <code>--constructor-args</code> flag followed by a string that specifies the arguments for each constructor.</p>
<p>The format is as follows:</p>
<pre><code>ityfuzz evm -t 'tests/evm/multi-contract/*' --constructor-args "ContractName:arg1,arg2,...;AnotherContract:arg1,arg2,..;"
</code></pre>
<p>For example, if you have two contracts, <code>main</code> and <code>main2</code>, both having a <code>bytes32</code> and a <code>uint256</code> as constructor arguments, you would pass them in like this:</p>
<pre><code class="language-bash">ityfuzz evm -t 'tests/evm/multi-contract/*' --constructor-args "main:1,0x6100000000000000000000000000000000000000000000000000000000000000;main2:2,0x6200000000000000000000000000000000000000000000000000000000000000;"
</code></pre>
<p><strong>Method 2: Server Forwarding</strong></p>
<p>The second method is to use our server to forward requests to a user-specified RPC, and cli will fetch the constructor arguments from the transactions sent to the RPC.</p>
<p>Firstly, go to the <code>/server</code> directory, and install the necessary packages:</p>
<pre><code class="language-bash">cd /server
npm install
</code></pre>
<p>Then, start the server using the following command:</p>
<pre><code class="language-bash">node app.js
</code></pre>
<p>By default, the server will forward requests to <code>http://localhost:8545</code>, which is the default address for <a href="https://github.com/trufflesuite/ganache">Ganache</a>, if you do not have a local blockchain running, you can use Ganache to start one. If you wish to forward requests to another location, you can specify the address as a command-line argument like so:</p>
<pre><code class="language-bash">node app.js http://localhost:8546
</code></pre>
<p>Once the server is running, you can deploy your contract to <code>localhost:5001</code> using a tool of your choice.</p>
<p>For example, you can use Foundry to deploy your contract through the server:</p>
<pre><code class="language-bash">forge create src/flashloan.sol:main2 --rpc-url http://127.0.0.1:5001 --private-key 0x0000000000000000000000000000000000000000000000000000000000000000 --constructor-args "1" "0x6100000000000000000000000000000000000000000000000000000000000000"
</code></pre>
<p>Finally, you can fetch the constructor arguments using the <code>--fetch-tx-data</code> flag:</p>
<pre><code class="language-bash">ityfuzz evm -t 'tests/evm/multi-contract/*' --fetch-tx-data
</code></pre>
<p>ItyFuzz will fetch the constructor arguments from the transactions forwarded to the RPC through the server.</p>
<h3>Concolic Execution Support (Experimental)</h3>
<p>Concolic execution can be performed on certain testcases on the fly during fuzzing. It is particularly useful for fuzzing code with complex if-conditions. You can add <code>--concolic</code> to args to make fuzzer conduct concolic execution. You can also add <code>--concolic-caller</code> to args to make fuzzer solve for callers.</p>
<p>Example:</p>
<pre><code>cd tests/evm/concolic-1/ && solc *.sol -o . --bin --abi --overwrite --base-path ../../../ && ../../../
ityfuzz evm -t 'tests/evm/concolic-1/*' --concolic --concolic-caller
</code></pre>
<h1>Finding Custom Bugs (EVM)</h1>
<p>You can simply insert <code>bug()</code> or <code>typed_bug(string message)</code> in your contract to report a condition when bug is found.</p>
<p>For instance, a simple case can be written as follows:</p>
<pre><code class="language-solidity">function buy_token() public {
if (msg.sender != owner) {
bug();
}
}
</code></pre>
<p>The implementation of <code>bug()</code> is as follows:</p>
<pre><code class="language-solidity">library FuzzLand {
event AssertionFailed(string message);
function bug() internal {
emit AssertionFailed("Bug");
}
function typed_bug(string memory data) internal {
emit AssertionFailed(data);
}
}
function bug() {
FuzzLand.bug();
}
function typed_bug(string memory data) {
FuzzLand.typed_bug(data);
}
</code></pre>
<p>You can either paste the code above into your contract or import it from <code>solidity_utils/lib.sol</code>, if you are using <code>bug</code> or <code>typed_bug</code>.</p>
<h3>Echidna Support</h3>
<p>Any contracts bearing functions starting with <code>echidna_</code> will be treated as invariants and will be tested by ItyFuzz. If it returns <code>false</code>, the fuzzer will report a bug.</p>
<pre><code class="language-solidity">function echidna_test() public {
assert(false);
}
</code></pre>
<h3>Scribble Support</h3>
<p>Scribble is a tool for writing specifications for Solidity contracts. ItyFuzz supports Scribble annotations after it is compiled by <code>scribble</code>.</p>
<p>For example, the following contract has a Scribble annotation that specifies the return value of <code>inc</code>:</p>
<pre><code class="language-bash">contract Foo {
/// #if_succeeds {:msg "P1"} y == x + 2;
function inc(uint x) public pure returns (uint y) {
return x+1;
}
}
</code></pre>
<p>You need to compile the contract using <code>scribble</code> and pass the compiled contract to ItyFuzz</p>
<p>Note that you must add <code>--no-assert</code> to the <code>scribble</code> command. Otherwise, ItyFuzz will not detect any bugs.</p>
<pre><code class="language-bash">scribble test.sol --output-mode flat --output compiled.sol --no-assert
</code></pre>
<p>Then compile with <code>solc</code> and run ItyFuzz:</p>
<pre><code class="language-bash">solc compiled.sol --bin --abi --overwrite -o build
ityfuzz evm -t "build/*" [More Arguments]
</code></pre>
<h1>Test Coverage</h1>
<p>ItyFuzz can collect instruction and branch coverage information for all the contracts it fuzzes. You simply need to append <code>--replay-file [WORKDIR]/corpus/*_replayable</code> to collect all these information.</p>
<pre><code class="language-bash">ityfuzz evm -t [Targets] [Options Used During Fuzzing] --replay-file '[WORKDIR]/corpus/*_replayable'
</code></pre>
<p>Example:</p>
<pre><code class="language-bash">ityfuzz evm -t 'tests/evm/multi-contract/*' --replay-file 'work_dir/corpus/*_replayable'
</code></pre>
<p>You may add source map information to the targets to get more accurate coverage information and uncovered source code. To get source map information, you simply need to append <code>--combined-json bin-runtime,srcmap-runtime</code> to the solc command when building the targets.</p>
<pre><code class="language-bash"># run in your target building directory (where you run solc)
solc [Options Used During Building] --combined-json bin-runtime,srcmap-runtime
</code></pre>
<p>Example:</p>
<pre><code class="language-bash"># build contracts in tests/evm/verilog-2/
solc *.sol -o . --bin --abi --overwrite --base-path ../../ --combined-json bin-runtime,srcmap-runtime
</code></pre>
<p>Rarely, ItyFuzz has trouble to figure out the source code location. You may supply the <strong>absolute</strong> path to the base location (what you passed to solc's --base-path or if you didn't pass anything, it is the building directory) to ItyFuzz.</p>
<pre><code class="language-bash">ityfuzz evm -t [Targets] [Options Used During Fuzzing] --replay-file '[WORKDIR]/corpus/*_replayable' --base-path [ABSOLUTE PATH TO BASE LOCATION]
</code></pre>
<p>Example:</p>
<pre><code class="language-bash"># note that we used --base-path ../../ when building the targets so it is /home/user/ityfuzz/tests/evm/verilog-2/../../
ityfuzz evm -t 'tests/evm/multi-contract/*' --replay-file 'work_dir/corpus/*_replayable' --base-path /home/user/ityfuzz
</code></pre>
<p>We do not track coverage of static calls (view, pure functions) by default!</p>
<h1>Building With Move (Sui) Support</h1>
<p>Build with feature <code>sui_support</code> in <code>./Cargo.toml</code> to enable Move support.</p>
<pre><code class="language-bash"># add sui_support feature to Cargo.toml
python3 -c 'content=open("Cargo.toml").read().replace("default = [", "default = [\"sui_support\",");open("Cargo.toml","w").write(content);'
# build ItyFuzz with sui_support feature
cargo build --release
</code></pre>
<p>You may also want to install <code>sui-cli</code> to build Move contracts.</p>
<h1>Run (Move)</h1>
<p>Compile the contracts with <code>sui move build</code> and run ItyFuzz:</p>
<pre><code class="language-bash"># build example contract that contains a bug
cd ./tests/move/share_object
sui move build
# get back to ItyFuzz and run fuzzing on the built contract
cd ../../../
ityfuzz move -t "./tests/move/share_object/build"
</code></pre>
<h1>Reporting Bugs (Move)</h1>
<p>You can emit an event of `` in your contract to report a condition when bug is found.</p>
<pre><code class="language-move">// define the event struct
use sui::event;
struct AAAA__fuzzland_move_bug has drop, copy, store {
info: u64
}
...
// inside function
event::emit(AAAA__fuzzland_move_bug { info: 1 });
...
</code></pre>
<p>An example contract that report a bug can be found in <code>tests/move/share_object/sources/test.move</code>.</p>
<h1>Troubleshooting</h1>
<h3>Z3 Installation</h3>
<p><strong>macOS</strong></p>
<pre><code class="language-bash">git clone https://github.com/Z3Prover/z3 && cd z3
python scripts/mk_make.py --prefix=/usr/local
cd build && make -j64 && sudo make install
</code></pre>
<p>If the build command still fails for not finding <code>z3.h</code>, do <code>export Z3_SYS_Z3_HEADER=/usr/local/include/z3.h</code></p>
<p>Or you can use</p>
<pre><code class="language-bash">brew install z3
</code></pre>
<p><strong>Ubuntu</strong></p>
<pre><code class="language-bash">apt install libz3-dev
</code></pre>
<h3>Onchain Fetching</h3>
<p>ItyFuzz attempts to fetch storage from blockchain nodes when SLOAD is encountered and the target is uninitialized. There are three ways of fetching:</p>
<ul>
<li>OneByOne: fetch one slot at a time. This is the default mode. It is slow but never fails.</li>
<li>All: fetch all slots at once using custom API <code>eth_getStorageAll</code> on our nodes. This is the fastest mode, but it may fail if the contract is too large.</li>
<li>Dump: dump storage using debug API <code>debug_storageRangeAt</code>. This only works for ETH (for now) and fails most of the time.</li>
</ul>
<h1>Citation</h1>
<pre><code>@inproceedings{10.1145/3597926.3598059,
author = {Shou, Chaofan and Tan, Shangyin and Sen, Koushik},
title = {ItyFuzz: Snapshot-Based Fuzzer for Smart Contract},
year = {2023},
isbn = {9798400702211},
publisher = {Association for Computing Machinery},
address = {New York, NY, USA},
url = {https://doi.org/10.1145/3597926.3598059},
doi = {10.1145/3597926.3598059},
booktitle = {Proceedings of the 32nd ACM SIGSOFT International Symposium on Software Testing and Analysis},
pages = {322–333},
numpages = {12},
location = {Seattle, WA, USA},
series = {ISSTA 2023}
}
</code></pre>
<h1>Acknowledgement</h1>
<p>This work was supported in part by NSF grants CCF-1900968, CCF1908870, and CNS1817122 and SKY Lab industrial sponsors and affiliates Astronomer, Google, IBM, Intel, Lacework, Microsoft, Mohamed Bin Zayed University of Artificial Intelligence, Nexla, Samsung SDS, Uber, and VMware. Any opinions, findings, conclusions, or recommendations in this repo do not necessarily reflect the position or the policy of the sponsors.</p>
<p>Grants:</p>
<table>
<thead>
<tr>
<th align="center">Grants</th>
<th align="center">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"><img src="https://ityfuzz.assets.fuzz.land/sui.jpg" width="100px/"></td>
<td align="center">Grants from Sui Foundation for building Move and chain-specific support</td>
</tr>
<tr>
<td align="center"><img src="https://ityfuzz.assets.fuzz.land/web3.png" width="100px/"></td>
<td align="center">Grants from Web3 Foundation for building Substrate pallets and Ink! support</td>
</tr>
</tbody>
</table>
+ paradedb/paradedb
+ 2023-10-11T01:39:15Z
+ tag:github.com,2023-10-11:/paradedb/paradedb
+
+ <p>PostgreSQL for Search</p><hr><h1 align="center"> <img src="https://raw.githubusercontent.com/paradedb/paradedb/dev/docs/logo/readme.svg?sanitize=true" alt="ParadeDB" width="368px"> <br> </h1>
<p align="center"> <b>PostgreSQL for Search</b> <br> </p>
<h3 align="center"> <a href="https://paradedb.com">Website</a> • <a href="https://docs.paradedb.com">Documentation</a> • <a href="https://paradedb.com/blog">Blog</a> • <a href="https://join.slack.com/t/paradedbcommunity/shared_invite/zt-217mordsh-ielS6BiZf7VW3rqKBFgAlQ">Community</a> </h3>
<hr>
<p><a href="https://github.com/paradedb/paradedb/actions/workflows/publish-paradedb-to-dockerhub.yml"><img src="https://github.com/paradedb/paradedb/actions/workflows/publish-paradedb-to-dockerhub.yml/badge.svg?sanitize=true" alt="Publishing"></a> <a href="https://github.com/paradedb/paradedb/actions/workflows/benchmark-paradedb.yml"><img src="https://github.com/paradedb/paradedb/actions/workflows/benchmark-paradedb.yml/badge.svg?sanitize=true" alt="Benchmarking"></a></p>
<p><a href="https://paradedb.com">ParadeDB</a> is an ElasticSearch alternative built on PostgreSQL, engineered for lightning-fast full text, similarity, and hybrid search.</p>
<p>It offers the most comprehensive, Postgres-native search features of any Postgres database, so you don't need to glue cumbersome services like a search engine or vector database on top.</p>
<h2>Key Benefits</h2>
<ul>
<li> <p>⚡ <strong>Speed</strong>: ParadeDB is built in Rust on top of PostgreSQL and Tantivy, a Rust-based implementation of Apache Lucene. See our benchmarks <a href="https://raw.githubusercontent.com/paradedb/paradedb/benchmarks/README.md">here</a>.</p> </li>
<li> <p>🌿 <strong>Simplicity</strong>: Consolidate your database and search engine into a single system, so you don't need to worry about keeping separate services in sync.</p> </li>
<li> <p>🐘 <strong>SQL First</strong>: Write search queries in SQL with ACID transactions.</p> </li>
<li> <p>🚀 <strong>Scalability</strong>: Scale to millions of rows with support for distributed search, high availability, backups, and point-in-time-recovery.</p> </li>
</ul>
<h2>Status</h2>
<p>ParadeDB is still under active development and should be used in production with caution. We're aiming to be fully stable by the end of October 2023.</p>
<p>We are currently in Private Beta. Star & watch this repo to get notified of major updates.</p>
<h3>Roadmap</h3>
<ul>
<li><input type="checkbox" disabled> Search
<ul>
<li><input type="checkbox" checked disabled> Full-text search with BM25 with <a href="https://github.com/paradedb/paradedb/tree/dev/pg_bm25#overview">pg_bm25</a></li>
<li><input type="checkbox" checked disabled> Similarity search with <a href="https://github.com/pgvector/pgvector#pgvector">pgvector</a></li>
<li><input type="checkbox" checked disabled> Hybrid search with <a href="https://github.com/paradedb/paradedb/tree/dev/pg_search#overview">pg_search</a></li>
<li><input type="checkbox" checked disabled> Real-time search</li>
<li><input type="checkbox" disabled> Faceted search</li>
<li><input type="checkbox" disabled> Distributed search</li>
<li><input type="checkbox" disabled> Generative search</li>
<li><input type="checkbox" disabled> Multimodal search</li>
</ul> </li>
<li><input type="checkbox" checked disabled> Self-hosting
<ul>
<li><input type="checkbox" checked disabled> Docker image & <a href="https://docs.paradedb.com/deploy/aws">deployment instructions</a></li>
<li><input type="checkbox" checked disabled> Kubernetes Helm chart & <a href="https://docs.paradedb.com/deploy/helm">deployment instructions</a></li>
</ul> </li>
<li><input type="checkbox" disabled> Cloud Database
<ul>
<li><input type="checkbox" disabled> Managed cloud</li>
<li><input type="checkbox" disabled> Self-serve cloud</li>
<li><input type="checkbox" disabled> Public Cloud (AWS, GCP, Azure) Marketplace Images</li>
<li><input type="checkbox" disabled> High availability</li>
</ul> </li>
<li><input type="checkbox" disabled> Web-based SQL Editor</li>
</ul>
<h2>Installation</h2>
<h3>ParadeDB Cloud</h3>
<p>Coming soon! Sign up for the <a href="https://paradedb.typeform.com/to/jHkLmIzx">ParadeDB Cloud waitlist</a>.</p>
<h3>Self-Hosted</h3>
<p>To install ParadeDB locally or on-premise, simply pull and run the latest Docker image:</p>
<pre><code class="language-bash">docker run \
-e POSTGRES_USER=<user> \
-e POSTGRES_PASSWORD=<password> \
-e POSTGRES_DB=<dbname> \
-p 5432:5432 \
-d \
paradedb/paradedb:latest
</code></pre>
<p>By default, this will start the ParadeDB database at <code>http://localhost:5432</code>. Use <code>psql</code> to connect:</p>
<pre><code class="language-bash">psql -h <hostname> -U <user> -d <dbname> -p 5432 -W
</code></pre>
<p>To install the ParadeDB extension(s) manually within an existing self-hosted Postgres, see the extension(s)' README. We strongly recommend using the ParadeDB Docker image, which is optimized for running search in Postgres.</p>
<p>If you are self-hosting Postgres and are interested in ParadeDB, please <a href="mailto:hello@paradedb.com">contact the ParadeDB team</a> and we'll be happy to help!</p>
<h2>Getting Started</h2>
<p>To get started using ParadeDB, please follow the <a href="https://docs.paradedb.com/quickstart">quickstart guide</a>!</p>
<h2>Documentation</h2>
<p>You can find the complete documentation for ParadeDB at <a href="https://docs.paradedb.com">docs.paradedb.com</a>.</p>
<h2>Support</h2>
<p>If you're missing a feature or have found a bug, please open a <a href="https://github.com/paradedb/paradedb/issues/new/choose">GitHub Issue</a>.</p>
<p>To get community support, you can:</p>
<ul>
<li>Post a question in the <a href="https://join.slack.com/t/paradedbcommunity/shared_invite/zt-217mordsh-ielS6BiZf7VW3rqKBFgAlQ">ParadeDB Slack Community</a></li>
<li>Ask for help on our <a href="https://github.com/paradedb/paradedb/discussions">GitHub Discussions</a></li>
</ul>
<p>If you need commercial support, please <a href="mailto:sales@paradedb.com">contact the ParadeDB team</a>.</p>
<h2>Contributing</h2>
<p>We welcome community contributions, big or small, and are here to guide you along the way. To get started contributing, check our <a href="https://github.com/paradedb/paradedb/labels/good%20first%20issue">first timer issues</a> or message us in the <a href="https://join.slack.com/t/paradedbcommunity/shared_invite/zt-217mordsh-ielS6BiZf7VW3rqKBFgAlQ">ParadeDB Community Slack</a>. Once you contribute, ping us in Slack and we'll send you some ParadeDB swag!</p>
<p>For more information on how to contribute, please see our <a href="https://raw.githubusercontent.com/paradedb/paradedb/dev/CONTRIBUTING.md">Contributing Guide</a>.</p>
<p>This project is released with a <a href="https://github.com/paradedb/paradedb/raw/stable/CODE_OF_CONDUCT.md">Contributor Code of Conduct</a>. By participating in this project, you agree to follow its terms.</p>
<p>Thank you for helping us make ParadeDB better for everyone <span>❤️</span>.</p>
<h2>License</h2>
<p>ParadeDB is licensed under the <a href="https://raw.githubusercontent.com/paradedb/paradedb/dev/LICENSE">GNU Affero General Public License v3.0</a>.</p>
+
+
+ huachaohuang/sigma
+ 2023-10-11T01:39:15Z
+ tag:github.com,2023-10-11:/huachaohuang/sigma
+
+ <p>The Sigma programming language</p><hr><h1>The Sigma Programming Language</h1>
<p>This is an experimental project to build a modern SQL alternative called Sigma.</p>
<p>Sigma tries to combine the power of relational calculus and common programming languages.</p>
<h2>Usage</h2>
<pre><code>cargo run
</code></pre>
<p>This will run an interactive shell like this:</p>
<pre><code>Sigma 0.0.1
>>>
</code></pre>
<p>Then input some expressions and see what happens!</p>
<p>There is a built-in json module. You can load some json file and process it with Sigma:</p>
<pre><code>>>> import json
>>> list = json.load("path/to/file.json")
</code></pre>
<h2>Statements</h2>
<p>Syntax:</p>
<pre><code>Expression [';'] |
'import' Name [';'] |
CreateClass |
DeleteClass
</code></pre>
<h3>Create class statement</h3>
<p>Syntax:</p>
<pre><code>'create' 'class' Name '{'
(Name ':' TypeName ',')*
['id' Name (',' Name)*]
'}'
TypeName = 'bool' | 'i64' | 'f64' | 'text'
</code></pre>
<p>Example:</p>
<pre><code>create class User { name: text, score: i64, id name }
</code></pre>
<p>You must specify the id fields for a class. The type of id fields can only be <code>i64</code> or <code>text</code> for now. In this example, the "name" field will be used as the id of the class. By default, if the id is not specified, a field name "id" will be used as the id. For example:</p>
<pre><code>create class User { id: text, score: i64 }
</code></pre>
<p>In this case the "id" field will be used as the id of the class.</p>
<p>After a class is created, the name of the class will represent a set of instances of that class. Then you can manipulate the class set like other collections:</p>
<pre><code>>>> create class User { name: text, score: i64, id name }
>>> into User insert { name: "a", score: 1 }, { name: "b", score: 2 }
2
>>> from u in User select u.score
[2, 1]
>>> from u in User update u.score *= 2
2
>>> User
{
{name: "a", score: 2}
{name: "b", score: 4}
}
</code></pre>
<h3>Delete class statement</h3>
<p>Syntax:</p>
<pre><code>'delete' 'class' Name
</code></pre>
<h2>Expressions</h2>
<p>Sigma is a strongly-typed scripting language. There is no implicit type conversions. For example, you can not add an integer with a boolean or a floating-point number.</p>
<h3>Literal expressions</h3>
<h4>Null</h4>
<p>TODO</p>
<h4>Boolean</h4>
<p>A boolean expression consists of one of the keywords <code>true</code> or <code>false</code>.</p>
<h4>Numeric</h4>
<h5>Integer numbers</h5>
<p>An integer literal should match the regular expression <code>[0-9]+</code>. For now, integer literal will be evaluated to 64bit signed integers at runtime.</p>
<p>Example:</p>
<pre><code>>>> 123
123
</code></pre>
<h5>Floating-point numbers</h5>
<p>A floatint-point literal should match the regular expression <code>[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?</code>. For now, floating-point literals will be evaluated to 64bit double-precision floating-point numbers at runtime.</p>
<p>Example:</p>
<pre><code>>>> 1.2
1.2
</code></pre>
<h5>Arbitrary-precision numbers</h5>
<p>TODO</p>
<h4>Text strings</h4>
<p>A string literal should match the regular expression <code>"([^"\\]|\\.)*"</code>.</p>
<pre><code>>>> "abc"
"abc"
>>> "ab\"cd\n"
"ab\"cd\n"
</code></pre>
<h3>Operator expressions</h3>
<h4>Binary operators</h4>
<p>Syntax:</p>
<pre><code>Expression '+' Expression |
Expression '-' Expression |
Expression '*' Expression |
Expression '/' Expression |
Expression '%' Expression |
Expression '|' Expression |
Expression '^' Expression |
Expression '&' Expression |
</code></pre>
<p>Example:</p>
<pre><code>>>> 1 + 2
3
>>> true | false
true
>>> true & false
false
</code></pre>
<h4>Negation operators</h4>
<p>Syntax:</p>
<pre><code>'!' Expression |
'-' Expression
</code></pre>
<p>Example:</p>
<pre><code>>>> !true
false
>>> -1234
-1234
</code></pre>
<h4>Comparison operators</h4>
<p>Syntax:</p>
<pre><code>Expression '==' Expression |
Expression '!=' Expression |
Expression '<' Expression |
Expression '<=' Expression |
Expression '>' Expression |
Expression '>=' Expression |
Expression 'in' Expression |
Expression 'not' 'in' Expression
</code></pre>
<p>Example:</p>
<pre><code>>>> 1 == 1
true
>>> 1 != 1
false
>>> 1 in [1, 2]
true
>>> 1 not in [1, 2]
false
</code></pre>
<h3>List and index expressions</h3>
<h4>List</h4>
<p>List is a ordered sequence of objects.</p>
<p>Syntax:</p>
<pre><code>'[' (Expression ',')* Expression? ']'
</code></pre>
<p>Example:</p>
<pre><code>>>> []
[]
>>> [1, 2 + 3]
[1, 5]
>>> [1, 2, 3,]
[1, 2, 3]
</code></pre>
<h4>Index</h4>
<p>Syntax:</p>
<pre><code>Expression '[' Expression ']'
</code></pre>
<p>Example:</p>
<pre><code>>>> [1, 2, 3][0]
1
</code></pre>
<h3>Hash and field expressions</h3>
<h4>Hash</h4>
<p>Hash is a set of unordered name/value pairs. Hash field name can be an identifier or a string.</p>
<p>Syntax:</p>
<pre><code>'{' (Name ':' Expression ',')* (Name ':' Expression)? '}'
</code></pre>
<p>Example:</p>
<pre><code>>>> {}
{}
>>> {a: 1 + 1, b: "2"}
{a: 2, b: "2"}
>>> {foo: "foo", "foo bar": "foo bar"}
{foo: "foo", foo bar: "foo bar"}
</code></pre>
<h4>Field</h4>
<p>Syntax:</p>
<pre><code>Expression '.' Name
</code></pre>
<p>Example:</p>
<pre><code>>>> x = {foo: "bar", "foo bar": "foo bar"}
>>> x.foo
"bar"
>>> x."foo bar"
"foo bar"
</code></pre>
<h3>Assignment</h3>
<p>Syntax:</p>
<pre><code>Expression '=' Expression
</code></pre>
<pre><code>>>> a = [1, 2]
>>> a[0] = 2
>>> a
[2, 2]
>>> b = {x: 1, y: 1}
>>> b.x = 2
>>> b
{x: 2, y: 1}
</code></pre>
<h3>Collection expressions</h3>
<p>There is two kinds of collection for now: list and class.</p>
<h4>Insert</h4>
<p>Syntax:</p>
<pre><code>'into' Expression 'insert' (Expression ',')* Expression ','?
</code></pre>
<p>Example:</p>
<pre><code>>>> list = [1, 2]
>>> into list insert 3, 4
2
>>> list
>>> [1, 2, 3, 4]
</code></pre>
<h4>Update</h4>
<p>Syntax:</p>
<pre><code>'from' Name 'in' Expression ['where' Expression] 'update' Expression
</code></pre>
<p>Example:</p>
<pre><code>>>> list = [1, 2, 3]
>>> from x in list update x *= 2
3
>>> list
[2, 4, 6]
>>> from x in list where x == 4 update x += 1
1
>>> list
[2, 5, 6]
</code></pre>
<h4>Delete</h4>
<p>Syntax:</p>
<pre><code>'from' Name 'in' Expression ['where' Expression] 'delete' Name
</code></pre>
<p>Example:</p>
<pre><code>>>> list = [{a: 1, b: 2}, {a: 3, b: 4}]
>>> from x in list delete x
2
>>> list
[]
>>> list = [{a: 1, b: 2}, {a: 3, b: 4}]
>>> from x in list where x.a < 2 delete x
1
>>> list
[{a: 3, b: 4}]
</code></pre>
<h4>Select</h4>
<p>Syntax:</p>
<pre><code>'from' Name 'in' Expression
['join' Name 'in' Expression ['on' Expression]]
['where' Expression]
['limit' Expression]
['select' Expression]
</code></pre>
<p>Example:</p>
<pre><code>>>> list = from x in [1, 2, 3, 4] select { a: x, b: x * 2 }
[{a: 1, b: 2}, {a: 2, b: 4}, {a: 3, b: 6}, {a: 4, b: 8}]
>>> from x in list where x.a < 4
[{a: 1, b: 2}, {a: 2, b: 4}, {a: 3, b: 6}]
>>> from x in list where x.a < 4 limit 1
[{a: 1, b: 2}]
>>> from x in list where x.a < 4 limit 1..
[{a: 2, b: 4}, {a: 3, b: 6}]
>>> from x in list where x.a < 4 limit 1..2
[{a: 2, b: 4}]
>>> from x in list select x.a
[1, 2, 3, 4]
>>> from x in list where x.a < 4 limit 2 select { a: x.a, c: x.a + x.b }
[{a: 1, c: 3}, {a: 2, c: 6}]
>>> list2 = from x in [3, 4, 5, 6] select { a: x, c: x * 3 }
[{a: 3, c: 9}, {a: 4, c: 12}, {a: 5, c: 15}, {a: 6, c: 18}]
>>> from x1 in list join x2 in list2 on x1.a == x2.a
[{x1: {a: 3, b: 6}, x2: {a: 3, c: 9}}, {x1: {a: 4, b: 8}, x2: {a: 4, c: 12}}]
>>> from x1 in list join x2 in list2 on x1.a == x2.a where x1.a % 2 == 0 select { a: x1.a, b: x1.b, c: x2.c }
[{a: 4, b: 8, c: 12}]
</code></pre>
<p>Nested expressions are also possible:</p>
<pre><code>>>> ids = [1, 2, 3, 4]
[1, 2, 3, 4]
>>> list = from x in ids select { a: x, b: ids }
[{a: 1, b: [1, 2, 3, 4]}, {a: 2, b: [1, 2, 3, 4]}, {a: 3, b: [1, 2, 3, 4]}, {a: 4, b: [1, 2, 3, 4]}]
>>> from x in list where x.a % 2 == 0 select { a: x.a, b: from i in x.b where i % 2 == 0 }
[{a: 2, b: [2, 4]}, {a: 4, b: [2, 4]}]
</code></pre>
+
+
+ pgcentralfoundation/pgrx
+ 2023-10-11T01:39:15Z
+ tag:github.com,2023-10-11:/pgcentralfoundation/pgrx
+
+ <p>Build Postgres Extensions with Rust!</p><hr><p><img src="https://raw.githubusercontent.com/pgcentralfoundation/pgrx/develop/art/pgrx-logo-color-transparent-475x518.png" alt="Logo"></p>
<h1><code>pgrx</code></h1>
<blockquote>
<p>Build Postgres Extensions with Rust!</p>
</blockquote>
<p><img src="https://github.com/pgcentralfoundation/pgrx/workflows/cargo%20test%20--all/badge.svg?sanitize=true" alt="cargo test --all"> <a href="https://crates.io/crates/pgrx"><img src="https://img.shields.io/crates/v/pgrx.svg?sanitize=true" alt="crates.io badge"></a> <a href="https://docs.rs/pgrx"><img src="https://docs.rs/pgrx/badge.svg?sanitize=true" alt="docs.rs badge"></a> <a href="https://twitter.com/pgrx_rs"><img src="https://img.shields.io/twitter/follow/pgrx_rs.svg?style=flat" alt="Twitter Follow"></a> <a href="https://discord.gg/hPb93Y9"><img src="https://img.shields.io/discord/710918545906597938.svg?sanitize=true" alt="Discord Chat"></a></p>
<p><code>pgrx</code> is a framework for developing PostgreSQL extensions in Rust and strives to be as idiomatic and safe as possible.</p>
<p><code>pgrx</code> supports Postgres v11-v15.</p>
<p><strong>Feel free to join our <a href="https://discord.gg/PMrpdJsqcJ">Discord Server</a>.</strong></p>
<h2>Key Features</h2>
<ul>
<li><strong>A fully managed development environment with <a href="https://raw.githubusercontent.com/pgcentralfoundation/pgrx/develop/cargo-pgrx/README.md"><code>cargo-pgrx</code></a></strong>
<ul>
<li><code>cargo pgrx new</code>: Create new extensions quickly</li>
<li><code>cargo pgrx init</code>: Install new (or register existing) PostgreSQL installs</li>
<li><code>cargo pgrx run</code>: Run your extension and interactively test it in <code>psql</code> (or <code>pgcli</code>)</li>
<li><code>cargo pgrx test</code>: Unit-test your extension across multiple PostgreSQL versions</li>
<li><code>cargo pgrx package</code>: Create installation packages for your extension</li>
<li>More in the <a href="https://raw.githubusercontent.com/pgcentralfoundation/pgrx/develop/cargo-pgrx/README.md"><code>README.md</code></a>!</li>
</ul> </li>
<li><strong>Target Multiple Postgres Versions</strong>
<ul>
<li>Support Postgres v11-v15 from the same codebase</li>
<li>Use Rust feature gating to use version-specific APIs</li>
<li>Seamlessly test against all versions</li>
</ul> </li>
<li><strong>Automatic Schema Generation</strong>
<ul>
<li>Implement extensions entirely in Rust</li>
<li><a href="https://raw.githubusercontent.com/pgcentralfoundation/pgrx/develop/#mapping-of-postgres-types-to-rust">Automatic mapping for many Rust types into PostgreSQL</a></li>
<li>SQL schemas generated automatically (or manually via <code>cargo pgrx schema</code>)</li>
<li>Include custom SQL with <code>extension_sql!</code> & <code>extension_sql_file!</code></li>
</ul> </li>
<li><strong>Safety First</strong>
<ul>
<li>Translates Rust <code>panic!</code>s into Postgres <code>ERROR</code>s that abort the transaction, not the process</li>
<li>Memory Management follows Rust's drop semantics, even in the face of <code>panic!</code> and <code>elog(ERROR)</code></li>
<li><code>#[pg_guard]</code> procedural macro to ensure the above</li>
<li>Postgres <code>Datum</code>s are <code>Option<T> where T: FromDatum</code>
<ul>
<li><code>NULL</code> Datums are safely represented as <code>Option::<T>::None</code></li>
</ul> </li>
</ul> </li>
<li><strong>First-class UDF support</strong>
<ul>
<li>Annotate functions with <code>#[pg_extern]</code> to expose them to Postgres</li>
<li>Return <code>pgrx::iter::SetOfIterator<'a, T></code> for <code>RETURNS SETOF</code></li>
<li>Return <code>pgrx::iter::TableIterator<'a, T></code> for <code>RETURNS TABLE (...)</code></li>
<li>Create trigger functions with <code>#[pg_trigger]</code></li>
</ul> </li>
<li><strong>Easy Custom Types</strong>
<ul>
<li><code>#[derive(PostgresType)]</code> to use a Rust struct as a Postgres type
<ul>
<li>By default, represented as a CBOR-encoded object in-memory/on-disk, and JSON as human-readable</li>
<li>Provide custom in-memory/on-disk/human-readable representations</li>
</ul> </li>
<li><code>#[derive(PostgresEnum)]</code> to use a Rust enum as a Postgres enum</li>
<li>Composite types supported with the <code>pgrx::composite_type!("Sample")</code> macro</li>
</ul> </li>
<li><strong>Server Programming Interface (SPI)</strong>
<ul>
<li>Safe access into SPI</li>
<li>Transparently return owned Datums from an SPI context</li>
</ul> </li>
<li><strong>Advanced Features</strong>
<ul>
<li>Safe access to Postgres' <code>MemoryContext</code> system via <code>pgrx::PgMemoryContexts</code></li>
<li>Executor/planner/transaction/subtransaction hooks</li>
<li>Safely use Postgres-provided pointers with <code>pgrx::PgBox<T></code> (akin to <code>alloc::boxed::Box<T></code>)</li>
<li><code>#[pg_guard]</code> proc-macro for guarding <code>extern "C"</code> Rust functions that need to be passed into Postgres</li>
<li>Access Postgres' logging system through <code>eprintln!</code>-like macros</li>
<li>Direct <code>unsafe</code> access to large parts of Postgres internals via the <code>pgrx::pg_sys</code> module</li>
<li>New features added regularly!</li>
</ul> </li>
</ul>
<h2>System Requirements</h2>
<ul>
<li>A Rust toolchain: <code>rustc</code>, <code>cargo</code>, and <code>rustfmt</code>. The recommended way to get these is from <a href="https://rustup.rs">https://rustup.rs</a> †</li>
<li><code>git</code></li>
<li><code>libclang</code> 5.0 or greater (required by bindgen)
<ul>
<li>Ubuntu: <code>apt install libclang-dev</code> or <code>apt install clang</code></li>
<li>RHEL: <code>yum install clang</code></li>
</ul> </li>
<li><code>tar</code></li>
<li><code>bzip2</code></li>
<li>GCC 7 or newer</li>
<li><a href="https://wiki.postgresql.org/wiki/Compile_and_Install_from_source_code">PostgreSQL's build dependencies</a> ‡</li>
</ul>
<p>† PGRX has no MSRV policy, thus may require the latest stable version of Rust, available via Rustup</p>
<p>‡ A local PostgreSQL server installation is not required. <code>cargo pgrx</code> can download and compile PostgreSQL versions on its own.</p>
<details>
<summary>How to: GCC 7 on CentOS 7</summary>
<p>In order to use GCC 7, install <a href="https://wiki.centos.org/AdditionalResources/Repositories/SCL"><code>scl</code></a> and enter the GCC 7 development environment:</p>
<pre><code class="language-bash">yum install centos-release-scl
yum install devtoolset-7
scl enable devtoolset-7 bash
</code></pre>
</details>
<h2>Getting Started</h2>
<p>First install the <code>cargo-pgrx</code> sub-command and initialize the development environment:</p>
<pre><code class="language-bash">cargo install --locked cargo-pgrx
cargo pgrx init
</code></pre>
<p>The <code>init</code> command downloads currently supported PostgreSQL versions, compiles them to <code>~/.pgrx/</code>, and runs <code>initdb</code>. It's also possible to use an existing (user-writable) PostgreSQL install, or install a subset of versions, see the <a href="https://raw.githubusercontent.com/pgcentralfoundation/pgrx/develop/cargo-pgrx/README.md#first-time-initialization"><code>README.md</code> of <code>cargo-pgrx</code> for details</a>.</p>
<pre><code class="language-bash">cargo pgrx new my_extension
cd my_extension
</code></pre>
<p>This will create a new directory for the extension crate.</p>
<pre><code>$ tree
.
├── Cargo.toml
├── my_extension.control
├── sql
└── src
└── lib.rs
2 directories, 3 files
</code></pre>
<p>The new extension includes an example, so you can go ahead and run it right away.</p>
<pre><code class="language-bash">cargo pgrx run
</code></pre>
<p>This compiles the extension to a shared library, copies it to the specified Postgres installation, starts that Postgres instance and connects you to a database named the same as the extension.</p>
<p>Once <code>cargo-pgrx</code> drops us into <code>psql</code> we can <a href="https://www.postgresql.org/docs/13/sql-createextension.html">load the extension</a> and do a SELECT on the example function.</p>
<pre><code class="language-sql">my_extension=# CREATE EXTENSION my_extension;
CREATE EXTENSION
my_extension=# SELECT hello_my_extension();
hello_my_extension
---------------------
Hello, my_extension
(1 row)
</code></pre>
<p>For more details on how to manage pgrx extensions see <a href="https://raw.githubusercontent.com/pgcentralfoundation/pgrx/develop/cargo-pgrx/README.md">Managing pgrx extensions</a>.</p>
<h2>Upgrading</h2>
<p>You can upgrade your current <code>cargo-pgrx</code> installation by passing the <code>--force</code> flag to <code>cargo install</code>:</p>
<pre><code class="language-bash">cargo install --force --locked cargo-pgrx
</code></pre>
<p>As new Postgres versions are supported by <code>pgrx</code>, you can re-run the <code>pgrx init</code> process to download and compile them:</p>
<pre><code class="language-bash">cargo pgrx init
</code></pre>
<h3>Mapping of Postgres types to Rust</h3>
<table>
<thead>
<tr>
<th>Postgres Type</th>
<th>Rust Type (as <code>Option<T></code>)</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>bytea</code></td>
<td><code>Vec<u8></code> or <code>&[u8]</code> (zero-copy)</td>
</tr>
<tr>
<td><code>text</code></td>
<td><code>String</code> or <code>&str</code> (zero-copy)</td>
</tr>
<tr>
<td><code>varchar</code></td>
<td><code>String</code> or <code>&str</code> (zero-copy) or <code>char</code></td>
</tr>
<tr>
<td><code>"char"</code></td>
<td><code>i8</code></td>
</tr>
<tr>
<td><code>smallint</code></td>
<td><code>i16</code></td>
</tr>
<tr>
<td><code>integer</code></td>
<td><code>i32</code></td>
</tr>
<tr>
<td><code>bigint</code></td>
<td><code>i64</code></td>
</tr>
<tr>
<td><code>oid</code></td>
<td><code>u32</code></td>
</tr>
<tr>
<td><code>real</code></td>
<td><code>f32</code></td>
</tr>
<tr>
<td><code>double precision</code></td>
<td><code>f64</code></td>
</tr>
<tr>
<td><code>bool</code></td>
<td><code>bool</code></td>
</tr>
<tr>
<td><code>json</code></td>
<td><code>pgrx::Json(serde_json::Value)</code></td>
</tr>
<tr>
<td><code>jsonb</code></td>
<td><code>pgrx::JsonB(serde_json::Value)</code></td>
</tr>
<tr>
<td><code>date</code></td>
<td><code>pgrx::Date</code></td>
</tr>
<tr>
<td><code>time</code></td>
<td><code>pgrx::Time</code></td>
</tr>
<tr>
<td><code>timestamp</code></td>
<td><code>pgrx::Timestamp</code></td>
</tr>
<tr>
<td><code>time with time zone</code></td>
<td><code>pgrx::TimeWithTimeZone</code></td>
</tr>
<tr>
<td><code>timestamp with time zone</code></td>
<td><code>pgrx::TimestampWithTimeZone</code></td>
</tr>
<tr>
<td><code>anyarray</code></td>
<td><code>pgrx::AnyArray</code></td>
</tr>
<tr>
<td><code>anyelement</code></td>
<td><code>pgrx::AnyElement</code></td>
</tr>
<tr>
<td><code>box</code></td>
<td><code>pgrx::pg_sys::BOX</code></td>
</tr>
<tr>
<td><code>point</code></td>
<td><code>pgrx::pg_sys::Point</code></td>
</tr>
<tr>
<td><code>tid</code></td>
<td><code>pgrx::pg_sys::ItemPointerData</code></td>
</tr>
<tr>
<td><code>cstring</code></td>
<td><code>&core::ffi::CStr</code></td>
</tr>
<tr>
<td><code>inet</code></td>
<td><code>pgrx::Inet(String)</code> -- TODO: needs better support</td>
</tr>
<tr>
<td><code>numeric</code></td>
<td><code>pgrx::Numeric<P, S> or pgrx::AnyNumeric</code></td>
</tr>
<tr>
<td><code>void</code></td>
<td><code>()</code></td>
</tr>
<tr>
<td><code>ARRAY[]::<type></code></td>
<td><code>Vec<Option<T>></code> or <code>pgrx::Array<T></code> (zero-copy)</td>
</tr>
<tr>
<td><code>int4range</code></td>
<td><code>pgrx::Range<i32></code></td>
</tr>
<tr>
<td><code>int8range</code></td>
<td><code>pgrx::Range<i64></code></td>
</tr>
<tr>
<td><code>numrange</code></td>
<td><code>pgrx::Range<Numeric<P, S>></code> or <code>pgrx::Range<AnyRange></code></td>
</tr>
<tr>
<td><code>daterange</code></td>
<td><code>pgrx::Range<pgrx::Date></code></td>
</tr>
<tr>
<td><code>tsrange</code></td>
<td><code>pgrx::Range<pgrx::Timestamp></code></td>
</tr>
<tr>
<td><code>tstzrange</code></td>
<td><code>pgrx::Range<pgrx::TimestampWithTimeZone></code></td>
</tr>
<tr>
<td><code>NULL</code></td>
<td><code>Option::None</code></td>
</tr>
<tr>
<td><code>internal</code></td>
<td><code>pgrx::PgBox<T></code> where <code>T</code> is any Rust/Postgres struct</td>
</tr>
<tr>
<td><code>uuid</code></td>
<td><code>pgrx::Uuid([u8; 16])</code></td>
</tr>
</tbody>
</table>
<p>There are also <code>IntoDatum</code> and <code>FromDatum</code> traits for implementing additional type conversions, along with <code>#[derive(PostgresType)]</code> and <code>#[derive(PostgresEnum)]</code> for automatic conversion of custom types.</p>
<p>Note that <code>text</code> and <code>varchar</code> are converted to <code>&str</code> or <code>String</code>, so PGRX assumes any Postgres database you use it with has UTF-8-compatible encoding. Currently, PGRX will panic if it detects this is incorrect, to inform you, the programmer, that you were wrong. However, it is best to not rely on this behavior, as UTF-8 validation can be a performance hazard. This problem was previously assumed to simply not happen, and PGRX may decide to change the details of how it does UTF-8 validation checks in the future in order to mitigate performance hazards.</p>
<p>The default Postgres server encoding is <code>SQL_ASCII</code>, and it guarantees neither ASCII nor UTF-8 (as Postgres will then accept but ignore non-ASCII bytes). For best results, always use PGRX with UTF-8, and set database encodings explicitly upon database creation.</p>
<h2>Digging Deeper</h2>
<ul>
<li><a href="https://raw.githubusercontent.com/pgcentralfoundation/pgrx/develop/cargo-pgrx/">cargo-pgrx sub-command</a></li>
<li><a href="https://raw.githubusercontent.com/pgcentralfoundation/pgrx/develop/pgrx-examples/custom_types/">Custom Types</a></li>
<li><a href="https://raw.githubusercontent.com/pgcentralfoundation/pgrx/develop/pgrx-examples/operators/">Postgres Operator Functions and Operator Classes/Families</a></li>
<li><a href="https://raw.githubusercontent.com/pgcentralfoundation/pgrx/develop/pgrx-examples/shmem/">Shared Memory Support</a></li>
<li><a href="https://raw.githubusercontent.com/pgcentralfoundation/pgrx/develop/pgrx-examples/">various examples</a></li>
</ul>
<h2>Caveats & Known Issues</h2>
<p>There's probably more than are listed here, but a primary things of note are:</p>
<ul>
<li>Threading is not really supported. Postgres is strictly single-threaded. As such, if you do venture into using threads, those threads <strong>MUST NOT</strong> call <em>any</em> internal Postgres function, or otherwise use any Postgres-provided pointer. There's also a potential problem with Postgres' use of <code>sigprocmask</code>. This was being discussed on the -hackers list, even with a patch provided, but the conversation seems to have stalled (<a href="https://www.postgresql.org/message-id/flat/5EF20168.2040508%40anastigmatix.net#4533edb74194d30adfa04a6a2ce635ba">https://www.postgresql.org/message-id/flat/5EF20168.2040508%40anastigmatix.net#4533edb74194d30adfa04a6a2ce635ba</a>).</li>
<li>How to correctly interact with Postgres in an <code>async</code> context remains unexplored.</li>
<li><code>pgrx</code> wraps a lot of <code>unsafe</code> code, some of which has poorly-defined safety conditions. It may be easy to induce illogical and undesirable behaviors even from safe code with <code>pgrx</code>, and some of these wrappers may be fundamentally unsound. Please report any issues that may arise.</li>
<li>Not all of Postgres' internals are included or even wrapped. This isn't due to it not being possible, it's simply due to it being an incredibly large task. If you identify internal Postgres APIs you need, open an issue and we'll get them exposed, at least through the <code>pgrx::pg_sys</code> module.</li>
<li>Windows is not supported. It could be, but will require a bit of work with <code>cargo-pgrx</code> and figuring out how to compile <code>pgrx</code>'s "cshim" static library.</li>
<li>Sessions started before <code>ALTER EXTENSION my_extension UPDATE;</code> will continue to see the old version of <code>my_extension</code>. New sessions will see the updated version of the extension.</li>
<li><code>pgrx</code> is used by many "in production", but it is not "1.0.0" or above, despite that being recommended by SemVer for production-quality software. This is because there are many unresolved soundness and ergonomics questions that will likely require breaking changes to resolve, in some cases requiring cutting-edge Rust features to be able to expose sound interfaces. While a 1.0.0 release is intended at some point, it seems prudent to wait until it seems like a 2.0.0 release would not be needed the next week and the remaining questions can be deferred.</li>
</ul>
<h2>TODO</h2>
<p>There's a few things on our immediate TODO list</p>
<ul>
<li>Automatic extension schema upgrade scripts</li>
<li>Improved unit testing framework</li>
<li>Better/Safer API for Datum management</li>
<li>Improved generated bindings organization</li>
<li>Safely wrap more Postgres internal APIs</li>
<li>More examples -- especially around memory management and the various derive macros <code>#[derive(PostgresType/Enum)]</code></li>
</ul>
<h2>Feature Flags</h2>
<p>PGRX has optional feature flags for Rust code that do not involve configuring the version of Postgres used, but rather extend additional support for other kinds of Rust code. These are not included by default.</p>
<h3>"unsafe-postgres": Allow compilation for Postgres forks that have a different ABI</h3>
<p>As of Postgres v15, forks are allowed to specify they use a different ABI than canonical Postgres. Since pgrx makes countless assumptions about Postgres' internal ABI it is not possible for it to guarantee that a compiled pgrx extension will probably execute within such a Postgres fork. You, dear compiler runner, can make this guarantee for yourself by specifying the <code>unsafe-postgres</code> feature flag. Otherwise, a pgrx extension will fail to compile with an error similar to:</p>
<pre><code>error[E0080]: evaluation of constant value failed
--> pgrx/src/lib.rs:151:5
|
151 | / assert!(
152 | | same_slice(pg_sys::FMGR_ABI_EXTRA, b"xPostgreSQL\0"),
153 | | "Unsupported Postgres ABI. Perhaps you need `--features unsafe-postgres`?",
154 | | );
| |_____^ the evaluated program panicked at 'Unsupported Postgres ABI. Perhaps you need `--features unsafe-postgres`?', pgrx/src/lib.rs:151:5
|
</code></pre>
<h2>Contributing</h2>
<p>We are most definitely open to contributions of any kind. Bug Reports, Feature Requests, Documentation, and even <a href="https://github.com/sponsors/eeeebbbbrrrr">sponsorships</a>.</p>
<p>If you'd like to contribute code via a Pull Request, please make it against our <code>develop</code> branch. The <code>master</code> branch is no longer used.</p>
<p>Providing wrappers for Postgres' internals is not a straightforward task, and completely wrapping it is going to take quite a bit of time. <code>pgrx</code> is generally ready for use now, and it will continue to be developed as time goes on. Your feedback about what you'd like to be able to do with <code>pgrx</code> is greatly appreciated.</p>
<h2>Hacking</h2>
<p>If you're hacking on <code>pgrx</code> and want to ensure your test will run correctly, you need to have the current implementation of <code>cargo-pgrx</code> (from the revision you're working on) in your <code>PATH</code>.</p>
<p>An easy way would be to install <a href="https://github.com/MaulingMonkey/cargo-local-install">cargo-local-install</a>:</p>
<pre><code class="language-shell">cargo install cargo-local-install
</code></pre>
<p>and then run <code>cargo local-install</code> to install <code>cargo-pgrx</code> as specified in top-level's Cargo.toml.</p>
<p>Don't forget to prepend <code>/path/to/pgrx/bin</code> to your <code>PATH</code>!</p>
<p>This approach can also be used in extensions to ensure a matching version of <code>cargo-pgrx</code> is used.</p>
<h2>License</h2>
<pre><code>Portions Copyright 2019-2021 ZomboDB, LLC.
Portions Copyright 2021-2023 Technology Concepts & Design, Inc.
Portions Copyright 2023 PgCentral Foundation, Inc.
All rights reserved.
Use of this source code is governed by the MIT license that can be found in the LICENSE file.
</code></pre>
\ No newline at end of file
diff --git a/sage/daily/index.xml b/sage/daily/index.xml
index 7e669253f6d..32618a0ea56 100644
--- a/sage/daily/index.xml
+++ b/sage/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Sage Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:32Z
+ 2023-10-11T01:39:24Z
Daily Trending of Sage in GitHub
\ No newline at end of file
diff --git a/saltstack/daily/index.xml b/saltstack/daily/index.xml
index 912f9cea864..451631d0bdb 100644
--- a/saltstack/daily/index.xml
+++ b/saltstack/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SaltStack Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:31Z
+ 2023-10-11T01:39:26Z
Daily Trending of SaltStack in GitHub
\ No newline at end of file
diff --git a/sas/daily/index.xml b/sas/daily/index.xml
index 1a2fa08a7f1..d10ce48af2f 100644
--- a/sas/daily/index.xml
+++ b/sas/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SAS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:30Z
+ 2023-10-11T01:39:25Z
Daily Trending of SAS in GitHub
\ No newline at end of file
diff --git a/sass/daily/index.xml b/sass/daily/index.xml
index 7a99233bc4b..1a785726bb7 100644
--- a/sass/daily/index.xml
+++ b/sass/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Sass Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:33Z
+ 2023-10-11T01:39:27Z
Daily Trending of Sass in GitHub
\ No newline at end of file
diff --git a/scala/daily/index.xml b/scala/daily/index.xml
index 750fcef77b3..a0301c29c53 100644
--- a/scala/daily/index.xml
+++ b/scala/daily/index.xml
@@ -1,21 +1,14 @@
GitHub Scala Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:39Z
+ 2023-10-11T01:39:33Z
Daily Trending of Scala in GitHub
- ucb-bar/shuttle
- 2023-10-10T01:39:39Z
- tag:github.com,2023-10-10:/ucb-bar/shuttle
-
- <p>A Rocket-based RISC-V superscalar in-order core</p><hr><h1>Shuttle: A Rocket-based Superscalar In-order RISC-V Core</h1>
<p>Shuttle is a Rocket-based superscalar in-order RISC-V core, supporting the base RV64IMAFDC instruction set with supervisor and user-mode. Shuttle is a 6-stage core that can be configured to be dual, three, or quad-issue, although dual-issue is the most sensible design point. Shuttle is <em>not</em> designed to meet any power, performance, or area targets. It exists purely as a demonstrative example of another RISC-V CPU design point.</p>
<p>The superscalar microarchitecture presents the most advantages for 1) floating-point kernels and 2) RoCC accelerator kernels, as scalar control code can execute concurrently with floating point or RoCC instructions, maintaining high utilization of those units.</p>
<p>Shuttle is tape-out proven, and has similar physical design complexity as Rocket.</p>
-
-
- ucb-bar/bar-fetchers
- 2023-10-10T01:39:39Z
- tag:github.com,2023-10-10:/ucb-bar/bar-fetchers
-
- <p>Berkeley Architecture Research pre-Fetchers</p><hr><h1>Berkeley Architecture Research preFetchers</h1>
<p>This is a collection of Chisel-implemented prefetchers, designed for compatibility with Chipyard and Rocketchip SoCs. This package implements a generic prefetcher API, and example implementations of NextLine, Strided, and AMPM prefetchers.</p>
<p>Prefetchers can be instantiated in front of a L1D HellaCache, or as TileLink nodes in front of some TileLink bus.</p>
+ jcdelmas/regular-crossword-resolver
+ 2023-10-11T01:39:33Z
+ tag:github.com,2023-10-11:/jcdelmas/regular-crossword-resolver
+
+ <p></p><hr><h1>Regular crossword resolver</h1>
<p>Resolver for the following regular crossword: <a href="http://www.mit.edu/~puzzle/2013/coinheist.com/rubik/a_regular_crossword/grid.pdf">http://www.mit.edu/~puzzle/2013/coinheist.com/rubik/a_regular_crossword/grid.pdf</a></p>
<h2>Install</h2>
<pre><code>git clone git@github.com:jcdelmas/regular-crossword-resolver.git
</code></pre>
<h2>Run</h2>
<pre><code>sbt run
</code></pre>
\ No newline at end of file
diff --git a/scaml/daily/index.xml b/scaml/daily/index.xml
index aee281c7181..cf2ee49ed18 100644
--- a/scaml/daily/index.xml
+++ b/scaml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Scaml Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:39Z
+ 2023-10-11T01:39:29Z
Daily Trending of Scaml in GitHub
\ No newline at end of file
diff --git a/scheme/daily/index.xml b/scheme/daily/index.xml
index eaa8ce09112..b9d3451f075 100644
--- a/scheme/daily/index.xml
+++ b/scheme/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Scheme Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:35Z
+ 2023-10-11T01:39:28Z
Daily Trending of Scheme in GitHub
+
+ H4K3R13/The-Hello-World-Project
+ 2023-10-11T01:39:28Z
+ tag:github.com,2023-10-11:/H4K3R13/The-Hello-World-Project
+
+ <p>This repository hosts programs that output 'Hello World' in various programming languages. 🌍✨</p><hr>
+
\ No newline at end of file
diff --git a/scilab/daily/index.xml b/scilab/daily/index.xml
index f2163b573c8..6a12429750f 100644
--- a/scilab/daily/index.xml
+++ b/scilab/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Scilab Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:48Z
+ 2023-10-11T01:39:45Z
Daily Trending of Scilab in GitHub
\ No newline at end of file
diff --git a/scss/daily/index.xml b/scss/daily/index.xml
index 1380545dd5a..026c176f8fe 100644
--- a/scss/daily/index.xml
+++ b/scss/daily/index.xml
@@ -1,14 +1,21 @@
GitHub SCSS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:53Z
+ 2023-10-11T01:39:48Z
Daily Trending of SCSS in GitHub
- prayag17/JellySkin
- 2023-10-10T01:39:53Z
- tag:github.com,2023-10-10:/prayag17/JellySkin
-
- <p>Vibrante/minimal Jellyfin CSS using custom Icons and more!!, created for Jellyfin web 🎞️, can be used by just one line.</p><hr>
+ amuthanarulraj/scss-samples
+ 2023-10-11T01:39:48Z
+ tag:github.com,2023-10-11:/amuthanarulraj/scss-samples
+
+ <p></p><hr>
+
+
+ Lego6245/hundoLeaderboard
+ 2023-10-11T01:39:48Z
+ tag:github.com,2023-10-11:/Lego6245/hundoLeaderboard
+
+ <p>A Leaderboard for the recipes at home project</p><hr>
\ No newline at end of file
diff --git a/sed/daily/index.xml b/sed/daily/index.xml
index fdcee4407f2..87be19ca755 100644
--- a/sed/daily/index.xml
+++ b/sed/daily/index.xml
@@ -1,7 +1,7 @@
GitHub sed Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:50Z
+ 2023-10-11T01:39:44Z
Daily Trending of sed in GitHub
\ No newline at end of file
diff --git a/self/daily/index.xml b/self/daily/index.xml
index 40082ebc48c..af3cb7ff292 100644
--- a/self/daily/index.xml
+++ b/self/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Self Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:49Z
+ 2023-10-11T01:39:44Z
Daily Trending of Self in GitHub
\ No newline at end of file
diff --git a/selinux-policy/daily/index.xml b/selinux-policy/daily/index.xml
index 3cf61fe98f6..adc2a9940c3 100644
--- a/selinux-policy/daily/index.xml
+++ b/selinux-policy/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SELinux Policy Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:56Z
+ 2023-10-11T01:39:51Z
Daily Trending of SELinux Policy in GitHub
\ No newline at end of file
diff --git a/shaderlab/daily/index.xml b/shaderlab/daily/index.xml
index 1f3387c3367..86eb9eee242 100644
--- a/shaderlab/daily/index.xml
+++ b/shaderlab/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ShaderLab Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:55Z
+ 2023-10-11T01:39:49Z
Daily Trending of ShaderLab in GitHub
\ No newline at end of file
diff --git a/shell/daily/index.xml b/shell/daily/index.xml
index 6cc66af0455..3fc49b110c8 100644
--- a/shell/daily/index.xml
+++ b/shell/daily/index.xml
@@ -1,28 +1,21 @@
GitHub Shell Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:59Z
+ 2023-10-11T01:39:54Z
Daily Trending of Shell in GitHub
- ChrisTitusTech/ArchTitus
- 2023-10-10T01:39:59Z
- tag:github.com,2023-10-10:/ChrisTitusTech/ArchTitus
-
- <p>Automated Arch Linux Install</p><hr><h1>Resurrecting Project</h1>
<p>I'm changing the scope of the project to only do minimal installs and no longer offer the options for the install script. As the official arch install script has become better this one is no longer needed. However, I still want a script that installs my two flavors of arch.</p>
<ul>
<li>DWM + Xorg</li>
<li>Hyprland + Wayland</li>
</ul>
<p>This is currently a work in progress and check the branchs for the old versions.</p>
<p>New single command quicklaunch</p>
<pre><code>bash <(curl -L christitus.com/archtitus)
</code></pre>
<p>Old Script with all the customizations is located in the (all-in-one-2022 branch) here: <a href="https://github.com/ChrisTitusTech/ArchTitus/tree/all-in-one-2022-script">https://github.com/ChrisTitusTech/ArchTitus/tree/all-in-one-2022-script</a></p>
<h1>ArchTitus Installer Script</h1>
<p><a href="https://github.com/marketplace/actions/super-linter"><img src="https://github.com/ChrisTitusTech/ArchTitus/workflows/Lint%20Code%20Base/badge.svg?sanitize=true" alt="GitHub Super-Linter"></a></p>
<img src="https://i.imgur.com/YiNMnan.png">
<p>This README contains the steps I do to install and configure a fully-functional Arch Linux installation containing a desktop environment, all the support packages (network, bluetooth, audio, printers, etc.), along with all my preferred applications and utilities. The shell scripts in this repo allow the entire process to be automated.)</p>
<hr>
<h2>Create Arch ISO or Use Image</h2>
<p>Download ArchISO from <a href="https://archlinux.org/download/">https://archlinux.org/download/</a> and put on a USB drive with <a href="https://www.balena.io/etcher/">Etcher</a>, <a href="https://www.ventoy.net/en/index.html">Ventoy</a>, or <a href="https://rufus.ie/en/">Rufus</a></p>
<p>If you don't want to build using this script I did create an image @ <a href="https://cttstore.com/arch-titus">https://cttstore.com/arch-titus</a></p>
<h2>Boot Arch ISO</h2>
<p>From initial Prompt type the following commands:</p>
<pre><code>pacman -Sy git
git clone https://github.com/ChrisTitusTech/ArchTitus
cd ArchTitus
./archtitus.sh
</code></pre>
<h3>System Description</h3>
<p>This is completely automated arch install. It includes prompts to select your desired desktop environment, window manager, AUR helper, and whether to do a full or minimal install. The KDE desktop environment on arch includes all the packages I use on a daily basis, as well as some customizations.</p>
<h2>Troubleshooting</h2>
<p><strong><a href="https://github.com/rickellis/Arch-Linux-Install-Guide">Arch Linux RickEllis Installation Guide</a></strong></p>
<p><strong><a href="https://wiki.archlinux.org/title/Installation_guide">Arch Linux Wiki Installation Guide</a></strong></p>
<p>The main script will generate .log files for every script that is run as part of the installation process. These log files contain the terminal output so you can review any warnings or errors that occurred during installation and aid in troubleshooting.</p>
<h3>No Wifi</h3>
<p>You can check if the WiFi is blocked by running <code>rfkill list</code>. If it says <strong>Soft blocked: yes</strong>, then run <code>rfkill unblock wifi</code></p>
<p>After unblocking the WiFi, you can connect to it. Go through these 5 steps:</p>
<p>#1: Run <code>iwctl</code></p>
<p>#2: Run <code>device list</code>, and find your device name.</p>
<p>#3: Run <code>station [device name] scan</code></p>
<p>#4: Run <code>station [device name] get-networks</code></p>
<p>#5: Find your network, and run <code>station [device name] connect [network name]</code>, enter your password and run <code>exit</code>. You can test if you have internet connection by running <code>ping google.com</code>, and then Press Ctrl and C to stop the ping test.</p>
<h2>Reporting Issues</h2>
<p>An issue is easier to resolve if it contains a few important pieces of information.</p>
<ol>
<li>Chosen configuration from /configs/setup.conf (DONT INCLUDE PASSWORDS)</li>
<li>Errors seen in .log files</li>
<li>What commit/branch you used</li>
<li>Where you were installing (VMWare, Virtualbox, Virt-Manager, Baremetal, etc)
<ol>
<li>If a VM, what was the configuration used.</li>
</ol> </li>
</ol>
<h2>Credits</h2>
<ul>
<li>Original packages script was a post install cleanup script called ArchMatic located here: <a href="https://github.com/rickellis/ArchMatic">https://github.com/rickellis/ArchMatic</a></li>
<li>Thank you to all the folks that helped during the creation from YouTube Chat! Here are all those Livestreams showing the creation: <a href="https://www.youtube.com/watch?v=IkMCtkDIhe8&list=PLc7fktTRMBowNaBTsDHlL6X3P3ViX3tYg">https://www.youtube.com/watch?v=IkMCtkDIhe8&list=PLc7fktTRMBowNaBTsDHlL6X3P3ViX3tYg</a></li>
</ul>
+ TrionesType/zhuque
+ 2023-10-11T01:39:54Z
+ tag:github.com,2023-10-11:/TrionesType/zhuque
+
+ <p>朱雀仿宋/朱雀宋朝/Zhuque Fangsong: An open-source Fansong typeface project</p><hr><h1>朱雀仿宋</h1>
<p><a href="https://raw.githubusercontent.com/TrionesType/zhuque/main/docs/README-en.md">English</a> | <a href="https://raw.githubusercontent.com/TrionesType/zhuque/main/docs/README-zh-Hant.md">繁體中文</a> | <a href="https://raw.githubusercontent.com/TrionesType/zhuque/main/docs/README-ja.md">日本語</a></p>
<p><img src="https://raw.githubusercontent.com/TrionesType/zhuque/main/docs/preview.png" alt=""></p>
<p>「朱雀仿宋」是<a href="http://trionestype.com/">璇玑造字</a>的开源仿宋字体计划,志在最终提供高质量的、支持多语言的正文仿宋解决方案。</p>
<p>仿宋作为「宋黑仿楷」中文四大基础字体之一,长期缺乏开源许可证下的选择。我们希望「朱雀仿宋」可以弥补这一空缺,为开源软件与 TeX 社区贡献一份力。</p>
<p>上世纪初,仿宋活字一度品类繁盛,开发、应用风行一时。然而时过境迁,市面上的仿宋最终收敛于「华丰真宋」一系,这也是今天大多数人所熟悉的仿宋样貌。「朱雀仿宋」则以民国仿宋活字「南宋」为蓝本,在满足现代排印需求的前提下,尝试为正文仿宋字库带来一缕新鲜空气。</p>
<p>当前我们发布的「朱雀仿宋」仍为「预览测试版」,尚处于项目早期阶段;无论是设计风格、字数,还是字形、排版质量,都不代表正式版情况。因此,</p>
<h2>「朱雀」的未来,由你定义</h2>
<p>如果您有任何问题、意见建议、合作意向,我们也欢迎您加入「朱雀仿宋反馈」微信群;或移步 <a href="https://github.com/TrionesType/zhuque/issues">Issues</a> 提出。</p>
<p align="center"> <img src="https://raw.githubusercontent.com/TrionesType/zhuque/main/docs/wechat_qr.png" width="150px"> </p>
<p>璇玑正在尝试一种全新中文字库设计模式。得益于我们开发的最新技术,璇玑的设计师可以直接将人工智能作为设计工具去使用,我们也因此能以迭代的方式开发「朱雀」。</p>
<p>即便有技术加持,我们宏伟的目标也让「朱雀」项目有着难以想象的工作量。为了让项目推进更快、更可持续,我们也希望能获得更多的支持。</p>
<h2>下载</h2>
<p>版本与下载链接将会更新在 <a href="https://github.com/TrionesType/zhuque/releases">Releases 发布页</a>。</p>
<h2>设计故事</h2>
<p>开发一套开源仿宋字库的想法最早始于 2021 年初,是继<a href="https://github.com/welai/glow-sans">「未来荧黑」</a>项目之后,我们认为更有意义、也更具难度的挑战。随着设计研究的深入与技术进步,特别是去年以来 AIGC 技术的爆发,实现这一想法在今日遂成可能。</p>
<p>「朱雀仿宋」改刻自民国活字「南宋」,试图为这套沉睡数十年的字体赋予新生。「南宋」于 1932 年由「百宋铸字印刷局」推出,韩佑之设计原稿,邹根培雕刻字模。一经面世,即广泛用于书籍、期刊排印。「南宋」与大多数正文字体的设定不同,重心略靠右下;结构中宫收紧、撇捺舒展,笔画的粗细变化强烈;含蓄秀美而充满力量感,在排印标题和正文时展现出浓厚的「书卷气」。</p>
<p>在「南宋」活字的基础上,「朱雀仿宋」稍稍削弱了笔画的对比度,适当地规整了字形结构与版面效果,同时最大程度地保留了「南宋」的独特气质与活字趣味。</p>
<p>「朱雀」是中国传统文化中「四象」之一,南方七宿之神。「朱雀」之名,与「南宋」渊源以及「璇玑造字」的品牌名相合。</p>
<h3>参考文献</h3>
<ul>
<li>孙明远:《中国近现代平面设计和文字设计发展历程研究——从一八〇五年至一九四九年》,厦门大学出版社,2021 年第 1 版,第 168~172 页</li>
<li>周博:《中国现代文字设计图史》,北京大学出版社,2018 年第 1 版,第 122~124 页</li>
</ul>
<h2>许可证</h2>
<p>© 2023 <a href="https://jadefoci.com/">智琮科技</a>,以 <a href="http://scripts.sil.org/OFL">SIL Open Font License 1.1</a> 发布。</p>
<p>您<strong>可以</strong>:</p>
<ul>
<li><strong>免费商用本字体</strong>,无论是用于印刷、LOGO、软件、网页还是视频。</li>
<li>复制与再分发本字体。</li>
</ul>
<p>您<strong>不可以</strong>:</p>
<ul>
<li>单独销售字体的原始版本或是修改版本。</li>
</ul>
<p>授权方式以 <a href="http://scripts.sil.org/OFL">SIL Open Font License 1.1 的英文原文</a>为准。</p>
<p>我们恳请您<strong>暂时不要</strong>在「朱雀仿宋」正式版发布之前大量传播非「朱雀」团队所修改的本字体。如果您有改进「朱雀仿宋」意愿,我们非常欢迎您提出宝贵的意见建议——包括与我们讨论如何参与到朱雀的设计工作。</p>
<p>朱雀的西文与符号暂采用 <a href="https://github.com/huertatipografica/Alegreya">Alegreya</a> 的一个外插值实例。Alegreya 由 Huerta Tipográfica 的 Juan Pablo del Peral 创作,同样以 SIL Open Font License 1.1 发布。</p>
<h2>「朱雀」团队</h2>
<p><strong>主创:</strong><a href="https://github.com/Lottin0113">余俊益</a></p>
<p><strong>假名与符号(制作中):</strong><a href="https://github.com/yeongsy">韩泳思</a></p>
<p><strong>技术:</strong><a href="https://github.com/celestialphineas">殷叶航</a>、<a href="https://github.com/Lottin0113">余俊益</a></p>
<h2>关于璇玑造字</h2>
<p><a href="http://trionestype.com/">「璇玑造字」</a>是<a href="https://jadefoci.com/">智琮科技</a>的字库品牌。我们以传统文化为立足基本,从自然风物汲取设计灵感,藉前沿科技更新文字风景。无论技术如何变迁,我们将始终把「人」置于第一位,关心设计者的创意与读者的体验。</p>
<p>欢迎你来和璇玑造字一起塑造属于未来的文字!</p>
<h2>致谢</h2>
<ul>
<li>特别鸣谢:特里王,在「南宋」活字收集、整理、研究上的贡献。</li>
<li><a href="https://github.com/Siphercase">Siphercase</a> 补充了部分国际音标字形。</li>
<li><a href="https://github.com/lxgw">落霞孤鹜</a>的<a href="https://github.com/lxgw/LxgwWenKai">「霞鹜文楷」</a>、<a href="https://github.com/fontworks-fonts/Klee">Fontworks Klee One</a>、<a href="https://github.com/adobe-fonts/source-han-serif">思源宋体</a>,这些开源字体是本项目人与机在设计过程中的写法参考。</li>
</ul>
- r1vs3c/auto-bspwm
- 2023-10-10T01:39:59Z
- tag:github.com,2023-10-10:/r1vs3c/auto-bspwm
-
- <p>Bash script that automates the setup of a professional hacking environment for Kali Linux using the tiled window manager bspwm.</p><hr><h1>auto-bspwm</h1>
<blockquote>
<p>This is a Bash script that automates the setup of a professional hacking environment for Kali Linux using the tiled window manager <a href="https://github.com/baskerville/bspwm">bspwm</a>.</p>
</blockquote>
<h2>Installation</h2>
<ol>
<li>Install available updates.</li>
</ol>
<pre><code class="language-shell">sudo apt update
sudo apt upgrade -y
</code></pre>
<ol start="2">
<li>Clone the repository and navigate to it.</li>
</ol>
<pre><code class="language-shell">git clone https://github.com/r1vs3c/auto-bspwm.git
cd auto-bspwm
</code></pre>
<ol start="3">
<li>Grant execution permissions to the script.</li>
</ol>
<pre><code class="language-shell">chmod +x setup.sh
</code></pre>
<ol start="4">
<li>Execute the script.</li>
</ol>
<pre><code class="language-shell">./setup.sh
</code></pre>
<ol start="5">
<li>After the script has finished, you will be prompted to restart the system. Once you have rebooted, select <code>bspwm</code> as the window manager and then log in.</li>
</ol>
<h2>Overview of the environment</h2>
<p><img src="https://raw.githubusercontent.com/r1vs3c/auto-bspwm/main/assets/overview1.png" alt="overview1" title="overview1"></p>
<p><img src="https://raw.githubusercontent.com/r1vs3c/auto-bspwm/main/assets/overview2.png" alt="overview2" title="overview2"></p>
<p><img src="https://raw.githubusercontent.com/r1vs3c/auto-bspwm/main/assets/overview3.png" alt="overview3" title="overview3"></p>
<h2>Keyboard shortcuts</h2>
<ul>
<li><kbd>Windows</kbd> + <kbd>Enter</kbd>: Open a terminal emulator window (kitty).</li>
<li><kbd>Windows</kbd> + <kbd>W</kbd>: Close the current window.</li>
<li><kbd>Windows</kbd> + <kbd>Alt</kbd> + <kbd>R</kbd>: Restart the bspwm configuration.</li>
<li><kbd>Windows</kbd> + <kbd>Alt</kbd> + <kbd>Q</kbd>: Log out.</li>
<li><kbd>Windows</kbd> + <kbd>(⬆⬅⬇➡)</kbd>: Navigate through windows in the current workspace.</li>
<li><kbd>Windows</kbd> + <kbd>D</kbd>: Open Rofi. Press <kbd>Esc</kbd> to exit.</li>
<li><kbd>Windows</kbd> + <kbd>(1,2,3,4,5,6,7,8,9,0)</kbd>: Switch to the respective workspace.</li>
<li><kbd>Windows</kbd> + <kbd>T</kbd>: Change the current window to tile mode.</li>
<li><kbd>Windows</kbd> + <kbd>M</kbd>: Toggle the current window to "full" mode (doesn't occupy the polybar). Press the same keys to return to tile mode.</li>
<li><kbd>Windows</kbd> + <kbd>F</kbd>: Change the current window to fullscreen mode (occupies the entire screen, including the polybar).</li>
<li><kbd>Windows</kbd> + <kbd>S</kbd>: Change the current window to floating mode.</li>
<li><kbd>Windows</kbd> + <kbd>Shift</kbd> + <kbd>(1,2,3,4,5,6,7,8,9,0)</kbd>: Move the current window to another workspace.</li>
<li><kbd>Windows</kbd> + <kbd>Alt</kbd> + <kbd>(⬆⬅⬇➡)</kbd>: Resize the current window (only works if it's in floating mode).</li>
<li><kbd>Windows</kbd> + <kbd>Ctrl</kbd> + <kbd>(⬆⬅⬆➡)</kbd>: Change the position of the current window (only works in floating mode).</li>
<li><kbd>Windows</kbd> + <kbd>Shift</kbd> + <kbd>F</kbd>: Open Firefox.</li>
<li><kbd>Windows</kbd> + <kbd>Shift</kbd> + <kbd>B</kbd>: Open Burpsuite.</li>
<li><kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>L</kbd>: Lock the screen.</li>
<li><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>⬆⬇</kbd>: Increase/decrease volume.</li>
<li><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>M</kbd>: Mute/unmute volume.</li>
<li><kbd>Windows</kbd> + <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>(⬆⬅⬇➡)</kbd>: Show a preselection and then open a window (kitty, Firefox, File manager, etc.).
<ul>
<li><kbd>Windows</kbd> + <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Space</kbd>: Undo the preselection.</li>
</ul> </li>
<li><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Enter</kbd>: Open a sub-window in the current window.</li>
<li><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>T</kbd>: Open a tab in the current window.</li>
<li><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Z</kbd>: Zoom in on the current sub-window.</li>
<li><kbd>Ctrl</kbd> + <kbd>(⬆⬅⬇➡)</kbd>: Navigate through sub-windows in the current window.</li>
<li><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>W</kbd>: Close the current sub-window or tab.</li>
<li><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>R</kbd>: Resize the current sub-window. Afterward, use:
<ul>
<li><kbd>W</kbd> for 'Wider'</li>
<li><kbd>N</kbd> for 'Narrower'</li>
<li><kbd>T</kbd> for 'Taller'</li>
<li><kbd>S</kbd> for 'Shorter'</li>
<li><kbd>R</kbd> for 'Reset'</li>
<li><kbd>Esc</kbd> to quit resize mode.</li>
</ul> </li>
<li><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>L</kbd>: Toggle the arrangement of sub-windows.</li>
<li><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>C</kbd>: Copy to the clipboard.</li>
<li><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>V</kbd>: Paste from the clipboard.</li>
<li><kbd>F1</kbd>: Copy to buffer A.</li>
<li><kbd>F2</kbd>: Paste from buffer A.</li>
<li><kbd>F3</kbd>: Copy to buffer B.</li>
<li><kbd>F4</kbd>: Paste from buffer B.</li>
</ul>
<h2>Software</h2>
<p>This configuration uses the following software:</p>
<ul>
<li><strong>WM</strong>: <a href="https://github.com/baskerville/bspwm">bspwm</a></li>
<li><strong>Hotkey</strong>: <a href="https://github.com/baskerville/sxhkd">sxhkd</a></li>
<li><strong>Locker</strong>: <a href="https://github.com/meskarune/i3lock-fancy">i3lock-fancy</a></li>
<li><strong>Shell</strong>: <a href="https://www.zsh.org/">zsh</a></li>
<li><strong>Bars</strong>: <a href="https://github.com/polybar/polybar">polybar</a></li>
<li><strong>Compositor</strong>: <a href="https://github.com/yshui/picom">picom</a></li>
<li><strong>File Manager</strong>: <a href="https://docs.xfce.org/xfce/thunar/start">thunar</a></li>
<li><strong>Fonts</strong>: <a href="https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/Iosevka">iosevka</a> and <a href="https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/Hack">hack</a></li>
<li><strong>Application Launcher</strong>: <a href="https://github.com/davatorium/rofi">rofi</a></li>
<li><strong>Browsers</strong>: <a href="https://www.mozilla.org/en-US/firefox/new/">firefox</a></li>
<li><strong>Terminals</strong>: <a href="https://sw.kovidgoyal.net/kitty/">kitty</a> and <a href="https://github.com/lxqt/qterminal">qterminal</a></li>
<li><strong>Static Wallpaper</strong>: <a href="https://github.com/derf/feh">feh</a></li>
<li><strong>Color Scheme</strong>: <a href="https://github.com/dylanaraps/pywal">pywal</a></li>
<li><strong>Screenshot</strong>: <a href="https://flameshot.org/">flameshot</a></li>
</ul>
<h2>Credits</h2>
<p>This environment has been inspired by the functionalities of <a href="https://github.com/s4vitar">S4vitar's</a> environment.</p>
-
-
- oneinstack/oneinstack
- 2023-10-10T01:39:59Z
- tag:github.com,2023-10-10:/oneinstack/oneinstack
-
- <p>OneinStack - A PHP/JAVA Deployment Tool</p><hr><p>This script is written using the shell, in order to quickly deploy <code>LEMP</code>/<code>LAMP</code>/<code>LNMP</code>/<code>LNMPA</code>/<code>LTMP</code>(Linux, Nginx/Tengine/OpenResty, MySQL in a production environment/MariaDB/Percona, PHP, JAVA), applicable to RHEL 7, 8, 9(including CentOS,RedHat,AlmaLinux,Rocky), Debian 9, 10, 11, 12, Ubuntu 16, 18, 20, 22 and Fedora 27+ of 64.</p>
<p>Script properties:</p>
<ul>
<li>Continually updated, Provide Shell Interaction and Autoinstall</li>
<li>Source compiler installation, most stable source is the latest version, and download from the official site</li>
<li>Some security optimization</li>
<li>Providing a plurality of database versions (MySQL-8.0, MySQL-5.7, MySQL-5.6, MySQL-5.5, MariaDB-10.11, MariaDB-10.5, MariaDB-10.4, MariaDB-5.5, Percona-8.0, Percona-5.7, Percona-5.6, Percona-5.5, PostgreSQL, MongoDB)</li>
<li>Providing multiple PHP versions (PHP-8.2, PHP-8.1, PHP-8.0, PHP-7.4, PHP-7.3, PHP-7.2, PHP-7.1, PHP-7.0, PHP-5.6, PHP-5.5, PHP-5.4, PHP-5.3)</li>
<li>Provide Nginx, Tengine, OpenResty, Apache and ngx_lua_waf</li>
<li>Providing a plurality of Tomcat version (Tomcat-10, Tomcat-9, Tomcat-8, Tomcat-7)</li>
<li>Providing a plurality of JDK version (OpenJDK-8, OpenJDK-11, OpenJDK-17)</li>
<li>According to their needs to install PHP Cache Accelerator provides ZendOPcache, xcache, apcu, eAccelerator. And php extensions,include ZendGuardLoader,ionCube,SourceGuardian,imagick,gmagick,fileinfo,imap,ldap,calendar,phalcon,yaf,yar,redis,memcached,memcache,mongodb,swoole,xdebug</li>
<li>Installation Nodejs, Pureftpd, phpMyAdmin according to their needs</li>
<li>Install memcached, redis according to their needs</li>
<li>Jemalloc optimize MySQL, Nginx</li>
<li>Providing add a virtual host script, include Let's Encrypt SSL certificate</li>
<li>Provide Nginx/Tengine/OpenResty/Apache/Tomcat, MySQL/MariaDB/Percona, PHP, Redis, Memcached, phpMyAdmin upgrade script</li>
<li>Provide local,remote(rsync between servers),Aliyun OSS,Qcloud COS,UPYUN,QINIU,Amazon S3,Google Drive and Dropbox backup script</li>
</ul>
<h2>Installation</h2>
<p>Install the dependencies for your distro, download the source and run the installation script.</p>
<h4>CentOS/Redhat</h4>
<pre><code class="language-bash">yum -y install wget screen
</code></pre>
<h4>Debian/Ubuntu</h4>
<pre><code class="language-bash">apt-get -y install wget screen
</code></pre>
<h4>Download Source and Install</h4>
<pre><code class="language-bash">wget http://mirrors.oneinstack.com/oneinstack-full.tar.gz
tar xzf oneinstack-full.tar.gz
cd oneinstack
</code></pre>
<p>If you disconnect during installation, you can execute the command <code>screen -r oneinstack</code> to reconnect to the install window</p>
<pre><code class="language-bash">screen -S oneinstack
</code></pre>
<p>If you need to modify the directory (installation, data storage, Nginx logs), modify <code>options.conf</code> file before running install.sh</p>
<pre><code class="language-bash">./install.sh
</code></pre>
<h2>How to install another PHP version</h2>
<pre><code class="language-bash">~/oneinstack/install.sh --mphp_ver 54
</code></pre>
<h2>How to add Extensions</h2>
<pre><code class="language-bash">~/oneinstack/addons.sh
</code></pre>
<h2>How to add a virtual host</h2>
<pre><code class="language-bash">~/oneinstack/vhost.sh
</code></pre>
<h2>How to delete a virtual host</h2>
<pre><code class="language-bash">~/oneinstack/vhost.sh --del
</code></pre>
<h2>How to add FTP virtual user</h2>
<pre><code class="language-bash">~/oneinstack/pureftpd_vhost.sh
</code></pre>
<h2>How to backup</h2>
<pre><code class="language-bash">~/oneinstack/backup_setup.sh // Backup parameters
~/oneinstack/backup.sh // Perform the backup immediately
crontab -l // Can be added to scheduled tasks, such as automatic backups every day 1:00
0 1 * * * cd ~/oneinstack/backup.sh > /dev/null 2>&1 &
</code></pre>
<h2>How to manage service</h2>
<p>Nginx/Tengine/OpenResty:</p>
<pre><code class="language-bash">systemctl {start|stop|status|restart|reload} nginx
</code></pre>
<p>MySQL/MariaDB/Percona:</p>
<pre><code class="language-bash">systemctl {start|stop|restart|reload|status} mysqld
</code></pre>
<p>PostgreSQL:</p>
<pre><code class="language-bash">systemctl {start|stop|restart|status} postgresql
</code></pre>
<p>MongoDB:</p>
<pre><code class="language-bash">systemctl {start|stop|status|restart|reload} mongod
</code></pre>
<p>PHP:</p>
<pre><code class="language-bash">systemctl {start|stop|restart|reload|status} php-fpm
</code></pre>
<p>Apache:</p>
<pre><code class="language-bash">systemctl {start|restart|stop} httpd
</code></pre>
<p>Tomcat:</p>
<pre><code class="language-bash">systemctl {start|stop|status|restart} tomcat
</code></pre>
<p>Pure-FTPd:</p>
<pre><code class="language-bash">systemctl {start|stop|restart|status} pureftpd
</code></pre>
<p>Redis:</p>
<pre><code class="language-bash">systemctl {start|stop|status|restart|reload} redis-server
</code></pre>
<p>Memcached:</p>
<pre><code class="language-bash">systemctl {start|stop|status|restart|reload} memcached
</code></pre>
<h2>How to upgrade</h2>
<pre><code class="language-bash">~/oneinstack/upgrade.sh
</code></pre>
<h2>How to uninstall</h2>
<pre><code class="language-bash">~/oneinstack/uninstall.sh
</code></pre>
<h2>Installation</h2>
<p>For feedback, questions, and to follow the progress of the project: <br> <a href="https://t.me/oneinstack">Telegram Group</a><br> <a href="https://oneinstack.com">OneinStack</a><br></p>
+ just-containers/s6-overlay
+ 2023-10-11T01:39:54Z
+ tag:github.com,2023-10-11:/just-containers/s6-overlay
+
+ <p>s6 overlay for containers (includes execline, s6-linux-utils & a custom init)</p><hr><p><strong>Table of Contents</strong></p>
<ul>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#quickstart">Quickstart</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#compatibility-with-v2">Compatibility with v2</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#goals">Goals</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#features">Features</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#the-docker-way">The Docker Way?</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#init-stages">Init stages</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#installation">Installation</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#usage">Usage</a>
<ul>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#using-cmd">Using <code>CMD</code></a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#writing-a-service-script">Writing a service script</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#setting-the-exit-code-of-the-container-to-the-exit-code-of-your-main-service">Setting the exit code of the container to the exit code of your main service</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#fixing-ownership-and-permissions">Fixing ownership and permissions</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#executing-initialization-and-finalization-tasks">Executing initialization and finalization tasks</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#writing-an-optional-finish-script">Writing an optional finish script</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#logging">Logging</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#dropping-privileges">Dropping privileges</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#read-only-root-filesystem">Read-only Root Filesystem</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#container-environment">Container environment</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#customizing-s6-overlay-behaviour">Customizing s6-overlay's behaviour</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#syslog">syslog</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#performance">Performance</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#verifying-downloads">Verifying Downloads</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#notes">Notes</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#releases">Releases</a>
<ul>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#which-architecture-to-use-depending-on-your-targetarch">Which architecture to use depending on your TARGETARCH</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#contributing">Contributing</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#building-the-overlay-yourself">Building the overlay yourself</a></li>
<li><a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#upgrade-notes">Upgrade notes</a></li>
</ul>
<h1>s6-overlay <a href="https://travis-ci.org/just-containers/s6-overlay"><img src="https://api.travis-ci.org/just-containers/s6-overlay.svg?branch=master" alt="Build Status"></a></h1>
<p>s6-overlay is an easy-to-install (just extract a tarball or two!) set of scripts and utilities allowing you to use existing Docker images while using <a href="https://skarnet.org/software/s6/overview.html">s6</a> as a pid 1 for your container and process supervisor for your services.</p>
<h2>Quickstart</h2>
<p>Build the following Dockerfile and try it out:</p>
<pre><code># Use your favorite image
FROM ubuntu
ARG S6_OVERLAY_VERSION=3.1.5.0
RUN apt-get update && apt-get install -y nginx xz-utils
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
CMD ["/usr/sbin/nginx"]
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-x86_64.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-x86_64.tar.xz
ENTRYPOINT ["/init"]
</code></pre>
<pre><code>docker-host $ docker build -t demo .
docker-host $ docker run --name s6demo -d -p 80:80 demo
docker-host $ docker top s6demo acxf
PID TTY STAT TIME COMMAND
11735 ? Ss 0:00 \_ s6-svscan
11772 ? S 0:00 \_ s6-supervise
11773 ? Ss 0:00 | \_ s6-linux-init-s
11771 ? Ss 0:00 \_ rc.init
11812 ? S 0:00 | \_ nginx
11814 ? S 0:00 | \_ nginx
11816 ? S 0:00 | \_ nginx
11813 ? S 0:00 | \_ nginx
11815 ? S 0:00 | \_ nginx
11779 ? S 0:00 \_ s6-supervise
11785 ? Ss 0:00 | \_ s6-ipcserverd
11778 ? S 0:00 \_ s6-supervise
docker-host $ curl --head http://127.0.0.1/
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Mon, 17 Jan 2022 13:33:58 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 17 Jan 2022 13:32:11 GMT
Connection: keep-alive
ETag: "61e56fdb-264"
Accept-Ranges: bytes
</code></pre>
<h2>Compatibility with v2</h2>
<p>If you're migrating from a previous version of s6-overlay (<em>v2</em>) to the new version (<em>v3</em>), you may need to make some changes to your services or the way you use s6-overlay in order for everything to work smoothly. This document tries to be accurate on how v3 works, but we have a <a href="https://github.com/just-containers/s6-overlay/raw/master/MOVING-TO-V3.md">separate page</a> listing the main differences, and things you're likely to notice. Please read it if you're in this situation!</p>
<h2>Goals</h2>
<p>The project has the following goals:</p>
<ul>
<li>Be usable on top of <em>any</em> Docker image</li>
<li>Make it easy to create new images, that will operate like any other images</li>
<li>Provide users with a turnkey s6 installation that will give them a stable pid 1, a fast and orderly init sequence and shutdown sequence, and the power of process supervision and automatically rotated logs.</li>
</ul>
<h2>Features</h2>
<ul>
<li>A simple init process which allows the end-user to execute tasks like initialization (<code>cont-init.d</code>), finalization (<code>cont-finish.d</code>) and their own services with dependencies between them</li>
<li>The s6-overlay provides proper <code>PID 1</code> functionality
<ul>
<li>You'll never have zombie processes hanging around in your container, they will be properly cleaned up.</li>
</ul> </li>
<li>Multiple processes in a single container</li>
<li>Able to operate in "The Docker Way"</li>
<li>Usable with all base images - Ubuntu, CentOS, Fedora, Alpine, Busybox...</li>
<li>Distributed as a small number of .tar.xz files depending on what exact functionality you need - to keep your image's number of layers small.</li>
<li>A whole set of utilities included in <code>s6</code> and <code>s6-portable-utils</code>. They include handy and composable utilities which make our lives much, much easier.</li>
<li>Log rotating out-of-the-box through <code>logutil-service</code> which uses <a href="https://skarnet.org/software/s6/s6-log.html"><code>s6-log</code></a> under the hood.</li>
<li>Some support for Docker's <code>USER</code> directive, to run your whole process tree as a specific user. Not compatible with all features, details in the <a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#notes">notes</a> section.</li>
</ul>
<h2>The Docker Way?</h2>
<p>One of the oft-repeated Docker mantras is "one process per container", but we disagree. There's nothing inherently <em>bad</em> about running multiple processes in a container. The more abstract "one <em>thing</em> per container" is our policy - a container should do one thing, such as "run a chat service" or "run gitlab." This may involve multiple processes, which is fine.</p>
<p>The other reason image authors shy away from process supervisors is they believe a process supervisor <em>must</em> restart failed services, meaning the Docker container will never die.</p>
<p>This does effectively break the Docker ecosystem - most images run one process that will exit when there's an error. By exiting on error, you allow the system administrator to handle failures however they prefer. If your image will never exit, you now need some alternative method of error recovery and failure notification.</p>
<p>Our policy is that if "the thing" fails, then the container should fail, too. We do this by determining which processes can restart, and which should bring down the container. For example, if <code>cron</code> or <code>syslog</code> fails, your container can most likely restart it without any ill effects, but if <code>ejabberd</code> fails, the container should exit so the system administrator can take action.</p>
<p>Our interpretation of "The Docker Way" is thus:</p>
<ul>
<li>Containers should do one thing</li>
<li>Containers should stop when that thing stops</li>
</ul>
<p>and our init system is designed to do exactly that. Your images will behave like other Docker images and fit in with the existing ecosystem of images.</p>
<p>See "Writing an optional finish script" under the <a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#usage">Usage</a> section for details on stopping "the thing."</p>
<h2>Init stages</h2>
<p>Our overlay init is a properly customized one to run appropriately in containerized environments. This section briefly explains how stages work but if you want to know how a complete init system should work, you can read this article: <a href="https://skarnet.org/software/s6/s6-svscan-1.html">How to run s6-svscan as process 1</a></p>
<ol>
<li><strong>stage 1</strong>: Its purpose is to set up the image to execute the supervision tree which will handle all the auxiliary services, and to launch stage 2. Stage 1 is where all the black magic happens, all the container setup details that we handle for you so that you don't have to care about them.</li>
<li><strong>stage 2</strong>: This is where most of the end-user provided files are meant to be executed:
<ol>
<li>Execute legacy oneshot user scripts contained in <code>/etc/cont-init.d</code>.</li>
<li>Run user s6-rc services declared in <code>/etc/s6-overlay/s6-rc.d</code>, following dependencies</li>
<li>Copy legacy longrun user services (<code>/etc/services.d</code>) to a temporary directory and have s6 start (and supervise) them.</li>
</ol> </li>
<li><strong>stage 3</strong>: This is the shutdown stage. When the container is supposed to exit, it will:
<ol>
<li>Send a TERM signal to all legacy longrun services and, if required, wait for them to exit.</li>
<li>Bring down user s6-rc services in an orderly fashion.</li>
<li>Run any finalization scripts contained in <code>/etc/cont-finish.d</code>.</li>
<li>Send all remaining processes a <code>TERM</code> signal. There should not be any remaining processes anyway.</li>
<li>Sleep for a small grace time, to allow stray processes to exit cleanly.</li>
<li>Send all processes a <code>KILL</code> signal. Then the container exits.</li>
</ol> </li>
</ol>
<h2>Installation</h2>
<p>s6-overlay comes as a set of tarballs that you can extract onto your image. The tarballs you need are a function of the image you use; most people will need the first two, and the other ones are extras you can use at your convenience.</p>
<ol>
<li><code>s6-overlay-noarch.tar.xz</code>: this tarball contains the scripts implementing the overlay. We call it "noarch" because it is architecture- independent: it only contains scripts and other text files. Everyone who wants to run s6-overlay needs to extract this tarball.</li>
<li><code>s6-overlay-x86_64.tar.xz</code>: replace <code>x86_64</code> with your system's architecture. This tarball contains all the necessary binaries from the s6 ecosystem, all linked statically and out of the way of your image's binaries. Unless you know for sure that your image already comes with all the packages providing the binaries used in the overlay, you need to extract this tarball.</li>
<li><code>s6-overlay-symlinks-noarch.tar.xz</code>: this tarball contains symlinks to the s6-overlay scripts so they are accessible via <code>/usr/bin</code>. It is normally not needed, all the scripts are accessible via the PATH environment variable, but if you have old user scripts containing shebangs such as <code>#!/usr/bin/with-contenv</code>, installing these symlinks will make them work.</li>
<li><code>s6-overlay-symlinks-arch.tar.xz</code>: this tarball contains symlinks to the binaries from the s6 ecosystem provided by the second tarball, to make them accessible via <code>/usr/bin</code>. It is normally not needed, but if you have old user scripts containing shebangs such as <code>#!/usr/bin/execlineb</code>, installing these symlinks will make them work.</li>
<li><code>syslogd-overlay-noarch.tar.xz</code>: this tarball contains definitions for a <code>syslogd</code> service. If you are running daemons that cannot log to stderr to take advantage of the s6 logging infrastructure, but hardcode the use of the old <code>syslog()</code> mechanism, you can extract this tarball, and your container will run a lightweight emulation of a <code>syslogd</code> daemon, so your syslog logs will be caught and stored to disk.</li>
</ol>
<p>To install those tarballs, add lines to your Dockerfile that correspond to the functionality you want to install. For instance, most people would use the following:</p>
<pre><code>ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-x86_64.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-x86_64.tar.xz
</code></pre>
<p>Make sure to preserve file permissions when extracting (i.e. to use the <code>-p</code> option to <code>tar</code>.)</p>
<h2>Usage</h2>
<p>The project is distributed as a set of standard .tar.xz files, which you extract at the root of your image. (You need the xz-utils package for <code>tar</code> to understand <code>.tar.xz</code> files; it is available in every distribution, but not always in the default container images, so you may need to <code>apt install xz-utils</code> or <code>apk add xz-utils</code>, or equivalent, before you can expand the archives.)</p>
<p>Afterwards, set your <code>ENTRYPOINT</code> to <code>/init</code>.</p>
<p>Right now, we recommend using Docker's <code>ADD</code> directive instead of running <code>wget</code> or <code>curl</code> in a <code>RUN</code> directive - Docker is able to handle the https URL when you use <code>ADD</code>, whereas your base image might not be able to use https, or might not even have <code>wget</code> or <code>curl</code> installed at all.</p>
<p>From there, you have a couple of options:</p>
<ul>
<li>If you want the container to exit when your program exits: run the program as your image's <code>CMD</code>.</li>
<li>If you want the container to run until told to exit, and your program to be supervised by s6: write a service script for your program.</li>
</ul>
<h3>Using <code>CMD</code></h3>
<p>Using <code>CMD</code> is a convenient way to take advantage of the overlay. Your <code>CMD</code> can be given at build time in the Dockerfile, or at run time on the command line, either way is fine. It will be run as a normal process in the environment set up by s6; when it fails or exits, the container will shut down cleanly and exit. You can run interactive programs in this manner: only the CMD will receive your interactive command, the support processes will be unimpacted.</p>
<p>For example:</p>
<pre><code>FROM busybox
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-x86_64.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-x86_64.tar.xz
ENTRYPOINT ["/init"]
</code></pre>
<pre><code>docker-host $ docker build -t s6demo .
docker-host $ docker run -ti s6demo /bin/sh
/package/admin/s6-overlay/libexec/preinit: notice: /var/run is not a symlink to /run, fixing it
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
/ # ps
PID USER TIME COMMAND
1 root 0:00 /package/admin/s6/command/s6-svscan -d4 -- /run/service
17 root 0:00 {rc.init} /bin/sh -e /run/s6/basedir/scripts/rc.init top /bin/sh
18 root 0:00 s6-supervise s6-linux-init-shutdownd
20 root 0:00 /package/admin/s6-linux-init/command/s6-linux-init-shutdownd -c /run/s6/basedir -g 3000 -C -B
24 root 0:00 s6-supervise s6rc-fdholder
25 root 0:00 s6-supervise s6rc-oneshot-runner
31 root 0:00 /package/admin/s6/command/s6-ipcserverd -1 -- /package/admin/s6/command/s6-ipcserver-access -v0 -E -l0 -i data/rules -- /packa
58 root 0:00 /bin/sh
66 root 0:00 ps
/ # exit
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
docker-host $
</code></pre>
<h3>Writing a service script</h3>
<p>The other way to use a container with s6-overlay is to make your services supervised. You can supervise any number of services; usually they're just support services for the main daemon you run as a CMD, but if that's what you want, nothing prevents you from having an empty CMD and running your main daemon as a supervised service as well. In that case, the daemon will be restarted by s6 whenever it exits; the container will only stop when you tell it to do so, either via a <code>docker stop</code> command, or from inside the container with the <code>/run/s6/basedir/bin/halt</code> command.</p>
<p>There are two ways of making a supervised service. The old way, which is still supported, is to make a "pure s6" service directory. Create a directory with the name of your service in <code>/etc/services.d</code> and put an executable <code>run</code> file into it; this is the file in which you'll put your long-lived process execution. For details of supervision of service directories, and how you can configure how s6 handles your daemon, you can take a look at the <a href="https://skarnet.org/software/s6/servicedir.html">servicedir</a> documentation. A simple example would look like this:</p>
<p><code>/etc/services.d/myapp/run</code>:</p>
<pre><code>#!/command/execlineb -P
nginx -g "daemon off;"
</code></pre>
<p>The new way is to make an <a href="https://skarnet.org/software/s6-rc/">s6-rc</a> <em>source definition directory</em> in the <code>/etc/s6-overlay/s6-rc.d</code> directory, and add the name of that directory to the <code>user</code> bundle, i.e. create an empty file with the same name in the <code>/etc/s6-overlay/s6-rc.d/user/contents.d</code> directory. The format of a <em>source definition directory</em> is described in <a href="https://skarnet.org/software/s6-rc/s6-rc-compile.html">this page</a>. Note that you can define <em>longruns</em>, i.e. daemons that will get supervised by s6 just like with the <code>/etc/services.d</code> method, but also <em>oneshots</em>, i.e. programs that will run once and exit. Your main service is probably a <em>longrun</em>, not a <em>oneshot</em>: you probably need a daemon to stick around.</p>
<p>The advantage of this new format is that it allows you to define dependencies between services: if <em>B</em> depends on <em>A</em>, then <em>A</em> will start first, then <em>B</em> will start when <em>A</em> is ready, and when the container is told to exit, <em>B</em> will stop first, then <em>A</em>. If you have a complex architecture where various processes depends on one another, or simply where you have to mix <em>oneshots</em> and <em>longruns</em> in a precise order, this may be for you.</p>
<p>The example above could be rewritten this way:</p>
<p><code>/etc/s6-overlay/s6-rc.d/myapp/type</code>:</p>
<pre><code>longrun
</code></pre>
<p><code>/etc/s6-overlay/s6-rc.d/myapp/run</code>:</p>
<pre><code>#!/command/execlineb -P
nginx -g "daemon off;"
</code></pre>
<p><code>/etc/s6-overlay/s6-rc.d/user/contents.d/myapp</code>: empty file. (This adds <code>myapp</code> to the set of services that s6-rc will start at container boot.)</p>
<p><code>/etc/s6-overlay/s6-rc.d/myapp/dependencies.d/base</code>: empty file. (This tells s6-rc to only start <code>myapp</code> when all the base services are ready: it prevents race conditions.)</p>
<p>We encourage you to switch to the new format, but if you don't need its benefits, you can stick with regular service directories in <code>/etc/services.d</code>, it will work just as well.</p>
<h3>Setting the exit code of the container to the exit code of your main service</h3>
<p>If you run your main service as a CMD, you have nothing to do: when your CMD exits, or when you run <code>docker stop</code>, the container will naturally exit with the same exit code as your service. (Be aware, however, that in the <code>docker stop</code> case, your service will get a SIGTERM, in which case the exit code will entirely depend on how your service handles it - it could trap it and exit 0, trap it and exit something else, or not trap it and let the shell exit its own code for it - normally 130.)</p>
<p>If you run your main service as a supervised service, however, things are different, and you need to tell the container what code to exit with when you send it a <code>docker stop</code> command. To do that, you need to write a <code>finish</code> script:</p>
<ul>
<li>If your service is a legacy service in <code>/etc/services.d</code>, you need an executable <code>/etc/services.d/myapp/finish</code> script.</li>
<li>If your service is an s6-rc one, you need a <code>/etc/s6-overlay/s6-rc.d/myapp/finish</code> file containing your script (the file may or may not be executable).</li>
</ul>
<p>This <code>finish</code> script will be run when your service exits, and will take two arguments:</p>
<ul>
<li>The first argument will be the exit code of your service, or 256 if your service was killed by an uncaught signal.</li>
<li>The second argument is only meaningful if your service was killed by an uncaught signal, and contains the number of said signal.</li>
</ul>
<p>In the <code>finish</code> script, you need to write the container exit code you want to the <code>/run/s6-linux-init-container-results/exitcode</code> file - and that's it.</p>
<p>For instance, the <code>finish</code> script for the <code>myapp</code> service above could be something like this:</p>
<pre><code class="language-sh">#!/bin/sh
if test "$1" -eq 256 ; then
e=$((128 + $2))
else
e="$1"
fi
echo "$e" > /run/s6-linux-init-container-results/exitcode
</code></pre>
<p>When you send a <code>docker stop</code> command to your container, the <code>myapp</code> service will be killed and this script will be run; it will write either <code>myapp</code>'s exit code (if <code>myapp</code> catches the TERM signal) or 130 (if <code>myapp</code> does not catch the TERM signal) to the special <code>/run/s6-linux-init-container-results/exitcode</code> file, which will be read by s6-overlay at the end of the container shutdown procedure, and your container will exit with that value.</p>
<h3>Fixing ownership and permissions</h3>
<p>This section describes a functionality from the versions of s6-overlay that are <strong>anterior to</strong> v3. fix-attrs is still supported in v3, but is <strong>deprecated</strong>, for several reasons: one of them is that it's generally not good policy to change ownership dynamically when it can be done statically. Another reason is that it doesn't work with USER containers. Instead of fix-attrs, we now recommend you to take care of ownership and permissions on host mounts <em>offline, before running the container</em>. This should be done in your Dockerfile, when you have all the needed information.</p>
<p>That said, here is what we wrote for previous versions and that is still applicable today (but please stop depending on it):</p>
<p>Sometimes it's interesting to fix ownership & permissions before proceeding because, for example, you have mounted/mapped a host folder inside your container. Our overlay provides a way to tackle this issue using files in <code>/etc/fix-attrs.d</code>. This is the pattern format followed by fix-attrs files:</p>
<pre><code>path recurse account fmode dmode
</code></pre>
<ul>
<li><code>path</code>: File or dir path.</li>
<li><code>recurse</code>: (Set to <code>true</code> or <code>false</code>) If a folder is found, recurse through all containing files & folders in it.</li>
<li><code>account</code>: Target account. It's possible to default to fallback <code>uid:gid</code> if the account isn't found. For example, <code>nobody,32768:32768</code> would try to use the <code>nobody</code> account first, then fallback to <code>uid 32768</code> instead. If, for instance, <code>daemon</code> account is <code>UID=2</code> and <code>GID=2</code>, these are the possible values for <code>account</code> field:
<ul>
<li><code>daemon: UID=2 GID=2</code></li>
<li><code>daemon,3:4: UID=2 GID=2</code></li>
<li><code>2:2,3:4: UID=2 GID=2</code></li>
<li><code>daemon:11111,3:4: UID=2 GID=11111</code></li>
<li><code>11111:daemon,3:4: UID=11111 GID=2</code></li>
<li><code>daemon:daemon,3:4: UID=2 GID=2</code></li>
<li><code>daemon:unexisting,3:4: UID=2 GID=4</code></li>
<li><code>unexisting:daemon,3:4: UID=3 GID=2</code></li>
<li><code>11111:11111,3:4: UID=11111 GID=11111</code></li>
</ul> </li>
<li><code>fmode</code>: Target file mode. For example, <code>0644</code>.</li>
<li><code>dmode</code>: Target dir/folder mode. For example, <code>0755</code>.</li>
</ul>
<p>Here you have some working examples:</p>
<p><code>/etc/fix-attrs.d/01-mysql-data-dir</code>:</p>
<pre><code>/var/lib/mysql true mysql 0600 0700
</code></pre>
<p><code>/etc/fix-attrs.d/02-mysql-log-dirs</code>:</p>
<pre><code>/var/log/mysql-error-logs true nobody,32768:32768 0644 2700
/var/log/mysql-general-logs true nobody,32768:32768 0644 2700
/var/log/mysql-slow-query-logs true nobody,32768:32768 0644 2700
</code></pre>
<h3>Executing initialization and finalization tasks</h3>
<p>Here is the old way of doing it:</p>
<p>After fixing attributes (through <code>/etc/fix-attrs.d/</code>) and before starting user provided services (through s6-rc or <code>/etc/services.d</code>) our overlay will execute all the scripts found in <code>/etc/cont-init.d</code>, for example:</p>
<p><a href="https://github.com/just-containers/nginx-loadbalancer/raw/master/rootfs/etc/cont-init.d/02-confd-onetime"><code>/etc/cont-init.d/02-confd-onetime</code></a>:</p>
<pre><code>#!/command/execlineb -P
with-contenv
s6-envuidgid nginx
multisubstitute
{
import -u -D0 UID
import -u -D0 GID
import -u CONFD_PREFIX
define CONFD_CHECK_CMD "/usr/sbin/nginx -t -c {{ .src }}"
}
confd --onetime --prefix="${CONFD_PREFIX}" --tmpl-uid="${UID}" --tmpl-gid="${GID}" --tmpl-src="/etc/nginx/nginx.conf.tmpl" --tmpl-dest="/etc/nginx/nginx.conf" --tmpl-check-cmd="${CONFD_CHECK_CMD}" etcd
</code></pre>
<p>This way is still supported. However, there is now a more generic and efficient way to do it: writing your oneshot initialization and finalization tasks as s6-rc services, by adding service definition directories in <code>/etc/s6-overlay/s6-rc.d</code>, making them part of the <code>user</code> bundle (so they are actually started when the container boots), and making them depend on the <code>base</code> bundle (so they are only started after <code>base</code>).</p>
<p>All the information on s6-rc can be found <a href="https://skarnet.org/software/s6-rc/">here</a>.</p>
<p>When the container is started, the operations are performed in this order:</p>
<ul>
<li>(deprecated) Attribute fixing is performed according to files in <code>/etc/fix-attrs.d</code>.</li>
<li>(legacy) One-shot initialization scripts in <code>/etc/cont-init.d</code> are run sequentially.</li>
<li>Services in the <code>user</code> bundle are started by s6-rc, in an order defined by dependencies. Services can be oneshots (initialization tasks) or longruns (daemons that will run throughout the container's lifetime). If the services depend on <code>base</code>, they are guaranteed to start at this point and not earlier; if they do not, they might have been started earlier, which may cause race conditions - so it's recommended to always make them depend on <code>base</code>.</li>
<li>(legacy) Longrun services in <code>/etc/services.d</code> are started.</li>
<li>Services in the <code>user2</code> bundle with the correct dependency are started. (Most people don't need to use this; if you are not sure, stick to the <code>user</code> bundle.)</li>
</ul>
<p>When the container is stopped, either because the admin sent a stop command or because the CMD exited, the operations are performed in the reverse order:</p>
<ul>
<li>Services in the <code>user2</code> bundle with the correct dependency are stopped.</li>
<li>(legacy) Longrun services in <code>/etc/services.d</code> are stopped.</li>
<li>All s6-rc services are stopped, in an order defined by dependencies. For oneshots, that means that the <code>down</code> script in the source definition directory is executed; that's how s6-rc can perform finalization tasks.</li>
<li>(legacy) One shot finalization scripts in <code>/etc/cont-finish.d</code> are run sequentially.</li>
</ul>
<p>The point of the <code>user2</code> bundle is to allow user services declared in it to start <em>after</em> the <code>/etc/services.d</code> ones; but in order to do so, every service in <code>user2</code> needs to declare a dependency to <code>legacy-services</code>. In other words, for a service <code>foobar</code> to start late, you need to:</p>
<ul>
<li>Define it in <code>/etc/s6-overlay/s6-rc.d/foobar</code> like any other s6-rc service.</li>
<li>Add an <code>/etc/s6-overlay/s6-rc.d/foobar/dependencies.d/legacy-services</code> file</li>
<li>Add an <code>/etc/s6-overlay/s6-rc.d/user2/contents.d/foobar</code> file.</li>
</ul>
<p>That will ensure that <code>foobar</code> will start <em>after</em> everything in <code>/etc/services.d</code>.</p>
<h3>Writing an optional finish script</h3>
<p>By default, services created in <code>/etc/services.d</code> will automatically restart. If a service should bring the container down, you should probably run it as a CMD instead; but if you'd rather run it as a supervised service, then you'll need to write a <code>finish</code> script, which will be run when the service is down; to make the container stop, the <code>/run/s6/basedir/bin/halt</code> command must be invoked. Here's an example finish script:</p>
<p><code>/etc/services.d/myapp/finish</code>:</p>
<pre><code>#!/command/execlineb -S0
foreground { redirfd -w 1 /run/s6-linux-init-container-results/exitcode echo 0 }
/run/s6/basedir/bin/halt
</code></pre>
<p>The first line of the script writes <code>0</code> to the <code>/run/s6-linux-init-container-results/exitcode</code> file. The second line stops the container. When you stop the container via the <code>/run/s6/basedir/bin/halt</code> command run from inside the container, <code>/run/s6-linux-init-container-results/exitcode</code> is read and its contents are used as the exit code for the <code>docker run</code> command that launched the container. If the file doesn't exist, or if the container is stopped with <code>docker stop</code> or another reason, that exit code defaults to 0.</p>
<p>It is possible to do more advanced operations in a finish script. For example, here's a script from that only brings down the service when it exits nonzero:</p>
<p><code>/etc/services.d/myapp/finish</code>:</p>
<pre><code>#!/command/execlineb -S1
if { eltest ${1} -ne 0 -a ${1} -ne 256 }
/run/s6/basedir/bin/halt
</code></pre>
<p>Note that in general, finish scripts should only be used for local cleanups after a daemon dies. If a service is so important that the container needs to stop when it dies, we really recommend running it as the CMD.</p>
<h3>Logging</h3>
<p>Every service can have its dedicated logger. A logger is a s6 service that automatically reads from the <em>stdout</em> of your service, and logs the data to an automatically rotated file in the place you want. Note that daemons usually log to stderr, not stdout, so you should probably start your service's run script with <code>exec 2>&1</code> in shell, or with <code>fdmove -c 2 1</code> in execline, in order to catch <em>stderr</em>.</p>
<p>s6-overlay provides a utility called <code>logutil-service</code> which is a wrapper over the <a href="https://skarnet.org/software/s6/s6-log.html"><code>s6-log</code></a> program. This helper does the following:</p>
<ul>
<li>read how s6-log should proceed reading the logging script contained in <code>S6_LOGGING_SCRIPT</code></li>
<li>drop privileges to the <code>nobody</code> user (defaulting to <code>65534:65534</code> if it doesn't exist)</li>
<li>clean all the environments variables</li>
<li>execute into s6-log.</li>
</ul>
<p>s6-log will then run forever, reading data from your service and writing it to the directory you specified to <code>logutil-service</code>.</p>
<p>Please note:</p>
<ul>
<li>Since the privileges are dropped automatically, there is no need to switch users with <code>s6-setuidgid</code></li>
<li>You should ensure the log folder either:
<ul>
<li>exists, and is writable by the <code>nobody</code> user</li>
<li>does not exist, but the parent folder is writable by the <code>nobody</code> user.</li>
</ul> </li>
</ul>
<p>You can create log folders in <code>cont-init.d</code> scripts, or as s6-rc oneshots. Here is an example of a logged service <code>myapp</code> implemented the old way:</p>
<p><code>/etc/cont-init.d/myapp-log-prepare</code>:</p>
<pre><code class="language-sh">#!/bin/sh -e
mkdir -p /var/log/myapp
chown nobody:nogroup /var/log/myapp
chmod 02755 /var/log/myapp
</code></pre>
<p><code>/etc/services.d/myapp/run</code>:</p>
<pre><code class="language-sh">#!/bin/sh
exec 2>&1
exec mydaemon-in-the-foreground-and-logging-to-stderr
</code></pre>
<p><code>/etc/services.d/myapp/log/run</code>:</p>
<pre><code class="language-sh">#!/bin/sh
exec logutil-service /var/log/myapp
</code></pre>
<p>And here is the same service, myapp, implemented in s6-rc.</p>
<p><code>/etc/s6-overlay/s6-rc.d/myapp-log-prepare/dependencies.d/base</code>: empty file</p>
<p><code>/etc/s6-overlay/s6-rc.d/myapp-log-prepare/type</code>:</p>
<pre><code>oneshot
</code></pre>
<p><code>/etc/s6-overlay/s6-rc.d/myapp-log-prepare/up</code>:</p>
<pre><code>if { mkdir -p /var/log/myapp }
if { chown nobody:nogroup /var/log/myapp }
chmod 02755 /var/log/myapp
</code></pre>
<details>
<summary>(Click here for an explanation of the weird syntax or if you don't understand why your `up` file isn't working.)</summary>
<p> </p>
<p>(Beginning of the detailed section.)</p>
<p>So, the <code>up</code> and <code>down</code> files are special: they're not shell scripts, but single command lines interpreted by <a href="https://skarnet.org/software/execline/execlineb.html">execlineb</a>. You should not have to worry about execline; you should only remember that an <code>up</code> file contains a single command line. So if you need a script with several instructions, here's how to do it:</p>
<ul>
<li>Write your script in the language of your choice, in a location of your choice</li>
<li>Make it executable</li>
<li>Call that script in the <code>up</code> file.</li>
</ul>
<p>Here is how you would normally proceed to write the <code>up</code> file for <code>myapp-log-prepare</code>:</p>
<p><code>/etc/s6-overlay/s6-rc.d/myapp-log-prepare/up</code>:</p>
<pre><code>/etc/s6-overlay/scripts/myapp-log-prepare
</code></pre>
<p><code>/etc/s6-overlay/scripts/myapp-log-prepare</code>: (needs to be executable)</p>
<pre><code class="language-sh">#!/bin/sh -e
mkdir -p /var/log/myapp
chown nobody:nogroup /var/log/myapp
chmod 02755 /var/log/myapp
</code></pre>
<p>The location of the actual script is arbitrary, it just needs to match what you're writing in the <code>up</code> file.</p>
<p>But here, it just so happens that the script is simple enough that it can fit entirely in the <code>up</code> file without making it too complex or too difficult to understand. So, we chose to include it as an example to show that there's more that you can do with <code>up</code> files, if you are so inclined. You can read the full documentation for the execline language <a href="https://skarnet.org/software/execline/">here</a>.</p>
<p>(End of the detailed section, click the triangle above again to collapse.)</p>
<p></p>
</details>
<p><code>/etc/s6-overlay/s6-rc.d/myapp/dependencies.d/base</code>: empty file</p>
<p><code>/etc/s6-overlay/s6-rc.d/myapp-log/dependencies.d/myapp-log-prepare</code>: empty file</p>
<p><code>/etc/s6-overlay/s6-rc.d/myapp/type</code>:</p>
<pre><code>longrun
</code></pre>
<p><code>/etc/s6-overlay/s6-rc.d/myapp/run</code>:</p>
<pre><code class="language-sh">#!/bin/sh
exec 2>&1
exec mydaemon-in-the-foreground-and-logging-to-stderr
</code></pre>
<p><code>/etc/s6-overlay/s6-rc.d/myapp/producer-for</code>:</p>
<pre><code>myapp-log
</code></pre>
<p><code>/etc/s6-overlay/s6-rc.d/myapp-log/type</code>:</p>
<pre><code>longrun
</code></pre>
<p><code>/etc/s6-overlay/s6-rc.d/myapp-log/run</code>:</p>
<pre><code class="language-sh">#!/bin/sh
exec logutil-service /var/log/myapp
</code></pre>
<p><code>/etc/s6-overlay/s6-rc.d/myapp-log/consumer-for</code>:</p>
<pre><code>myapp
</code></pre>
<p><code>/etc/s6-overlay/s6-rc.d/myapp-log/pipeline-name</code>:</p>
<pre><code>myapp-pipeline
</code></pre>
<p><code>/etc/s6-overlay/s6-rc.d/user/contents.d/myapp-pipeline</code>: empty file</p>
<p>That's a lot of files! A summary of what it all means is:</p>
<ul>
<li>myapp-log-prepare is a oneshot, preparing the logging directory. It is a dependency of myapp-log, so it will be started <em>before</em> myapp-log.</li>
<li>myapp is a producer for myapp-log and myapp-log is a consumer for myapp, so what myapp writes to its stdout will go to myapp-log's stdin. Both are longruns, i.e. daemons that will be supervised by s6.</li>
<li>The <code>myapp | myapp-log</code> pipeline is given a name, <code>myapp-pipeline</code>, and this name is declared as a part of the <code>user</code> bundle, so it will be started when the container starts.</li>
<li><code>myapp-log-prepare</code>, <code>myapp-log</code> and <code>myapp</code> all depend on the <code>base</code> bundle, which means they will only be started when the system is actually ready to start them.</li>
</ul>
<p>It really accomplishes the same things as the <code>/etc/cont-init.d</code> plus <code>/etc/services.d</code> method, but it's a lot cleaner underneath, and can handle much more complex dependency graphs, so whenever you get the opportunity, we recommend you familiarize yourself with the <a href="https://skarnet.org/software/s6-rc/">s6-rc</a> way of declaring your services and your loggers. The full syntax of a service definition directory, including declaring whether your service is a longrun or a oneshot, declaring pipelines, adding service-specific timeouts if you need them, etc., can be found <a href="https://skarnet.org/software/s6-rc/s6-rc-compile.html#source">here</a>.</p>
<h3>Dropping privileges</h3>
<p>When it comes to executing a service, no matter whether it's a service or a logger, a good practice is to drop privileges before executing it. <code>s6</code> already includes utilities to do exactly these kind of things:</p>
<p>In <code>execline</code>:</p>
<pre><code>#!/command/execlineb -P
s6-setuidgid daemon
myservice
</code></pre>
<p>In <code>sh</code>:</p>
<pre><code class="language-sh">#!/bin/sh
exec s6-setuidgid daemon myservice
</code></pre>
<p>If you want to know more about these utilities, please take a look at: <a href="http://skarnet.org/software/s6/s6-setuidgid.html"><code>s6-setuidgid</code></a>, <a href="http://skarnet.org/software/s6/s6-envuidgid.html"><code>s6-envuidgid</code></a>, and <a href="http://skarnet.org/software/s6/s6-applyuidgid.html"><code>s6-applyuidgid</code></a>.</p>
<h3>Container environment</h3>
<p>If you want your custom script to have container environments available: you can use the <code>with-contenv</code> helper, which will push all of those into your execution environment, for example:</p>
<p><code>/etc/cont-init.d/01-contenv-example</code>:</p>
<pre><code class="language-sh">#!/command/with-contenv sh
env
</code></pre>
<p>This script will output the contents of your container environment.</p>
<h3>Read-Only Root Filesystem</h3>
<p>Recent versions of Docker allow running containers with a read-only root filesystem. If your container is in such a case, you should set <code>S6_READ_ONLY_ROOT=1</code> to inform s6-overlay that it should not attempt to write to certain areas - instead, it will perform copies into a tmpfs mounted on <code>/run</code>.</p>
<p>Note that s6-overlay assumes that:</p>
<ul>
<li><code>/run</code> exists and is writable. If it is not, it will attempt to mount a tmpfs there.</li>
<li><code>/var/run</code> is a symbolic link to <code>/run</code>, for compatibility with previous versions. If it is not, it will make it so.</li>
</ul>
<p>In general your default docker settings should already provide a suitable tmpfs in <code>/run</code>.</p>
<h3>Customizing s6-overlay behaviour</h3>
<p>It is possible somehow to tweak s6-overlay's behaviour by providing an already predefined set of environment variables to the execution context:</p>
<ul>
<li><code>PATH</code> (default = <code>/command:/usr/bin:/bin</code>): this is the default PATH that all the services in the container, including the CMD, will have. Set this variable if you have a lot of services that depend on binaries stored in another directory, e.g. <code>/usr/sbin</code>. Note that <code>/command</code>, <code>/usr/bin</code> and <code>/bin</code> will always be added to that path if they're not already in the one you provide.</li>
<li><code>S6_KEEP_ENV</code> (default = 0): if set, then environment is not reset and whole supervision tree sees original set of env vars. It switches <code>with-contenv</code> into a nop.</li>
<li><code>S6_LOGGING</code> (default = 0):
<ul>
<li><strong><code>0</code></strong>: Outputs everything to stdout/stderr.</li>
<li><strong><code>1</code></strong>: Uses an internal <code>catch-all</code> logger and persists everything on it, it is located in <code>/var/log/s6-uncaught-logs</code>. Anything run as a <code>CMD</code> is still output to stdout/stderr.</li>
<li><strong><code>2</code></strong>: Uses an internal <code>catch-all</code> logger and persists everything on it, including the output of <code>CMD</code>. Absolutely nothing is written to stdout/stderr.</li>
</ul> </li>
<li><code>S6_CATCHALL_USER</code> (default = root): if set, and if <code>S6_LOGGING</code> is 1 or 2, then the catch-all logger is run as this user, which must be defined in your image's <code>/etc/passwd</code>. Every bit of privilege separation helps a little with security.</li>
<li><code>S6_BEHAVIOUR_IF_STAGE2_FAILS</code> (default = 0): determines what the container should do if one of the service scripts fails. This includes:
<ul>
<li>if anything fails in <code>fix-attrs</code></li>
<li>if any old-style <code>/etc/cont-init.d</code> or new-style <a href="https://skarnet.org/software/s6-rc/">s6-rc</a> oneshot fails</li>
<li>if any old-style <code>/etc/services.d</code> or new-style <a href="https://skarnet.org/software/s6-rc/">s6-rc</a> longrun is marked as expecting readiness notification, and fails to become <em>ready</em> in the allotted time (see <code>S6_CMD_WAIT_FOR_SERVICES_MAXTIME</code> below). The valid values for <code>S6_BEHAVIOUR_IF_STAGE2_FAILS</code> are the following:</li>
<li><strong><code>0</code></strong>: Continue silently even if a script has failed.</li>
<li><strong><code>1</code></strong>: Continue but warn with an annoying error message.</li>
<li><strong><code>2</code></strong>: Stop the container.</li>
</ul> </li>
<li><code>S6_KILL_FINISH_MAXTIME</code> (default = 5000): How long (in milliseconds) the system should wait, at shutdown time, for a script in <code>/etc/cont-finish.d</code> to finish naturally. After this duration, the script will be sent a SIGKILL. Bear in mind that scripts in <code>/etc/cont.finish.d</code> are run sequentially, and the shutdown sequence will potentially wait for <code>S6_KILL_FINISH_MAXTIME</code> milliseconds for <em>each</em> script.</li>
<li><code>S6_SERVICES_READYTIME</code> (default = 50): With services declared in <code>/etc/services.d</code>, there is an unavoidable race condition between the moment when services are started and the moment when they can be tested for readiness. To avoid that race, we sleep a little time, by default 50 milliseconds, before testing for readiness. If your machine is slow or very busy, you may get errors looking like <code>s6-svwait: fatal: unable to s6_svstatus_read: No such file or directory</code>. In that case, you should increase the sleeping time, by declaring it (in milliseconds) in the <code>S6_SERVICES_READYTIME</code> variable. Note that it only concerns <code>/etc/services.d</code>; s6-rc is immune to the race condition.</li>
<li><code>S6_SERVICES_GRACETIME</code> (default = 3000): How long (in milliseconds) <code>s6</code> should wait, at shutdown time, for services declared in <code>/etc/services.d</code> to die before proceeding with the rest of the shutdown.</li>
<li><code>S6_KILL_GRACETIME</code> (default = 3000): How long (in milliseconds) <code>s6</code> should wait, at the end of the shutdown procedure when all the processes have received a TERM signal, for them to die before sending a <code>KILL</code> signal to make <em>sure</em> they're dead.</li>
<li><code>S6_LOGGING_SCRIPT</code> (default = "n20 s1000000 T"): This env decides what to log and how, by default every line will prepend with ISO8601, rotated when the current logging file reaches 1mb and archived, at most, with 20 files.</li>
<li><code>S6_CMD_ARG0</code> (default = not set): Value of this env var will be prepended to any <code>CMD</code> args passed by docker. Use it if you are migrating an existing image to s6-overlay and want to make it a drop-in replacement: setting this variable to the value of a previously used ENTRYPOINT will help you transition.</li>
<li><code>S6_CMD_USE_TERMINAL</code> (default = 0): Set this value to <strong>1</strong> if you have a CMD that needs a terminal for its output (typically when you're running your container with <code>docker run -it</code>), and you have set <code>S6_LOGGING</code> to a nonzero value. This setting will make your CMD actually output to your terminal; the drawback is that its output will not be logged. By default (when this variable is <strong>0</strong> or not set), the stdout and stderr of your CMD are logged when <code>S6_LOGGING</code> is nonzero, which means they go to a pipe even if you're running it in an interactive terminal.</li>
<li><code>S6_FIX_ATTRS_HIDDEN</code> (default = 0): Controls how <code>fix-attrs.d</code> scripts process files and directories.
<ul>
<li><strong><code>0</code></strong>: Hidden files and directories are excluded.</li>
<li><strong><code>1</code></strong>: All files and directories are processed.</li>
</ul> </li>
<li><code>S6_CMD_WAIT_FOR_SERVICES</code> (default = 0): By default when the container starts, services in <code>/etc/services.d</code> will be started and execution will proceed to starting the <code>user2</code> bundle and the CMD, if any of these is defined. If <code>S6_CMD_WAIT_FOR_SERVICES</code> is nonzero, however, the container starting sequence will wait until the services in <code>/etc/services.d</code> are <em>ready</em> before proceeding with the rest of the sequence. Note that this is only significant if the services in <code>/etc/services.d</code> <a href="https://skarnet.org/software/s6/notifywhenup.html">notify their readiness</a> to s6.</li>
<li><code>S6_CMD_WAIT_FOR_SERVICES_MAXTIME</code> (default = 5000): The maximum time (in milliseconds) the services could take to bring up before proceding to CMD executing. Note that this value also includes the time setting up legacy container initialization (<code>/etc/cont-init.d</code>) and services (<code>/etc/services.d</code>), and that it is taken into account even if you are not running a CMD. In other words: no matter whether you're running a CMD or not, if you have scripts in <code>/etc/cont-init.d</code> that take a long time to run, you should set this variable to either 0, or a value high enough so that your scripts have time to finish without s6-overlay interrupting them and diagnosing an error.</li>
<li><code>S6_READ_ONLY_ROOT</code> (default = 0): When running in a container whose root filesystem is read-only, set this env to <strong>1</strong> to inform init stage 2 that it should copy user-provided initialization scripts from <code>/etc</code> to <code>/run/s6/etc</code> before it attempts to change permissions, etc. See <a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/#read-only-root-filesystem">Read-Only Root Filesystem</a> for more information.</li>
<li><code>S6_SYNC_DISKS</code> (default = 0): Set this env to <strong>1</strong> to inform init stage 3 that it should attempt to sync filesystems before stopping the container. Note: this will likely sync all filesystems on the host.</li>
<li><code>S6_STAGE2_HOOK</code> (default = none): If this variable exists, its contents will be interpreted as a shell excerpt that will be run in the early stage 2, before services are started. This can be used, for instance, to dynamically patch the service database at run-time right before it is compiled and run. The wrong value can prevent your container from running or endanger your security, so only use this if you know exactly what you are doing. When in doubt, leave this variable undefined.</li>
<li><code>S6_VERBOSITY</code> (default = 2): controls the verbosity of s6-rc, and potentially other tools, at container start and stop time. The default, 2, is normally verbose: it will list the service start and stop operations. You can make the container quieter by decreasing this number: 1 will only print warnings and errors, and 0 will only print errors. You can also make the container <em>more</em> verbose, i.e. print tracing and debug information, by increasing this number up to 5, but the output will quickly become <em>very</em> noisy, and most people shouldn't need this.</li>
<li><code>S6_CMD_RECEIVE_SIGNALS</code> (default = 0): decides whether signals sent to the container should be sent to the container's pid 1 or to the CMD. By default, when you perform for instance a <code>docker stop</code>, a TERM signal will be sent to the container's pid 1, which will trigger the full container shutdown sequence - but if a CMD is present, it will be among the last processes to be killed, only when everything else is down and the container is about to exit. If this variable is 1 or more, signals are diverted from pid 1 to the CMD, which means that <code>docker stop</code> will send a SIGTERM to the CMD instead, and the container will only trigger its shutdown procedure when the CMD is dead. Note that only SIGTERM, SIGQUIT, SIGINT, SIGUSR1, SIGUSR2, SIGPWR and SIGWINCH are diverted; other signals either are ignored or cannot be diverted and are necessarily handled by pid 1. Please be aware that using this option may prevent interactive CMDs from working at all - in other words, if you're running an interactive CMD in a terminal, don't set this variable; but that should be fine since in this case you already have interactive ways of stopping your CMD.</li>
</ul>
<h3>syslog</h3>
<p>If software running in your container requires syslog, extract the <code>syslogd-overlay-noarch.tar.xz</code> tarball: that will give you a small syslogd emulation. Logs will be found under various subdirectories of <code>/var/log/syslogd</code>, for instance messages will be found in the <code>/var/log/syslogd/messages/</code> directory, the latest logs being available in the <code>/var/log/syslogd/messages/current</code> file. Logging directories are used rather than files so that logs can be automatically rotated without race conditions (that is a feature of <a href="https://skarnet.org/software/s6/s6-log.html">s6-log</a>).</p>
<p>It is recommended to add <code>syslog</code> and <code>sysllog</code> users to your image, for privilege separation; the syslogd emulation processes will run as these users if they exist. Otherwise they will default to <code>32760:32760</code> and <code>32761:32761</code>, numeric uids/gids that may already exist on your system.</p>
<h2>Performance</h2>
<ul>
<li>The noarch and symlinks tarballs are all tiny. The biggest tarball is the one that contains the binaries; it's around 650 kB.</li>
<li>Uncompressed on a tmpfs, the overlay scripts use about 120 kB, and the binaries for x86_64 use about 5.7 MB.</li>
<li>We haven't yet measured the time it takes for the container to be up and running once you run <code>docker run</code>, but you will notice it's fast. Faster than previous versions of s6-overlay, with fewer delays. And if you convert your <code>/etc/cont-init.d</code> scripts to the s6-rc format, they will be able to run in parallel, so you will gain even more performance. If you have benchmarks, please send them to us!</li>
</ul>
<h2>Verifying Downloads</h2>
<p>The s6-overlay releases have a checksum files you can use to verify the download using SHA256:</p>
<pre><code class="language-sh">ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz.sha256 /tmp
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-x86_64.tar.xz /tmp
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-x86_64.tar.xz.sha256 /tmp
RUN cd /tmp && sha256sum -c *.sha256
</code></pre>
<h2>Notes</h2>
<h3><code>USER</code> directive</h3>
<p>As of version 3.1.5.0, s6-overlay has limited support for running as a user other than <code>root</code>:</p>
<ul>
<li>Tools like <code>fix-attrs</code> and <code>logutil-service</code> are unlikely to work (they rely on being able to change UIDs).</li>
<li>The syslogd emulation will not work.</li>
</ul>
<p>Generally speaking, if you're running a simple container with a main application and one or two support services, you may benefit from the <code>USER</code> directive if that is your preferred way of running containers. However, if you're running more than a few services, or daemons that expect a real system with complete Unix infrastructure, then USER is probably not a good idea and you would benefit more from using privilege separation between services in your container.</p>
<h2>Releases</h2>
<p>Over on the releases tab, we have a number of tarballs:</p>
<ul>
<li><code>s6-overlay-noarch.tar.xz</code>: the s6-overlay scripts.</li>
<li><code>s6-overlay-${arch}.tar.xz</code>: the binaries for platform <em>${arch}</em>. They are statically compiled and will work with any Linux distribution.</li>
<li><code>s6-overlay-symlinks-noarch.tar.xz</code>: <code>/usr/bin</code> symlinks to the s6-overlay scripts. Totally optional.</li>
<li><code>s6-overlay-symlinks-arch.tar.xz</code>: <code>/usr/bin</code> symlinks to the skaware binaries. Totally optional.</li>
<li><code>syslogd-overlay-noarch.tar.xz</code>: the syslogd emulation. Totally optional.</li>
<li><code>s6-overlay-${version}.tar.xz</code>: the s6-overlay source. Download it if you want to build s6-overlay yourself.</li>
</ul>
<p>We have binaries for at least x86_64, aarch64, arm32, i486, i686, riscv64, and s390x. The full list of supported arches can be found in <a href="https://github.com/just-containers/s6-overlay/raw/master/conf/toolchains">conf/toolchains</a>.</p>
<h3>Which architecture to use depending on your TARGETARCH</h3>
<p>The <code>${arch}</code> part in the <code>s6-overlay-${arch}.tar.xz</code> tarball uses the naming conventions of gcc, which are not the ones that Docker uses. (Everyone does something different in this field depending on their needs, and no solution is better than any other, but the Docker one is <em>worse</em> than others because its naming is inconsistent. The gcc convention is better for us because it simplifies our builds greatly and makes them more maintainable.)</p>
<p>The following table should help you find the right tarball for you if you're using the TARGETARCH value provided by Docker:</p>
<table>
<thead>
<tr>
<th align="left">${TARGETARCH}</th>
<th align="left">${arch}</th>
<th align="left">Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">amd64</td>
<td align="left">x86_64</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">arm64</td>
<td align="left">aarch64</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">arm/v7</td>
<td align="left">arm</td>
<td align="left">armv7 with soft-float</td>
</tr>
<tr>
<td align="left">arm/v6</td>
<td align="left">armhf</td>
<td align="left">Raspberry Pi 1</td>
</tr>
<tr>
<td align="left">386</td>
<td align="left">i686</td>
<td align="left">i486 for very old hw</td>
</tr>
<tr>
<td align="left">riscv64</td>
<td align="left">riscv64</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">s390x</td>
<td align="left">s390x</td>
<td align="left"></td>
</tr>
</tbody>
</table>
<p>If you need another architecture, ask us and we'll try to make a toolchain for it. In particular, we know that armv7 is a mess and needs a flurry of options depending on your precise target (and this is one of the reasons why the Docker naming system isn't good, although arguably the gcc naming system isn't much better on that aspect).</p>
<h2>Contributing</h2>
<p>Any way you want! Open issues, open PRs, we welcome all contributors!</p>
<h2>Building the overlay yourself</h2>
<ul>
<li>Download the [s6-overlay source].</li>
<li>Check the <a href="https://github.com/just-containers/s6-overlay/raw/master/conf/defaults.mk">conf/defaults.mk</a> file for variables you may want to change. Do not modify the file itself.</li>
<li>Call <code>make</code> followed by your variable assignments. Example: <code>make ARCH=riscv64-linux-musl</code> to build the overlay for RISCV64.</li>
<li>The tarballs will be in the <code>output</code> subdirectory, unless you changed the <code>OUTPUT</code> variable.</li>
</ul>
<h2>Upgrade Notes</h2>
<p>Please see <a href="https://raw.githubusercontent.com/just-containers/s6-overlay/master/CHANGELOG.md">CHANGELOG</a>.</p>
\ No newline at end of file
diff --git a/shellcheck-config/daily/index.xml b/shellcheck-config/daily/index.xml
index b7481456eac..ca34cca3306 100644
--- a/shellcheck-config/daily/index.xml
+++ b/shellcheck-config/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ShellCheck Config Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:39:54Z
+ 2023-10-11T01:39:50Z
Daily Trending of ShellCheck Config in GitHub
\ No newline at end of file
diff --git a/shellsession/daily/index.xml b/shellsession/daily/index.xml
index 014a302bfc6..62a32ee0a64 100644
--- a/shellsession/daily/index.xml
+++ b/shellsession/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ShellSession Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:16Z
+ 2023-10-11T01:40:13Z
Daily Trending of ShellSession in GitHub
\ No newline at end of file
diff --git a/shen/daily/index.xml b/shen/daily/index.xml
index ea772686f87..f102efc184a 100644
--- a/shen/daily/index.xml
+++ b/shen/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Shen Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:18Z
+ 2023-10-11T01:40:13Z
Daily Trending of Shen in GitHub
\ No newline at end of file
diff --git a/sieve/daily/index.xml b/sieve/daily/index.xml
index cb7d1005a38..8586c38e744 100644
--- a/sieve/daily/index.xml
+++ b/sieve/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Sieve Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:17Z
+ 2023-10-11T01:40:14Z
Daily Trending of Sieve in GitHub
\ No newline at end of file
diff --git a/singularity/daily/index.xml b/singularity/daily/index.xml
index 39016a34831..a7fc721b66f 100644
--- a/singularity/daily/index.xml
+++ b/singularity/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Singularity Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:21Z
+ 2023-10-11T01:40:17Z
Daily Trending of Singularity in GitHub
\ No newline at end of file
diff --git a/slash/daily/index.xml b/slash/daily/index.xml
index b1a950cb040..d0546a0d752 100644
--- a/slash/daily/index.xml
+++ b/slash/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Slash Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:22Z
+ 2023-10-11T01:40:18Z
Daily Trending of Slash in GitHub
\ No newline at end of file
diff --git a/slice/daily/index.xml b/slice/daily/index.xml
index c40b4c22338..64c00285f2d 100644
--- a/slice/daily/index.xml
+++ b/slice/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Slice Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:20Z
+ 2023-10-11T01:40:16Z
Daily Trending of Slice in GitHub
\ No newline at end of file
diff --git a/slim/daily/index.xml b/slim/daily/index.xml
index 2ad0b1a3887..689b71d976e 100644
--- a/slim/daily/index.xml
+++ b/slim/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Slim Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:20Z
+ 2023-10-11T01:40:17Z
Daily Trending of Slim in GitHub
\ No newline at end of file
diff --git a/smali/daily/index.xml b/smali/daily/index.xml
index b21561000aa..c988abb7d68 100644
--- a/smali/daily/index.xml
+++ b/smali/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Smali Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:25Z
+ 2023-10-11T01:40:21Z
Daily Trending of Smali in GitHub
\ No newline at end of file
diff --git a/smalltalk/daily/index.xml b/smalltalk/daily/index.xml
index 4cdacb2f967..8a3cf6bb108 100644
--- a/smalltalk/daily/index.xml
+++ b/smalltalk/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Smalltalk Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:29Z
+ 2023-10-11T01:40:24Z
Daily Trending of Smalltalk in GitHub
+
+ pharo-graphics/Roassal
+ 2023-10-11T01:40:24Z
+ tag:github.com,2023-10-11:/pharo-graphics/Roassal
+
+ <p>The Roassal Visualization Engine</p><hr>
+
\ No newline at end of file
diff --git a/smarty/daily/index.xml b/smarty/daily/index.xml
index 93edf81ec21..498491c99e2 100644
--- a/smarty/daily/index.xml
+++ b/smarty/daily/index.xml
@@ -1,14 +1,14 @@
GitHub Smarty Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:27Z
+ 2023-10-11T01:40:27Z
Daily Trending of Smarty in GitHub
- cockroachdb/molt-helm-charts
- 2023-10-10T01:40:27Z
- tag:github.com,2023-10-10:/cockroachdb/molt-helm-charts
-
- <p>Migrate Off Legacy Things (MOLT) Helm charts</p><hr>
+ saritasa-nest/saritasa-devops-helm-charts
+ 2023-10-11T01:40:27Z
+ tag:github.com,2023-10-11:/saritasa-nest/saritasa-devops-helm-charts
+
+ <p>Various helm charts</p><hr>
\ No newline at end of file
diff --git a/smpl/daily/index.xml b/smpl/daily/index.xml
index b5a9043c121..78f579dc23c 100644
--- a/smpl/daily/index.xml
+++ b/smpl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SmPL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:31Z
+ 2023-10-11T01:40:30Z
Daily Trending of SmPL in GitHub
\ No newline at end of file
diff --git a/smt/daily/index.xml b/smt/daily/index.xml
index 407dee87082..6773e42d8b3 100644
--- a/smt/daily/index.xml
+++ b/smt/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SMT Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:32Z
+ 2023-10-11T01:40:29Z
Daily Trending of SMT in GitHub
\ No newline at end of file
diff --git a/solidity/daily/index.xml b/solidity/daily/index.xml
index d682064f85c..30771177eb8 100644
--- a/solidity/daily/index.xml
+++ b/solidity/daily/index.xml
@@ -1,21 +1,14 @@
GitHub Solidity Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:35Z
+ 2023-10-11T01:40:32Z
Daily Trending of Solidity in GitHub
- chainhackers/ethonline-2023
- 2023-10-10T01:40:35Z
- tag:github.com,2023-10-10:/chainhackers/ethonline-2023
-
- <p></p><hr>
-
-
- yunusdefi/contract
- 2023-10-10T01:40:35Z
- tag:github.com,2023-10-10:/yunusdefi/contract
-
- <p></p><hr>
+ matter-labs/zksync-hardhat-template
+ 2023-10-11T01:40:32Z
+ tag:github.com,2023-10-11:/matter-labs/zksync-hardhat-template
+
+ <p>Template project for zksync-hardhat</p><hr>
\ No newline at end of file
diff --git a/soong/daily/index.xml b/soong/daily/index.xml
index b7a531bb574..5924c9eaec4 100644
--- a/soong/daily/index.xml
+++ b/soong/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Soong Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:36Z
+ 2023-10-11T01:40:34Z
Daily Trending of Soong in GitHub
\ No newline at end of file
diff --git a/sourcepawn/daily/index.xml b/sourcepawn/daily/index.xml
index c1edad69a33..48c44bc7d73 100644
--- a/sourcepawn/daily/index.xml
+++ b/sourcepawn/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SourcePawn Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:37Z
+ 2023-10-11T01:40:35Z
Daily Trending of SourcePawn in GitHub
\ No newline at end of file
diff --git a/sparql/daily/index.xml b/sparql/daily/index.xml
index cfad8c7062b..76e1189f502 100644
--- a/sparql/daily/index.xml
+++ b/sparql/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SPARQL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:38Z
+ 2023-10-11T01:40:34Z
Daily Trending of SPARQL in GitHub
\ No newline at end of file
diff --git a/spline-font-database/daily/index.xml b/spline-font-database/daily/index.xml
index 2f860b3d37b..c5f9b0f410b 100644
--- a/spline-font-database/daily/index.xml
+++ b/spline-font-database/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Spline Font Database Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:39Z
+ 2023-10-11T01:40:36Z
Daily Trending of Spline Font Database in GitHub
\ No newline at end of file
diff --git a/sqf/daily/index.xml b/sqf/daily/index.xml
index f73c1e10d9f..f052d463f2c 100644
--- a/sqf/daily/index.xml
+++ b/sqf/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SQF Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:44Z
+ 2023-10-11T01:40:37Z
Daily Trending of SQF in GitHub
\ No newline at end of file
diff --git a/sql/daily/index.xml b/sql/daily/index.xml
index e06a02bf2e0..7ba236f1270 100644
--- a/sql/daily/index.xml
+++ b/sql/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SQL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:41Z
+ 2023-10-11T01:40:40Z
Daily Trending of SQL in GitHub
\ No newline at end of file
diff --git a/sqlpl/daily/index.xml b/sqlpl/daily/index.xml
index 7d6f13e68fe..73229e359bc 100644
--- a/sqlpl/daily/index.xml
+++ b/sqlpl/daily/index.xml
@@ -1,7 +1,14 @@
GitHub SQLPL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:43Z
+ 2023-10-11T01:40:39Z
Daily Trending of SQLPL in GitHub
+
+ ruchva/code-helpers
+ 2023-10-11T01:40:39Z
+ tag:github.com,2023-10-11:/ruchva/code-helpers
+
+ <p>METODOS, QUERYS, VARIOS SALVAVIDAS</p><hr>
+
\ No newline at end of file
diff --git a/squirrel/daily/index.xml b/squirrel/daily/index.xml
index ca62ac99cf9..7d5462f3ebe 100644
--- a/squirrel/daily/index.xml
+++ b/squirrel/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Squirrel Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:42Z
+ 2023-10-11T01:40:38Z
Daily Trending of Squirrel in GitHub
+
+ matkoniecz/AIAI
+ 2023-10-11T01:40:38Z
+ tag:github.com,2023-10-11:/matkoniecz/AIAI
+
+ <p>OpenTTD AI. Official topic at TTforums - http://www.tt-forums.net/viewtopic.php?f=65&t=47298</p><hr>
+
\ No newline at end of file
diff --git a/srecode-template/daily/index.xml b/srecode-template/daily/index.xml
index 67258c42ce3..f26fbb2ccb1 100644
--- a/srecode-template/daily/index.xml
+++ b/srecode-template/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SRecode Template Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:45Z
+ 2023-10-11T01:40:42Z
Daily Trending of SRecode Template in GitHub
\ No newline at end of file
diff --git a/ssh-config/daily/index.xml b/ssh-config/daily/index.xml
index ea7e6bb3866..72ebf24c842 100644
--- a/ssh-config/daily/index.xml
+++ b/ssh-config/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SSH Config Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:47Z
+ 2023-10-11T01:40:41Z
Daily Trending of SSH Config in GitHub
\ No newline at end of file
diff --git a/stan/daily/index.xml b/stan/daily/index.xml
index 077fb5af7c4..29664b701b5 100644
--- a/stan/daily/index.xml
+++ b/stan/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Stan Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:48Z
+ 2023-10-11T01:40:43Z
Daily Trending of Stan in GitHub
\ No newline at end of file
diff --git a/standard-ml/daily/index.xml b/standard-ml/daily/index.xml
index 30a907b1f8a..88cf08370c3 100644
--- a/standard-ml/daily/index.xml
+++ b/standard-ml/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Standard ML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:46Z
+ 2023-10-11T01:40:44Z
Daily Trending of Standard ML in GitHub
+
+ melsman/mlkit
+ 2023-10-11T01:40:44Z
+ tag:github.com,2023-10-11:/melsman/mlkit
+
+ <p>Standard ML Compiler and Toolkit</p><hr>
+
\ No newline at end of file
diff --git a/starlark/daily/index.xml b/starlark/daily/index.xml
index 1a48cf5a63e..b161b3f1927 100644
--- a/starlark/daily/index.xml
+++ b/starlark/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Starlark Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:52Z
+ 2023-10-11T01:40:50Z
Daily Trending of Starlark in GitHub
\ No newline at end of file
diff --git a/stata/daily/index.xml b/stata/daily/index.xml
index 8fe452b16a8..21e5d1c43d9 100644
--- a/stata/daily/index.xml
+++ b/stata/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Stata Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:49Z
+ 2023-10-11T01:40:47Z
Daily Trending of Stata in GitHub
\ No newline at end of file
diff --git a/ston/daily/index.xml b/ston/daily/index.xml
index a4a413b2abc..242c2e16fbd 100644
--- a/ston/daily/index.xml
+++ b/ston/daily/index.xml
@@ -1,7 +1,7 @@
GitHub STON Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:54Z
+ 2023-10-11T01:40:51Z
Daily Trending of STON in GitHub
\ No newline at end of file
diff --git a/stringtemplate/daily/index.xml b/stringtemplate/daily/index.xml
index 3d1d1fd547a..2ecd10e4a1b 100644
--- a/stringtemplate/daily/index.xml
+++ b/stringtemplate/daily/index.xml
@@ -1,7 +1,7 @@
GitHub StringTemplate Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:55Z
+ 2023-10-11T01:40:52Z
Daily Trending of StringTemplate in GitHub
\ No newline at end of file
diff --git a/stylus/daily/index.xml b/stylus/daily/index.xml
index 236e0d0e93c..460eb62a58b 100644
--- a/stylus/daily/index.xml
+++ b/stylus/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Stylus Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:57Z
+ 2023-10-11T01:40:53Z
Daily Trending of Stylus in GitHub
\ No newline at end of file
diff --git a/subrip-text/daily/index.xml b/subrip-text/daily/index.xml
index 2822b0c341f..ec89118010d 100644
--- a/subrip-text/daily/index.xml
+++ b/subrip-text/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SubRip Text Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:55Z
+ 2023-10-11T01:40:54Z
Daily Trending of SubRip Text in GitHub
\ No newline at end of file
diff --git a/sugarss/daily/index.xml b/sugarss/daily/index.xml
index 46e8b99dcd5..d691ac33db0 100644
--- a/sugarss/daily/index.xml
+++ b/sugarss/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SugarSS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:58Z
+ 2023-10-11T01:40:56Z
Daily Trending of SugarSS in GitHub
\ No newline at end of file
diff --git a/supercollider/daily/index.xml b/supercollider/daily/index.xml
index 408f8252567..660a3a25561 100644
--- a/supercollider/daily/index.xml
+++ b/supercollider/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SuperCollider Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:40:59Z
+ 2023-10-11T01:40:55Z
Daily Trending of SuperCollider in GitHub
\ No newline at end of file
diff --git a/svelte/daily/index.xml b/svelte/daily/index.xml
index a672902ff4d..108e0fc165f 100644
--- a/svelte/daily/index.xml
+++ b/svelte/daily/index.xml
@@ -1,28 +1,28 @@
GitHub Svelte Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:03Z
+ 2023-10-11T01:41:00Z
Daily Trending of Svelte in GitHub
- WardPearce/Purplix.io
- 2023-10-10T01:41:03Z
- tag:github.com,2023-10-10:/WardPearce/Purplix.io
-
- <p>Purplix is an open-source collection of tools dedicated to user privacy and creating trust with your audience.</p><hr>
+ SOH69/mm_radio
+ 2023-10-11T01:41:00Z
+ tag:github.com,2023-10-11:/SOH69/mm_radio
+
+ <p>A Radio Script for Fivem Server</p><hr>
- Mitcheljager/svelte-tiny-slider
- 2023-10-10T01:41:03Z
- tag:github.com,2023-10-10:/Mitcheljager/svelte-tiny-slider
-
- <p>Demo and Docs: https://mitcheljager.github.io/svelte-tiny-slider/</p><hr>
+ yizhe-ang/matrix-explorable
+ 2023-10-11T01:41:00Z
+ tag:github.com,2023-10-11:/yizhe-ang/matrix-explorable
+
+ <p>An Explorable Explanation of Matrices and Linear Transformations</p><hr>
- jamezmca/hughjass
- 2023-10-10T01:41:03Z
- tag:github.com,2023-10-10:/jamezmca/hughjass
-
- <p>SvelteKit & TailwindCSS web portfolio</p><hr>
+ wevisdemo/parliament-watch
+ 2023-10-11T01:41:00Z
+ tag:github.com,2023-10-11:/wevisdemo/parliament-watch
+
+ <p>Citizens are watching 👀</p><hr>
\ No newline at end of file
diff --git a/svg/daily/index.xml b/svg/daily/index.xml
index 883964a4791..aced1572100 100644
--- a/svg/daily/index.xml
+++ b/svg/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SVG Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:03Z
+ 2023-10-11T01:41:00Z
Daily Trending of SVG in GitHub
\ No newline at end of file
diff --git a/swift/daily/index.xml b/swift/daily/index.xml
index 712dafd4730..bc2f472b92f 100644
--- a/swift/daily/index.xml
+++ b/swift/daily/index.xml
@@ -1,21 +1,14 @@
GitHub Swift Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:10Z
+ 2023-10-11T01:41:07Z
Daily Trending of Swift in GitHub
- root3nl/SupportApp
- 2023-10-10T01:41:10Z
- tag:github.com,2023-10-10:/root3nl/SupportApp
-
- <p>The Support App is developed by Root3, specialized in managing Apple devices. Root3 offers consultancy and support for organizations to get the most out of their Apple devices and is based in The Netherlands (Halfweg).</p><hr><h1>macOS Support App</h1>
<p><img src="https://img.shields.io/github/v/release/root3nl/SupportApp?color=success" alt="GitHub release (latest by date)"> <img src="https://img.shields.io/badge/macOS-11%2B-green" alt="Github"> <a href="https://testflight.apple.com/join/asmgJsAM"><img src="https://img.shields.io/badge/Join-TestFlight-blue" alt="Github"></a></p>
<img src="https://raw.githubusercontent.com/root3nl/SupportApp/master/Screenshots/generic_version_2.5.png" width="800">
<img src="https://raw.githubusercontent.com/root3nl/SupportApp/master/Screenshots/generic_version_2.4.png" width="800">
<p><img src="https://raw.githubusercontent.com/root3nl/SupportApp/master/Screenshots/generic_light_mode_cropped.png" height="300"> <img src="https://raw.githubusercontent.com/root3nl/SupportApp/master/Screenshots/generic_version_2.3_small_dark.png" height="300"></p>
<ul>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#introduction">Introduction</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#requirements">Requirements</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#download">Download</a>
<ul>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#testflight">TestFlight</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#technologies">Technologies</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#features">Features</a>
<ul>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#menu-bar-icon">Menu Bar Icon</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#title-and-logo">Title and logo</a>
<ul>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#logo-options">Logo options</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#color">Color</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#diagnostic-information">Diagnostic information</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#app-link-or-command-shortcuts">App, link or command shortcuts</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#footer-text">Footer Text</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#notification-icon">Notification Icon</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#welcome-screen">Welcome Screen</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#software-update-integration">Software Update Integration</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#configuration">Configuration</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#advanced-configuration">Advanced configuration</a>
<ul>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#support-app-extensions">Support App Extensions</a>
<ul>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#how-to-populate-support-app-extensions">How to populate Support App Extensions</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#variables">Variables</a>
<ul>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#built-in-local-variables">Built-in local variables</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#mdm-variables">MDM variables</a>
<ul>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#jamf-pro-variables">Jamf Pro variables</a></li>
</ul> </li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#privileged-commands-or-scripts-with-supporthelper">Privileged commands or scripts with SupportHelper</a>
<ul>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#file-locations">File locations</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#security-considerations">Security Considerations</a></li>
</ul> </li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#how-to-use-sf-symbols">How to use SF Symbols</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#mdm-deployment">MDM deployment</a>
<ul>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#jamf-pro-custom-json-schema">Jamf Pro custom JSON Schema</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#installer-or-app-bundle">Installer or app bundle</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#sample-launchagent">Sample LaunchAgent</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#sample-configuration-profile">Sample Configuration Profile</a></li>
</ul> </li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#logging">Logging</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#known-issues">Known issues</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#changelog">Changelog</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#privacy-policy">Privacy policy</a></li>
<li><a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#note-and-disclaimer">Note and disclaimer</a></li>
</ul>
<h2>Introduction</h2>
<p>The Support app is a macOS menu bar app built for organizations to:</p>
<ul>
<li>Help users and helpdesks to see basic diagnostic information at a glance and proactively notify them to easily fix small issues.</li>
<li>Offer shortcuts to easily access support channels or other company resources such as a website or a file server</li>
<li>Give users a modern and native macOS app with your corporate identity</li>
</ul>
<p>The app is developed by Root3, specialized in managing Apple devices. Root3 offers managed workplaces, consultancy and support for organizations to get the most out of their Apple devices and is based in The Netherlands (Halfweg).</p>
<p>Root3 already had a basic in-house support app written in Objective-C and decided to completely rewrite it in Swift using SwiftUI with an all-new design that looks great on macOS Big Sur. We’ve learned that SwiftUI is the perfect way of creating great looking apps for all Apple platforms with minimal effort. In the development process we decided to make it generic so other organizations can take advantage of it and contribute to the Mac admins community.</p>
<p>The easiest and recommended way to configure the app is using a Configuration Profile and your MDM solution.</p>
<h2>Requirements</h2>
<ul>
<li>macOS 11.0.1 or higher</li>
<li>Any MDM solution supporting custom Configuration Profiles</li>
</ul>
<h2>Download</h2>
<h3>Support App</h3>
<p>Package Installer (includes LaunchAgent): <a href="https://github.com/root3nl/SupportApp/releases/latest"><strong>Download</strong></a></p>
<p>Application (zipped): <a href="https://github.com/root3nl/SupportApp/releases/latest"><strong>Download</strong></a></p>
<p>See the MDM deployment section below for more info.</p>
<h3>SupportHelper</h3>
<p>Package Installer (includes LaunchDaemon): <a href="https://github.com/root3nl/SupportApp/releases/latest"><strong>Download</strong></a></p>
<h3>TestFlight</h3>
<p>You can participate in beta versions of Support App using TestFlight. This requires macOS 12 or higher.</p>
<p><a href="https://testflight.apple.com/join/asmgJsAM"><strong>Join TestFlight</strong></a></p>
<blockquote>
<p><strong>Note</strong> There may not always be a TestFlight version available.</p>
</blockquote>
<h2>Technologies</h2>
<ul>
<li>Written in Swift using SwiftUI</li>
<li>All icons are SF Symbols</li>
<li>Built for and compatible with macOS 11.0 and higher</li>
<li>Native support for Apple Silicon</li>
<li>Dark Mode support</li>
<li>Colors are matched with your macOS accent color (blue by default)</li>
<li>MDM support to configure your own branding such as a custom title, logo, SF Symbols and contact methods</li>
<li>Notarized</li>
<li>Sandboxed</li>
<li>Localized in English, Dutch, French, German and Spanish</li>
</ul>
<h2>Features</h2>
<h3>Menu Bar Icon</h3>
<p>The Menu Bar Icon can be customized to your own image such as a PNG with Alpha Channel, an image from URL or an SF Symbol. Any image will be shown as template to match the rest of the Menu Bar Extras. Icons larger than 22 points will automatically be resized to the recommended 16 points and the aspect ration will be preserved. Optionally a notification badge can overlay the icon to attract the user's attention when an Apple Software Update is available or any other warning was triggered. Please check the preference key <code>StatusBarIconNotifierEnabled</code>.</p>
<blockquote>
<p><strong>Note</strong> When using a local file, make sure to put the image in a folder accessible from the App Sandbox. We recommend a subfolder in <code>/Library/Application Support/</code> such as <code>/Library/Application Support/MyOrganization</code></p>
</blockquote>
<blockquote>
<p><strong>Note</strong> When using an file from URL, the image will be downloaded once when the Support App opens and will be used for subsequent launches of the app, to avoid unnecessary downloads and use cases where the Mac has no internet connection at startup. To use a new icon, the URL must be changed for the Support App to trigger a new download.</p>
</blockquote>
<h3>Title and logo</h3>
<p>The row above the buttons allow a custom title and company logo. The title supports both text and Emoji. On macOS Monterey and higher, it supports Markdown as well. The logo supports a remote URL, an SF Symbol and several local images types like PNG, JPEG and ICNS and will be resized to a maximum height of 48 points. The original aspect ratio will be retained. A PNG with alpha channel is advised to get variable transparency around your logo.</p>
<h4>Logo options</h4>
<p>Here are the available for the Logo:</p>
<ul>
<li><strong>Remote URL</strong> (macOS 12 and later): <code>https://URL_TO_IMAGE</code></li>
<li><strong>SF Symbol</strong> (macOS 12 and later): <code>SF=SF_SYMBOL_NAME_HERE</code> or <code>SF=SF_SYMBOL_NAME_HERE,color=COLOR_OPTION_HERE</code>. Available color options: <code>auto</code>, <code>multicolor</code>, <code>hierarchical</code> or a custom HEX color code such as <code>#9ACEA4</code></li>
<li><strong>Local file</strong>: <code>/PATH_TO_LOCAL_FILE</code></li>
</ul>
<blockquote>
<p><strong>Note</strong> When using a local file, make sure to put the image in a folder accessible from the App Sandbox. We recommend a subfolder in <code>/Library/Application Support/</code> such as <code>/Library/Application Support/MyOrganization</code></p>
</blockquote>
<h3>Color</h3>
<p>All the circles around the symbols have the macOS accent color and will dynamically change with the user's setting in System Preferences --> General. If desired, this color can be customised matching your corporate colors. We recommend keeping the macOS accent color when the color of your choice is too light, as text will be difficult to read.</p>
<h3>Diagnostic information</h3>
<p>There are a couple of info items with diagnostics available to choose from. A total of four items will be displayed in the top four buttons. Available items:</p>
<ul>
<li> <p><strong>Computer Name</strong> (default): The current computer name will be displayed here. Especially helpful when your organisation has a difficult naming convention and users want to do things like AirDrop.</p> </li>
<li> <p><strong>macOS version</strong> (default): The current version of macOS including major, minor and patch version as well as the marketing name. The marketing name will be easier to understand for your end users. A notification badge will be shown when an Apple Software Update is available. Clicking on this item shows more details and allows the user to initiate the update in System Settings.</p> </li>
<li> <p><strong>Last Reboot</strong> (default): The current uptime. When troubleshooting some issue, the first thing you would like to do is a reboot when the uptime is high. The optional preference key <code>UptimeDaysLimit</code> can be used to configure the maximum amount of uptime days recommended by the organization. Exceeding this limit results in a badge counter with exclamation mark in the info item.</p> </li>
<li> <p><strong>Storage Used</strong> (default): The storage percentage used on the boot drive. When hovering with the mouse, the available storage is shown. Clicking on this item opens the macOS built-in Storage Management app. The optional preference key <code>StorageLimit</code> can be used to configure the maximum percentage of used storage recommended by the organization. Exceeding this limit results in a badge counter with exclamation mark in the info item.</p> </li>
<li> <p><strong>Network</strong>: The active network interface type (Wi-Fi or Ethernet) along with the local IPv4 address. The icon indicates the connection type, Wi-Fi or Ethernet. Clicking on this item opens the Network preference pane in System Preferences. On macOS 13 or earlier, the current SSID name is shown. Due to privacy restrictions, macOS 14 and later show "Wi-Fi" instead of the SSID name.</p> </li>
<li> <p><strong>Mac Password</strong>: Shows when the user's password expires and supports both local and Active Directory accounts by default. Alternative supported user sources are Jamf Connect, Kerberos SSO Extension and NoMAD. Shows a warning when the expiry reaches the value set in the optional key <code>PasswordExpiryLimit</code>. The text label in the item can be modified using the preference key <code>PasswordLabel</code>.</p> </li>
<li> <p><strong>Extension A and B</strong>: Support App Extensions to show any information. The title, icon must be configured and optionally a link to open an App, URL, User Command or Privileged Command/Script. The value below the title of the Extension must be populated by setting a preference key using a script or command. Extensions can also trigger an orange notification badge alert in both the Extension and menu bar icon. See <a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#how-to-populate-support-app-extensions">How to populate Support App Extensions</a> for more information.</p> </li>
</ul>
<h3>App, link or command shortcuts</h3>
<p>The buttons in the 3rd and 4th row behave as shortcuts to applications or links. Both rows are flexible and can show two or three buttons. The total amount of configurable buttons is possible: 0, 2, 3, 4, 5, 6. You can configure five variables for every of these buttons:</p>
<ul>
<li> <p><strong>Title</strong>: Button label</p> </li>
<li> <p><strong>Subtitle</strong> (now shown if not configured): An extra string to display when the user hovers over the button</p> </li>
<li> <p><strong>Type</strong>: The link type the button should open. The following action types are available:</p>
<ul>
<li>App</li>
<li>URL</li>
<li>Command</li>
</ul> </li>
<li> <p><strong>Link</strong>: Application, URL or command/script to execute:</p>
<ul>
<li>App: Bundle Identifier of the app</li>
<li>URL: Link to a webpage or other links that would normaly work like PROTOCOL://URL</li>
<li>Command: Zsh command or path to a script. Be aware that this will be executed as the user and therefore has its limitations</li>
<li>DistributedNotification: Zsh command or path to a script to run with elevated privileges (requires SupportHelper)</li>
</ul> </li>
<li> <p><strong>Symbol</strong>: The symbol shown in the button, see the SF Symbols section how to use these symbols</p> </li>
</ul>
<p>The rows with all configurable items enabled are shown in the screenshot below:</p>
<ul>
<li>Info items and Support App Extensions in <strong>GREEN</strong></li>
<li>Buttons in <strong>ORANGE</strong></li>
</ul>
<img src="https://raw.githubusercontent.com/root3nl/SupportApp/master/Screenshots/configurable_buttons_2.4.png" width="450">
<h3>Footer Text</h3>
<p>A footer text can optionally be used to put some additional text at the bottom of the Support App. This supports both text and Emoji. On macOS Monterey and higher, it supports Markdown. Use the preference key <code>FooterText</code> to configure the footer.</p>
<h3>Notification Icon</h3>
<p>The icon shown in alerts and the about window can be modified by using the preference key <code>NotificationIcon</code>.</p>
<p>See an example below:</p>
<img src="https://raw.githubusercontent.com/root3nl/SupportApp/master/Screenshots/custom_alert.png" width="350">
<blockquote>
<p><strong>Note</strong> When using a local file, make sure to put the image in a folder accessible from the App Sandbox. We recommend a subfolder in <code>/Library/Application Support/</code> such as <code>/Library/Application Support/MyOrganization</code></p>
</blockquote>
<blockquote>
<p><strong>Note</strong> When using an file from URL, the image will be downloaded once when the Support App opens and will be used for subsequent launches of the app, to avoid unnecessary downloads and use cases where the Mac has no internet connection at startup. To use a new icon, the URL must be changed for the Support App to trigger a new download.</p>
</blockquote>
<blockquote>
<p><strong>Note</strong> Modifying the app icon when it is not running would compromise the App Sandbox and we decided not to implement this. We suggest hiding the app by running the following command: <code>sudo chflags hidden "/Applications/Support.app"</code></p>
</blockquote>
<h3>Welcome Screen</h3>
<p>An informational window can optionally be shown when the Support App is opened for the first time. It explains the key features to the user before all data is shown. This can be set using the preference key <code>ShowWelcomeScreen</code>.</p>
<p>See an example below:</p>
<img src="https://raw.githubusercontent.com/root3nl/SupportApp/master/Screenshots/welcome_screen.png" width="500">
<h3>Software Update integration</h3>
<p>The Support App shows the current version of macOS and a notification badge if there is an update or upgrade available. Clicking the info item shows a popover with more details like the name of the update(s) available and also allows organizations to add a custom text. This can be used to provide more context and explain the user about the organization's update policy or anything else. The text string supports Markdown to style it further and include links. Please check <a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#built-in-local-variables">Built-in local variables</a> for an example using Markdown and variables.</p>
<p>The popover allows the user to open System Settings and install the update or upgrade. If there is no update or upgrade available, the popover simply shows "Your Mac is up to date".</p>
<img src="https://raw.githubusercontent.com/root3nl/SupportApp/master/Screenshots/software_update_integration.png" width="500">
<blockquote>
<p><strong>Note</strong> When a deferral is set using the preference key <code>forceDelayedMajorSoftwareUpdates</code> in the domain <code>com.apple.applicationaccess</code>, major macOS updates will automatically be hidden indefinitely until the key is removed or set to <code>false</code>. The amount of days configured for the deferral are ignored. Due to limitations and complexity, it is not supported to automatically show the macOS major update once the deferral days are passed. This behaviour replaces the <code>HideMajorUpdates</code> key, previously available in version 2.5 and earlier. More info here: <a href="https://developer.apple.com/documentation/devicemanagement/restrictions">https://developer.apple.com/documentation/devicemanagement/restrictions</a></p>
</blockquote>
<h2>Configuration</h2>
<p>The configuration of the Support app is optimized for use with your MDM solution. The easiest way to configure the app is using a Configuration Profile so you can use whatever MDM solution you like, as long as it supports custom Configuration Profiles.</p>
<p>Some preference keys like the icon and status bar icon point to a file location. Due to the sandboxed characteristic of the app, not all file locations are allowed. We suggest putting the files in a folder within Application Support such as <code>/Library/Application Support/Your Company/</code> where the app can read the contents. Other supported file locations can be found in Apple’s documentation about App Sandbox: <a href="https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW17">https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW17</a></p>
<p><strong>Preference domain</strong>: <code>nl.root3.support</code></p>
<p>Below are all available preference keys:</p>
<h3>General</h3>
<p>All general settings</p>
<table>
<thead>
<tr>
<th>Preference key</th>
<th>Type</th>
<th>Default value</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>Title</td>
<td>String</td>
<td>Support</td>
<td>Text shown in the top left corner when the app opens.</td>
<td>“Your Company Name“, “IT Helpdesk“ etc.</td>
</tr>
<tr>
<td>Logo</td>
<td>String</td>
<td>App Icon</td>
<td>Remote URL, SF Symbol or path to the logo shown in the top right corner when the app opens. Scales to 48 points maximum height. A subfolder in <code>/Library/Application Support/</code> is the recommended location due to sandboxing</td>
<td><code>/Library/Application Support/Your Company/logo.png</code> or <code>https://domain.tld/url_to_image.png</code></td>
</tr>
<tr>
<td>LogoDarkMode</td>
<td>String</td>
<td>App Icon</td>
<td>Remote URL, SF Symbol or path to the logo shown in the top right corner when the app opens for Dark Mode. Scales to 48 points maximum height. A subfolder in <code>/Library/Application Support/</code> is the recommended location due to sandboxing</td>
<td><code>/Library/Application Support/Your Company/logo_darkmode.png</code> or <code>https://domain.tld/url_to_image.png</code></td>
</tr>
<tr>
<td>NotificationIcon</td>
<td>String</td>
<td>App Icon</td>
<td>Remote URL or path to a custom square image to be shown in alerts and the about window.</td>
<td><code>/Library/Application Support/Your Company/logo.png</code> or <code>https://domain.tld/url_to_image.png</code></td>
</tr>
<tr>
<td>StatusBarIcon</td>
<td>String</td>
<td>Root3 Logo</td>
<td>Remote URL or path to the status bar icon shown in the menu bar. Recommended: PNG, 16x16 points. Icons larger than 22 points will automatically be resized to 16 points. A subfolder in <code>/Library/Application Support/</code> is the recommended location due to sandboxing</td>
<td><code>/Library/Application Support/Your Company/statusbaricon.png</code> or <code>https://domain.tld/url_to_image.png</code></td>
</tr>
<tr>
<td>StatusBarIconSFSymbol</td>
<td>String</td>
<td>Root3 Logo</td>
<td>Custom status bar icon using an SF Symbol. Ignored when StatusBarIcon is also set</td>
<td>“lifepreserver”</td>
</tr>
<tr>
<td>StatusBarIconNotifierEnabled</td>
<td>Boolean</td>
<td>false</td>
<td>Shows a small notification badge in the Status Bar Icon when an info items triggers a warning or notification</td>
<td>true</td>
</tr>
<tr>
<td>UpdateText</td>
<td>String</td>
<td>-</td>
<td>The text shown below the software update details popover</td>
<td>"Your organization requires you to update as soon as possible. <a href="https://URL_TO_YOUR_UPDATE_POLICY">More info...</a>"</td>
</tr>
<tr>
<td>CustomColor</td>
<td>String</td>
<td>macOS Accent Color</td>
<td>Custom color for all symbols. Leave empty to use macOS Accent Color. We recommend not to use a very light color as text may become hard to read</td>
<td>HEX color in RGB format like "#8cc63f"</td>
</tr>
<tr>
<td>CustomColorDarkMode</td>
<td>String</td>
<td>macOS Accent Color</td>
<td>Custom color for all symbols in Dark Mode. Leave empty to use macOS Accent Color or CustomColor if specified. We recommend not to use a very dark color as text may become hard to read</td>
<td>HEX color in RGB format like "#8cc63f"</td>
</tr>
<tr>
<td>HideFirstRowInfoItems</td>
<td>Boolean</td>
<td>false</td>
<td>Hides the first row of info items.</td>
<td>true</td>
</tr>
<tr>
<td>HideSecondRowInfoItems</td>
<td>Boolean</td>
<td>false</td>
<td>Hides the second row of info items.</td>
<td>true</td>
</tr>
<tr>
<td>HideThirdRowInfoItems</td>
<td>Boolean</td>
<td>false</td>
<td>Hides the third row of info items.</td>
<td>true</td>
</tr>
<tr>
<td>HideFirstRowButtons</td>
<td>Boolean</td>
<td>false</td>
<td>Hides the first row of configurable items.</td>
<td>true</td>
</tr>
<tr>
<td>HideSecondRowButtons</td>
<td>Boolean</td>
<td>false</td>
<td>Hides the second row of configurable items.</td>
<td>true</td>
</tr>
<tr>
<td>ErrorMessage</td>
<td>String</td>
<td>Please contact IT support</td>
<td>Shown when clicking an action results in an error</td>
<td>"Please contact the servicedesk", "Please contact COMPANY_NAME"</td>
</tr>
<tr>
<td>ShowWelcomeScreen</td>
<td>Boolean</td>
<td>false</td>
<td>Shows the welcome screen when the Support App is opened for the first time.</td>
<td>true</td>
</tr>
<tr>
<td>FooterText</td>
<td>String</td>
<td>-</td>
<td>Text shown at the bottom as footnote</td>
<td>"Provided by your <strong>IT department</strong> with ❤️"</td>
</tr>
<tr>
<td>OpenAtLogin</td>
<td>Boolean</td>
<td>false</td>
<td>Launch Support (non-PKG) automatically at login and keep it open (macOS 13 and higher). This setting is ignored if a legacy LaunchAgent is installed/active. Keep disabled if you don't want to open Support at login or use your own LaunchAgent</td>
<td>false</td>
</tr>
</tbody>
</table>
<h3>Info items</h3>
<p>Configuration of the top four items with diagnostic information.</p>
<table>
<thead>
<tr>
<th>Preference key</th>
<th>Type</th>
<th>Default value</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>InfoItemOne</td>
<td>String</td>
<td>ComputerName</td>
<td>Info item shown in the upper left corner</td>
<td>"ComputerName", "MacOSVersion", "Network", "Password", "Storage", "Uptime", "ExtensionA" or "ExtensionB"</td>
</tr>
<tr>
<td>InfoItemTwo</td>
<td>String</td>
<td>MacOSVersion</td>
<td>Info item shown in the upper right corner</td>
<td>"ComputerName", "MacOSVersion", "Network", "Password", "Storage", "Uptime", "ExtensionA" or "ExtensionB"</td>
</tr>
<tr>
<td>InfoItemThree</td>
<td>String</td>
<td>Uptime</td>
<td>Info item shown in the second row left</td>
<td>"ComputerName", "MacOSVersion", "Network", "Password", "Storage", "Uptime", "ExtensionA" or "ExtensionB"</td>
</tr>
<tr>
<td>InfoItemFour</td>
<td>String</td>
<td>Storage</td>
<td>Info item shown in the second row right</td>
<td>"ComputerName", "MacOSVersion", "Network", "Password", "Storage", "Uptime", "ExtensionA" or "ExtensionB"</td>
</tr>
<tr>
<td>InfoItemFive</td>
<td>String</td>
<td>-</td>
<td>Info item shown in the third row left</td>
<td>"ComputerName", "MacOSVersion", "Network", "Password", "Storage", "Uptime", "ExtensionA" or "ExtensionB"</td>
</tr>
<tr>
<td>InfoItemSix</td>
<td>String</td>
<td>-</td>
<td>Info item shown in the third row right</td>
<td>"ComputerName", "MacOSVersion", "Network", "Password", "Storage", "Uptime", "ExtensionA" or "ExtensionB"</td>
</tr>
<tr>
<td>UptimeDaysLimit</td>
<td>Integer</td>
<td>0 (Disabled)</td>
<td>Days of uptime after which a notification badge is shown, disabled by default</td>
<td>7</td>
</tr>
<tr>
<td>PasswordType</td>
<td>String</td>
<td>Apple</td>
<td>The account type to use with the Password info item: local user account (Apple), Jamf Connect, Kerberos SSO Extension or NoMAD</td>
<td>"Apple", "JamfConnect", "KerberosSSO" or "Nomad"</td>
</tr>
<tr>
<td>PasswordExpiryLimit</td>
<td>Integer</td>
<td>0 (Disabled)</td>
<td>Days until password expiry after which a notification badge is shown, disabled by default</td>
<td>14</td>
</tr>
<tr>
<td>PasswordLabel</td>
<td>String</td>
<td>Mac Password</td>
<td>Alternative text label shown in the Password info item</td>
<td>"AD Password", "Company Password"</td>
</tr>
<tr>
<td>StorageLimit</td>
<td>Integer</td>
<td>0 (Disabled)</td>
<td>Percentage of storage used after which a notification badge is shown, disabled by default</td>
<td>80</td>
</tr>
</tbody>
</table>
<h3>First row of configurable items: Item left</h3>
<table>
<thead>
<tr>
<th>Preference key</th>
<th>Type</th>
<th>Default value</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>FirstRowTitleLeft</td>
<td>String</td>
<td>Remote Support</td>
<td>The text shown in the button label.</td>
<td>“Share My Screen”, “TeamViewer“, “Software Updates“ “My core application” etc.</td>
</tr>
<tr>
<td>FirstRowSubtitleLeft</td>
<td>String</td>
<td>-</td>
<td>Subtitle text will appear under title when the user hovers over the button. Ignored if left empty.</td>
<td>“Click to open“, “Share your screen“</td>
</tr>
<tr>
<td>FirstRowTypeLeft</td>
<td>String</td>
<td>App</td>
<td>Type of link the item should open. Can be anything like screen sharing tools, company stores, file servers or core applications in your organization.</td>
<td><strong>App</strong>, <strong>URL</strong>, <strong>Command</strong> or <strong>DistributedNotification</strong> (Privileged command/script)</td>
</tr>
<tr>
<td>FirstRowLinkLeft</td>
<td>String</td>
<td>com.apple.ScreenSharing</td>
<td>The Bundle Identifier of the App, URL or command to open.</td>
<td>“com.teamviewer.TeamViewerQS“ (App), “x-apple.systempreferences:com.apple.preferences.softwareupdate“ (URL)</td>
</tr>
<tr>
<td>FirstRowSymbolLeft</td>
<td>String</td>
<td>cursorarrow</td>
<td>The SF Symbol shown in the button.</td>
<td>“binoculars.fill”, “cursorarrow.click.2” or any other SF Symbol. Please check the SF Symbols section.</td>
</tr>
</tbody>
</table>
<h3>First row of configurable items: Item middle</h3>
<table>
<thead>
<tr>
<th>Preference key</th>
<th>Type</th>
<th>Default value</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>FirstRowTitleMiddle</td>
<td>String</td>
<td>-</td>
<td>The text shown in the button label.</td>
<td>“Self Service“, “App Store“</td>
</tr>
<tr>
<td>FirstRowSubtitleMiddle</td>
<td>String</td>
<td>-</td>
<td>Subtitle text will appear under title when the user hovers over the button. Ignored if left empty.</td>
<td>“Click to open”, “Download apps“</td>
</tr>
<tr>
<td>FirstRowTypeMiddle</td>
<td>String</td>
<td>URL</td>
<td>Type of link the item should open. Can be anything like screen sharing tools, company stores, file servers or core applications in your organization.</td>
<td><strong>App</strong>, <strong>URL</strong>, <strong>Command</strong> or <strong>DistributedNotification</strong> (Privileged command/script)</td>
</tr>
<tr>
<td>FirstRowLinkMiddle</td>
<td>String</td>
<td>-</td>
<td>The Bundle Identifier of the App, URL or command to open.</td>
<td>“com.jamfsoftware.selfservice.mac”</td>
</tr>
<tr>
<td>FirstRowSymbolMiddle</td>
<td>String</td>
<td>-</td>
<td>The SF Symbol shown in the button.</td>
<td>“briefcase.fill”, “bag.circle”, “giftcard.fill”, “gift.circle” or any other SF Symbol. Please check the SF Symbols section.</td>
</tr>
</tbody>
</table>
<h3>First row of configurable items: Item right</h3>
<table>
<thead>
<tr>
<th>Preference key</th>
<th>Type</th>
<th>Default value</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>FirstRowTitleRight</td>
<td>String</td>
<td>Company Store</td>
<td>The text shown in the button label.</td>
<td>“Self Service“, “App Store“</td>
</tr>
<tr>
<td>FirstRowSubtitleRight</td>
<td>String</td>
<td>-</td>
<td>Subtitle text will appear under title when the user hovers over the button. Ignored if left empty.</td>
<td>“Click to open”, “Download apps“</td>
</tr>
<tr>
<td>FirstRowTypeRight</td>
<td>String</td>
<td>App</td>
<td>Type of link the item should open. Can be anything like screen sharing tools, company stores, file servers or core applications in your organization.</td>
<td><strong>App</strong>, <strong>URL</strong>, <strong>Command</strong> or <strong>DistributedNotification</strong> (Privileged command/script)</td>
</tr>
<tr>
<td>FirstRowLinkRight</td>
<td>String</td>
<td>com.apple.AppStore</td>
<td>The Bundle Identifier of the App, URL or command to open.</td>
<td>“com.jamfsoftware.selfservice.mac”</td>
</tr>
<tr>
<td>FirstRowSymbolRight</td>
<td>String</td>
<td>cart.fill</td>
<td>The SF Symbol shown in the button.</td>
<td>“briefcase.fill”, “bag.circle”, “giftcard.fill”, “gift.circle” or any other SF Symbol. Please check the SF Symbols section.</td>
</tr>
</tbody>
</table>
<h3>Second row of configurable items: Item left</h3>
<table>
<thead>
<tr>
<th>Preference key</th>
<th>Type</th>
<th>Default value</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>SecondRowTitleLeft</td>
<td>String</td>
<td>Support Ticket</td>
<td>The text shown in the button label.</td>
<td>“Create ticket”, “Open incident“</td>
</tr>
<tr>
<td>SecondRowSubtitleLeft</td>
<td>String</td>
<td>-</td>
<td>Subtitle text will replace the title when the user hovers over the button. Ignored if left empty.</td>
<td>“support.company.tld”, “Now”, “Create“</td>
</tr>
<tr>
<td>SecondRowTypeLeft</td>
<td>String</td>
<td>URL</td>
<td>Type of link the item should open. Can be anything like screen sharing tools, company stores, file servers or core applications in your organization.</td>
<td><strong>App</strong>, <strong>URL</strong>, <strong>Command</strong> or <strong>DistributedNotification</strong> (Privileged command/script)</td>
</tr>
<tr>
<td>SecondRowLinkLeft</td>
<td>String</td>
<td><a href="https://yourticketsystem.tld">https://yourticketsystem.tld</a></td>
<td>The Bundle Identifier of the App, URL or command to open.</td>
<td>“<a href="https://yourticketsystem.tld%E2%80%9D">https://yourticketsystem.tld”</a>, “mailto:<a href="mailto:support@company.tld">support@company.tld</a>”, “tel:+31000000000” or “smb://yourfileserver.tld”</td>
</tr>
<tr>
<td>SecondRowSymbolLeft</td>
<td>String</td>
<td>ticket</td>
<td>The SF Symbol shown in the button.</td>
<td>“lifepreserver”, “person.fill.questionmark” or any other SF Symbol. Please check the SF Symbols section.</td>
</tr>
</tbody>
</table>
<h3>Second row of configurable items: Item middle</h3>
<table>
<thead>
<tr>
<th>Preference key</th>
<th>Type</th>
<th>Default value</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>SecondRowTitleMiddle</td>
<td>String</td>
<td>-</td>
<td>The text shown in the button label.</td>
<td>“Send email”</td>
</tr>
<tr>
<td>SecondRowSubtitleMiddle</td>
<td>String</td>
<td>-</td>
<td>Subtitle text will replace the title when the user hovers over the button. Ignored if left empty.</td>
<td>“<a href="mailto:support@company.tld">support@company.tld</a>”, “Now”</td>
</tr>
<tr>
<td>SecondRowTypeMiddle</td>
<td>String</td>
<td>URL</td>
<td>Type of link the item should open. Can be anything like screen sharing tools, company stores, file servers or core applications in your organization.</td>
<td><strong>App</strong>, <strong>URL</strong>, <strong>Command</strong> or <strong>DistributedNotification</strong> (Privileged command/script)</td>
</tr>
<tr>
<td>SecondRowLinkMiddle</td>
<td>String</td>
<td>-</td>
<td>The Bundle Identifier of the App, URL or command to open.</td>
<td>“<a href="https://yourticketsystem.tld%E2%80%9D">https://yourticketsystem.tld”</a>, “mailto:<a href="mailto:support@company.tld">support@company.tld</a>”, “tel:+31000000000” or “smb://yourfileserver.tld”</td>
</tr>
<tr>
<td>SecondRowSymbolMiddle</td>
<td>String</td>
<td>-</td>
<td>The SF Symbol shown in the button.</td>
<td>“paperplane”, “arrowshape.turn.up.right.fill” or any other SF Symbol. Please check the SF Symbols section.</td>
</tr>
</tbody>
</table>
<h3>Second row of configurable items: Item right</h3>
<table>
<thead>
<tr>
<th>Preference key</th>
<th>Type</th>
<th>Default value</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>SecondRowTitleRight</td>
<td>String</td>
<td>Phone</td>
<td>The text shown in the button label.</td>
<td>“Call Helpdesk“, “Phone“</td>
</tr>
<tr>
<td>SecondRowSubtitleRight</td>
<td>String</td>
<td>-</td>
<td>Subtitle text will replace the title when the user hovers over the button. Ignored if left empty.</td>
<td>“+31 00 000 00 00”, “Now”, “Call“</td>
</tr>
<tr>
<td>SecondRowTypeRight</td>
<td>String</td>
<td>URL</td>
<td>Type of link the item should open. Can be anything like screen sharing tools, company stores, file servers or core applications in your organization.</td>
<td><strong>App</strong>, <strong>URL</strong>, <strong>Command</strong> or <strong>DistributedNotification</strong> (Privileged command/script)</td>
</tr>
<tr>
<td>SecondRowLinkRight</td>
<td>String</td>
<td>tel:+31000000000</td>
<td>The Bundle Identifier of the App, URL or command to open.</td>
<td>“<a href="https://yourticketsystem.tld%E2%80%9D">https://yourticketsystem.tld”</a>, “mailto:<a href="mailto:support@company.tld">support@company.tld</a>”, “tel:+31000000000” or “smb://yourfileserver.tld”</td>
</tr>
<tr>
<td>SecondRowSymbolRight</td>
<td>String</td>
<td>phone</td>
<td>The SF Symbol shown in the button.</td>
<td>“iphone.homebutton”, “megaphone” or any other SF Symbol. Please check the SF Symbols section.</td>
</tr>
</tbody>
</table>
<h2>Advanced configuration</h2>
<h3>Support App Extensions</h3>
<p>Support App Extensions enable administrators to create custom info items and populate those with output from scripts or commands. You can use your MDM solution to run scripts or commands to populate the Support App Extensions. Optionally we provide SupportHelper to run scripts or commands everytime the Support App popover appears to make sure data is up to date. Please read <a href="https://raw.githubusercontent.com/root3nl/SupportApp/master/#privileged-commands-or-scripts-supporthelper">Privileged commands or scripts (SupportHelper)</a> down below for more info.</p>
<p>Below are the preference keys to enable Support App Extensions:</p>
<table>
<thead>
<tr>
<th>Preference key</th>
<th>Type</th>
<th>Default value</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>ExtensionTitleA</td>
<td>String</td>
<td>-</td>
<td>The title shown in the extension.</td>
<td>"Last Check-In", "Compliance"</td>
</tr>
<tr>
<td>ExtensionSymbolA</td>
<td>String</td>
<td>-</td>
<td>The SF Symbol shown in the extension.</td>
<td>"clock.badge.checkmark.fill",</td>
</tr>
<tr>
<td>ExtensionTypeA</td>
<td>String</td>
<td>App</td>
<td>Type of link the item should open. Can be anything like screen sharing tools, company stores, file servers or core applications in your organization.</td>
<td><strong>App</strong>, <strong>URL</strong>, <strong>Command</strong> or <strong>DistributedNotification</strong> (Privileged command/script)</td>
</tr>
<tr>
<td>ExtensionLinkA</td>
<td>String</td>
<td>-</td>
<td>The Bundle Identifier of the App, URL or command to open.</td>
<td><code>defaults write /Library/Preferences/nl.root3.support.plist ExtensionLoadingA -bool true; /usr/local/bin/jamf policy; </code><a href="https://github.com/root3nl/SupportApp/raw/master/Extension%20Sample%20Scripts/jamf_last_check-in_time.zsh"><code>/usr/local/bin/jamf_last_check-in_time.zsh</code></a> or any other action you prefer by clicking on the Extension</td>
</tr>
<tr>
<td>ExtensionTitleB</td>
<td>String</td>
<td>-</td>
<td>The title shown in the extension.</td>
<td>"Account Privileges"</td>
</tr>
<tr>
<td>ExtensionSymbolB</td>
<td>String</td>
<td>-</td>
<td>The SF Symbol shown in the extension.</td>
<td>"wallet.pass.fill"</td>
</tr>
<tr>
<td>ExtensionTypeB</td>
<td>String</td>
<td>App</td>
<td>Type of link the item should open. Can be anything like screen sharing tools, company stores, file servers or core applications in your organization.</td>
<td><strong>App</strong>, <strong>URL</strong>, <strong>Command</strong> or <strong>DistributedNotification</strong> (Privileged command/script)</td>
</tr>
<tr>
<td>ExtensionLinkB</td>
<td>String</td>
<td>-</td>
<td>The Bundle Identifier of the App, URL or command to open.</td>
<td><a href="https://github.com/root3nl/SupportApp/raw/master/Extension%20Sample%20Scripts/sap_privileges_change_permissions.zsh"><code>/usr/local/bin/sap_privileges_change_permissions.zsh</code></a> or any other action you prefer by clicking on the Extension</td>
</tr>
<tr>
<td>OnAppearAction</td>
<td>String</td>
<td>-</td>
<td>Path to script script or command to be executed when the Support App is opened by clicking on the menu bar item. The SupportHelper is required for this feature.</td>
<td><code>/usr/local/bin/runs_when_support_appears.zsh</code> such as <a href="https://github.com/root3nl/SupportApp/raw/master/Extension%20Sample%20Scripts/user_permissions.zsh"><code>/usr/local/bin/user_permissions.zsh</code></a> or <a href="https://github.com/root3nl/SupportApp/raw/master/Extension%20Sample%20Scripts/jamf_last_check-in_time.zsh"><code>/usr/local/bin/jamf_last_check-in_time.zsh</code></a> or <a href="https://github.com/root3nl/SupportApp/raw/master/Extension%20Sample%20Scripts/mscp_compliance_status.sh"><code>/usr/local/bin/mscp_compliance_status.sh</code></a></td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>Warning</strong> Both Support App Extensions have other preference keys <code>ExtensionValueA</code> and <code>ExtensionValueB</code> but those keys are meant to be dynamically set and changed by a script or command, not by MDM. Once set, the default placeholder will disappear and show the output from the preference keys.</p>
</blockquote>
<h4>How to populate Support App Extensions</h4>
<p>Support App Extensions must be populated by setting the value in a preference key within the preference domain <code>nl.root3.support</code>. This can be achieved by running custom scripts from your MDM solution or using the <code>OnAppearAction</code> combined with SupportHelper. This last option will allow you to update the Support App Extension values every time the Support App popover appears by running the script.</p>
<ul>
<li>Create a custom script and populate the desired value by running the following command: <code>sudo defaults write /Library/Preferences/nl.root3.support.plist ExtensionValueA -string "OUTPUT_VALUE_HERE"</code></li>
<li>Add the following command to show a placeholder while getting the value: <code>sudo defaults write /Library/Preferences/nl.root3.support.plist ExtensionValueA -string "KeyPlaceholder"</code></li>
<li>Add the following command at the <strong>beginning of the script</strong> to show a spinning indicator while getting the value: <code>sudo defaults write /Library/Preferences/nl.root3.support.plist ExtensionLoadingA -bool true</code></li>
<li>Add the following command at the <strong>end of the script</strong> to stop the spinning indicator view: <code>sudo defaults write /Library/Preferences/nl.root3.support.plist ExtensionLoadingA -bool false</code></li>
</ul>
<p>Below a simple example script including loading effect and placeholder while loading</p>
<pre><code>#!/bin/zsh
# Start spinning indicator
defaults write /Library/Preferences/nl.root3.support.plist ExtensionLoadingA -bool true
# Show placeholder value while loading
defaults write /Library/Preferences/nl.root3.support.plist ExtensionValueA -string "KeyPlaceholder"
# Keep loading effect active for 0.5 seconds
sleep 0.5
# Get output value
command_output=$(PUT_COMMAND_TO_GET_OUTPUT_HERE)
# Set output value
defaults write /Library/Preferences/nl.root3.support.plist ExtensionValueA -string "${command_output}"
# Trigger an orange warning notification badge depending on the output you decide
if [[ "${command_output}" == "OUTPUT_IS_BAD" ]]; then
defaults write /Library/Preferences/nl.root3.support.plist ExtensionAlertA -bool true
else
defaults write /Library/Preferences/nl.root3.support.plist ExtensionAlertA -bool false
fi
# Stop spinning indicator
defaults write /Library/Preferences/nl.root3.support.plist ExtensionLoadingA -bool false
</code></pre>
<blockquote>
<p><strong>Note</strong> When using more than one Support App Extension combined with <code>OnAppearAction</code>, it's best to update the values in one script instead of chaining multiple scripts to have the best experience</p>
</blockquote>
<blockquote>
<p><strong>Note</strong> Please do not forget to make the script executable: <code>sudo chmod +x /PATH/TO/SCRIPT</code></p>
</blockquote>
<h3>Privileged commands or scripts with SupportHelper</h3>
<p>To allow commands or scripts to be executed with root privileges, the SupportHelper is available optionally. This utility is built on Distributed Notifications to allow inter-app communication between the Support App and the SupportHelper. The Support App notifies SupportHelper and the message contains the preference key set in the Configuration Profile with the command or path to the script. SupportHelper listens for new messages using a LaunchDaemon and executes the command or script by requesting the command or path to the script from the Configuration Profile.</p>
<p>Below an example to force a MDM check-in using SupportHelper and a custom script:</p>
<img src="https://raw.githubusercontent.com/root3nl/SupportApp/master/Screenshots/generic_version_2.4_beta.gif" width="800">
<p>More information about Distributed Notifications: <a href="https://developer.apple.com/documentation/foundation/distributednotificationcenter">https://developer.apple.com/documentation/foundation/distributednotificationcenter</a></p>
<h4>Use Cases</h4>
<p>There are a couple of use cases SupportHelper can help with. For example run a command or script with root privileges:</p>
<ul>
<li>Every time the Support App popover appears, populate Support App Extensions using <code>OnAppearAction</code></li>
<li>Extension Attributes (Jamf Pro) by adding the commands to populate the Support App Extension to the EA:
<ul>
<li>Show device compliance information, such as the macOS Security Compliance Project Failed Results Count</li>
</ul> </li>
<li>Executing a background task by clicking on a configurable button. Some examples:
<ul>
<li>Request an MDM check-in or inventory depending on your MDM solution</li>
<li>Requesting temporary admin permissions (for example in conjuntion with SAP Privileges)</li>
<li>Collecting logs such as <code>sudo sysdiagnose</code> and sending the output somewhere else</li>
<li>Run device compliance remediation, such as the macOS Security Compliance Project Remediation Script</li>
<li>Any other action requiring root privileges, especially when users have standard permissions</li>
</ul> </li>
</ul>
<h4>File locations</h4>
<p>The SupportHelper installer places two files:</p>
<p>LaunchDaemon: <code>/Library/LaunchDaemons/nl.root3.support.helper.plist</code></p>
<p>Binary: <code>/usr/local/bin/SupportHelper</code></p>
<h4>Security considerations</h4>
<p>As SupportHelper is able to execute scripts or commands with root privileges, it needs to be used responsibly. For most deployments, SupportHelper will not be needed and we recommend deploying the Support App without SupportHelper. If you're unsure or unfamiliar with this concept, DO NOT use SupportHelper. This utility is separated from the Support App to avoid compromising the app-sandbox as well.</p>
<blockquote>
<p><strong>Note</strong> Only values from a Configuration Profile will be used. Values set by <code>defaults write</code> will be ignored as it imposes a security risk.</p>
</blockquote>
<h3>Variables</h3>
<p>You can use variables to dynamically populate text fields, like the title, footer, buttons or any other text field. You have the option to use Local Variables built-in the Support App and are MDM agnostic, or use MDM specific variables if available in your MDM solution.</p>
<blockquote>
<p><strong>Note</strong> Using Built-in Local Variables or MDM variables depends on the use case you want to achieve or the available variables and you may use both if needed.</p>
</blockquote>
<h4>Built-in local variables</h4>
<p>The Support App supports local variables with device and user details and work independently from your MDM solution.</p>
<p>The following built-in local variables are available with an example:</p>
<ul>
<li><strong>$LocalComputerName</strong>: the current computer name/hostname</li>
<li><strong>$LocalModelName</strong>: the model name, like MacBook Air (M2, 2022). Apple Silicon only</li>
<li><strong>$LocalModelShortName</strong>: the short model name like MacBook or iMac</li>
<li><strong>$LocalFullName</strong>: the full name of the local macOS user account</li>
<li><strong>$LocalUserName</strong>: the username of the local macOS user account</li>
<li><strong>$LocalMacosVersion</strong>: the macOS version, like 13.4.1</li>
<li><strong>$LocalMacosVersionName</strong>: the macOS version marketing name, like Ventura or Sonoma</li>
<li><strong>$LocalSerialNumber</strong>: the devices serial number</li>
<li><strong>$LocalIpAddress</strong>: the current IP address</li>
<li><strong>$LocalUpdatesAvailable</strong>: the number of updates available</li>
</ul>
<p>Examples</p>
<ul>
<li>Set <code>title</code> to: "Hi $LocalFullName!"</li>
<li>Set <code>FooterText</code> to: "Provided by IT with ❤️\nSerial Number: $LocalSerialNumber"</li>
<li>Set <code>UpdateText</code> including Markdown features to: "Your $LocalModelShortName has **$LocalUpdatesAvailable update(s)** available. Please update as soon as possible.\n[More info](<a href="https://LINK-TO-UPDATE-POLICY">https://LINK-TO-UPDATE-POLICY</a>)"</li>
</ul>
<blockquote>
<p><strong>Note</strong> Built-in local variables are case <strong>sensitive</strong></p>
</blockquote>
<h4>MDM variables</h4>
<h5>Jamf Pro variables</h5>
<p>When using Jamf Pro as the MDM solution, variables from Jamf Pro can also be used in the Configuration Profile values to dynamically populate text fields.</p>
<p>Example</p>
<ul>
<li>Set <code>title</code> to "Hi $FULLNAME!"</li>
</ul>
<p>More information about Jamf variables: <a href="https://learn.jamf.com/bundle/jamf-pro-documentation-current/page/Computer_Configuration_Profiles.html">https://learn.jamf.com/bundle/jamf-pro-documentation-current/page/Computer_Configuration_Profiles.html</a></p>
<h2>How to use SF Symbols</h2>
<p>We choose to go all the way with SF Symbols as these good looking icons are designed by Apple and give the app a native look and feel. All icons have a symbol name which you can use in the Configuration Profile. As these icons are built into macOS, it automatically shows the correct icon.</p>
<ul>
<li>Download SF Symbols <a href="https://developer.apple.com/sf-symbols/"><strong>here</strong></a></li>
<li>Select the icon you’d like to use</li>
<li>Copy the symbol name and paste into your Configuration Profile</li>
</ul>
<img src="https://raw.githubusercontent.com/root3nl/SupportApp/master/Screenshots/how_to_use_sf_symbols.png" width="800">
<h2>MDM deployment</h2>
<p>It is recommended to deploy the Configuration Profile first before installing the Support app.</p>
<h3>Jamf Pro custom JSON schema</h3>
<p>A JSON Schema for Jamf Pro is provided for easy configuration of all the preference keys without creating/modifying a custom Configuration Profile in XML format. Download the JSON file <a href="https://github.com/root3nl/SupportApp/raw/master/Jamf%20Pro%20Custom%20Schema/Jamf%20Pro%20Custom%20Schema.json"><strong>here</strong></a></p>
<p>More information about the JSON Schema feature in Jamf Pro: <a href="https://docs.jamf.com/technical-papers/jamf-pro/json-schema/10.19.0/Overview.html">https://docs.jamf.com/technical-papers/jamf-pro/json-schema/10.19.0/Overview.html</a></p>
<img src="https://raw.githubusercontent.com/root3nl/SupportApp/master/Screenshots/jamf_pro_custom_schema.png" width="800">
<h3>Installer or app bundle</h3>
<p>Depending on your preference or MDM solution you can use either the installer or zipped app bundle. The installer includes a LaunchAgent and is the recommended method to make sure the app stays open and relaunches automatically.</p>
<h3>Sample LaunchAgent</h3>
<p>A sample LaunchAgent to always keep the app alive is provided <a href="https://github.com/root3nl/SupportApp/raw/master/LaunchAgent%20Sample/nl.root3.support.plist"><strong>here</strong></a></p>
<h3>Sample Configuration Profile</h3>
<p>A sample Configuration Profile you can edit to your preferences is provided <a href="https://github.com/root3nl/SupportApp/raw/master/Configuration%20Profile%20Samples/Support%20App%20Configuration%20Sample.mobileconfig"><strong>here</strong></a></p>
<h4>Background Item Management</h4>
<p>A sample Configuration Profile is provided (both signed and unsigned) for macOS 13 and higher to avoid users from disabling the LaunchAgent in System Settings > General > Login Items. The profile uses the Root3 Team ID to only allow signed software from Root3. <a href="https://github.com/root3nl/SupportApp/raw/master/Configuration%20Profile%20Samples/Background%20Item%20Management"><strong>Samples</strong></a></p>
<h2>Logging</h2>
<p>Logs can be viewed from Console or Terminal by filtering the subsystems <code>nl.root3.support</code> (Support App) and <code>nl.root3.support.helper</code> (SupportHelper).</p>
<p>An example to stream current logs in Terminal for troubleshooting:</p>
<pre><code>log stream --debug --info --predicate 'subsystem contains "nl.root3.support"'
</code></pre>
<h2>Known issues</h2>
<ul>
<li>All available software updates (minor and major) are shown in the menu bar icon and the macOS version info item, even when the update is deferred using a Restrictions Configuration Profile from MDM. macOS collects all available updates in <code>/Library/Preferences/com.apple.SoftwareUpdate.plist</code> regardless of any deferral configurations. Only major OS updates can be hidden using the <code>HideMajorUpdates</code> key for macOS 12.3 and later.</li>
<li>Buttons may keep a hovered state when mouse cursor moves fast: FB8212902 (<strong>resolved in macOS Monterey</strong>)</li>
<li>When Jamf Connect is used as password type, clicking "Change Now" does not allow the user to open the Jamf Connect change password window, but instead triggers an alert. Jamf Connect does not support a URL Scheme for opening the Change Password window. Please upvote this feature request: <a href="https://ideas.jamf.com/ideas/JN-I-16087">https://ideas.jamf.com/ideas/JN-I-16087</a></li>
</ul>
<h2>Changelog</h2>
<p><strong>Version 2.4</strong></p>
<ul>
<li>Support App Extensions: introducing a new way to make your own custom info items and provide relevant information to your end users and create actions. Extensions can show anything you want and can be populated using scripts or commands, for example using your MDM solution. There is support for two Extensions to use in the info item rows.</li>
<li>SupportHelper (separately available): there is now support for privileged scripts and commands to run directly from a button in the Support App while preserving the App Sandbox. An optional utility called SupportHelper will be required and handles the execution on behalf of the Support App. This is built on the Distributed Notifications framework to allow inter-app communication. SupportHelper is a separate installer and is not included in the standard Support App installer.</li>
<li>Optional info items row: an extra row with info items or Extensions can now be enabled. When enabling this third row, it will show the Password and Network info items by default. The row can show any info item or Extension.</li>
<li>New password sources: the Password info item can now be configured to show password expiry information from Jamf Connect, Apple’s Kerberos SSO Extension or NoMAD. Set preference key "PasswordType" to "JamfConnect", "KerberosSSO" or "Nomad".</li>
<li>The title text now supports markdown just like the footer text.</li>
<li>Items no longer show a hover effect when no link is configured, allowing buttons to be static without a clickable action. This applies to both configurable buttons and Extensions</li>
</ul>
<p><strong>Version 2.3</strong></p>
<ul>
<li>Welcome Screen: an informational window can now optionally be shown when the Support App is opened for the first time. It explains the key features to the user.</li>
<li>Preference key ‘StorageLimit’ added to configure the maximum percentage of used storage recommended by the organization. When the limit is reached, a badge counter with exclamation mark will be shown in the Storage tile. Also a little orange notification badge can overlay the menu bar icon when the preference key ‘StatusBarIconNotifierEnabled’ is set to ‘true’.</li>
<li>The Network info item now shows either the current SSID or Ethernet as the title instead of ‘IP Address’.</li>
<li>Preference key ‘NotificationIcon’ added to configure a custom square image to be shown in alerts and the about window.</li>
<li>The notification badge in the StatusBarItem can now show either orange or red, depending on the current state. An available software update will overrule orange warnings and will show a red notification badge.</li>
<li>A footer option is added to put some additional text at the bottom of the Support App. This supports both text and Emoji. On macOS Monterey and higher, it supports Markdown.</li>
<li>French localization is added</li>
<li>macOS Monterey compatibility</li>
<li>Bug fixes and improvements</li>
</ul>
<p><strong>Version 2.2</strong></p>
<ul>
<li>Modulair info items: you can now configure any of the top four info items to any of the six available options:
<ul>
<li>IP Address (NEW)</li>
<li>Mac Password(NEW)</li>
<li>Computer Name</li>
<li>macOS Version</li>
<li>Last Reboot</li>
<li>Storage</li>
</ul> </li>
<li>IP Address is added as a configurable info item. It shows the current IPv4 address. The icon will show the connection type, Wi-Fi or Ethernet. Clicking the item will open Network in System Preferences.</li>
<li>Mac Password is added as a configurable info item. It shows the days until the Mac password expires. Clicking the item will open Accounts in System Preferences. Local accounts and Active Directory accounts are supported. The text label in the item can be modified using the preference key ‘PasswordLabel’.</li>
<li>Preference key ‘UptimeDaysLimit’ added to configure the maximum amount of uptime days recommended by the organization. When the limit is reached, a badge counter with exclamation mark will be shown in the Last Reboot tile. Also a little notification badge can overlay the menu bar icon when the preference key ‘StatusBarIconNotifierEnabled’ is set to ‘true’</li>
<li>Preference key ‘PasswordExpiryLimit’ added to configure the minimum amount of days before the user should change the Mac password. When the limit is reached, a badge counter with exclamation mark will be shown in the Mac Password tile. Also a little notification badge can overlay the menu bar icon when the preference key ‘StatusBarIconNotifierEnabled’ is set to ‘true’.</li>
<li>Flexible rows of for App, URL or Command: The middle button is now optional, offering a two or three button row. The middle button are enabled by setting the following keys: FirstRowTitleMiddle or SecondRowTitleMiddle. Together with HideFirstRow and HideSecondRow, the total amount of configurable buttons is possible: 0, 2, 3, 4, 5, 6. As a result, keys for the middle buttons no longer have default values and the app shows two buttons by default;</li>
<li>Computer Name info item: The Mac model name and introduction year is shown when hovering over Computer Name. Clicking the item opens ‘About This Mac’</li>
<li>Small UI tweaks for Dark Mode. Buttons now have a small border and are more distinguishable</li>
<li>Performance improvements and bug fixes</li>
</ul>
<p><strong>Version 2.1</strong></p>
<ul>
<li>Preference key LogoDarkMode is added to provide a separate logo for Dark Mode</li>
<li>Preference key CustomColorDarkMode is added to set a separate custom color for Dark Mode</li>
<li>The number of available Apple Software Updates will now be shown in a badge counter in the macOS version tile. Also a little notification badge can overlay the menu bar icon when the preference key ‘StatusBarIconNotifierEnabled’ is set to ‘true’</li>
<li>Clicking on the macOS version tile will now open the Software Update preference pane in System Preferences</li>
<li>Running basic zsh commands as the user can now be used as an action by setting the LinkType to “Command”</li>
<li>Changes to the menu bar icon will now be observed and will automatically be applied without restarting the app</li>
<li>Preference key ErrorMessage is added to provide a custom error message when clicking an App, URL or Command results in an error</li>
<li>The app’s icon is changed to a more generic looking icon</li>
<li>Default error message is improved</li>
<li>Unified logging is implemented for the subsystem “nl.root3.support” to be able to capture errors when using commands or scripts</li>
<li>Fixed a localization issue for error alerts</li>
<li>Fixed an issue where some functions kept running in the background, causing more CPU time than required</li>
</ul>
<h2>Privacy policy</h2>
<p>We value your privacy. To protect your privacy, the Support App does not collect or send any personal data. The only outgoing network request is to send the computer's serial number to an Apple API to request the model's marketing name. This information is only kept within the app and is never collected elsewhere.</p>
<h2>Note and disclaimer</h2>
<ul>
<li>Root3 developed this application as a side project to add additional value for our customers</li>
<li>The application can be used free of charge and is provided ‘as is’, without any warranty</li>
<li>Comments and feature request are appreciated. Please file an issue on Github</li>
</ul>
-
-
- Jinxiansen/SwiftUI
- 2023-10-10T01:41:10Z
- tag:github.com,2023-10-10:/Jinxiansen/SwiftUI
-
- <p>`SwiftUI` Framework Learning and Usage Guide. 🚀</p><hr><img src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/icon/banner.png">
<p><a href="https://github.com/Jinxiansen/SwiftUI"><img src="https://img.shields.io/badge/platforms-iOS%20%7C%20tvOS%20%7C%20macOS%20%7C%20watchOS-green.svg?sanitize=true" alt="Build Status"></a> <a href="https://swift.org"><img src="https://img.shields.io/badge/Swift-5.1-orange.svg?sanitize=true" alt="Swift"></a> <a href="https://developer.apple.com/xcode"><img src="https://img.shields.io/badge/Xcode-11.0-blue.svg?sanitize=true" alt="Xcode"></a> <a href="https://developer.apple.com/macOS"><img src="https://img.shields.io/badge/macOS-15.0-blue.svg?sanitize=true" alt="Xcode"></a> <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/licenses-MIT-red.svg?sanitize=true" alt="MIT"></a></p>
<p>This article refers to SwiftUI <a href="https://github.com/Jinxiansen/SwiftUI/tree/doc">apple example</a> and records the results of the exploration here, I hope to be helpful to you.</p>
<p>For the content described in this article, by default you have some experience based on Swift language development, so it will not describe every detail in detail; if you have doubts about Swift syntax, you can learn <a href="https://swift.org">Swift</a> Grammar.</p>
<p>When learning and using <code>SwiftUI</code>, if you have any questions, you can join the SwiftUI QQ Group: <strong>18552966</strong> to discuss communication.</p>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/README_CN.md">中文版🇨🇳</a></p>
<blockquote>
<p>Recommended Preview: <a href="https://github.com/Jinxiansen/Windows11">Windows 11</a> desktop client implemented using <strong>SwiftUI</strong>.</p>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/windows11/launchpad.png">
</blockquote>
<h3>⭐️ Stargazers over time</h3>
<p><a href="https://starchart.cc/Jinxiansen/SwiftUI"><img src="https://starchart.cc/Jinxiansen/SwiftUI.svg?sanitize=true" alt="Stargazers over time"></a></p>
<h3>💻 Requirements</h3>
<ul>
<li>macOS 10.15</li>
<li>Xcode 11.0</li>
<li>iOS 13.0</li>
</ul>
<h2>Directory:</h2>
<h3>Basic View</h3>
<ul>
<li> <p><span id="Text_D">Text</span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Text">Text</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#TextField">TextField</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#SecureField">SecureField</a></li>
</ul> </li>
<li> <p><span id="Image_D">Image</span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Image">Image</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#WebImage">WebImage</a></li>
</ul> </li>
<li> <p><span id="Button_D">Button</span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Button">Button</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#PullDownButton">PullDownButton</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#ItemBasedPopUpButton">ItemBasedPopUpButton</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#NavigationButton">NavigationButton</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#PresentationButton">PresentationButton</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#EditButton">EditButton</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#PasteButton">PasteButton</a></li>
</ul> </li>
<li> <p><span id="Picker_D">Picker</span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Picker">Picker</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#DatePicker">DatePicker</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Toggle">Toggle</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Slider">Slider</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Stepper">Stepper</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#SegmentedControl">SegmentedControl</a></li>
</ul> </li>
<li> <p><span id="Special_D">Special Views</span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#WebView">WebView</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#UIViewController">UIViewController</a></li>
</ul> </li>
</ul>
<h3><span id="Layout_D">Layout</span></h3>
<ul>
<li> <p><span id="Stacks_D">Stacks</span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#HStack">HStack</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#VStack">VStack</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#ZStack">ZStack</a></li>
</ul> </li>
<li> <p><span id="List_D">List</span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#List">List</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#ScrollView">ScrollView</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#ForEach">ForEach</a></li>
</ul> </li>
<li> <p><span id="Container_D">Container Views</span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Group">Group</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#GroupBox">GroupBox</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Section">Section</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Form">Form</a></li>
</ul> </li>
<li> <p><span id="Architectural_D">Architectural Views</span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#NavigationView">NavigationView</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#TabView">TabView</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#HSplitView">HSplitView</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#VSplitView">VSplitView</a></li>
</ul> </li>
<li> <p><span id="Alert_D"> Alert </span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Alert">Alert</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Modal">Modal</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Popover">Popover</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Sheet">Sheet</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#ActionSheet">ActionSheet</a></li>
</ul> </li>
</ul>
<h3><span id="State_D">State and Data Flow</span></h3>
<ul>
<li> <p><span id="Bindings_D"> Bindings </span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Binding">Binding</a></li>
</ul> </li>
<li> <p><span id="Data_D"> Data-Dependent Views </span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#State">State</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#ObjectBinding">ObjectBinding</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#EnvironmentObject">EnvironmentObject</a></li>
</ul> </li>
<li> <p><span id="Environment_D"> Environment Values </span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Environment">Environment</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#EnvironmentValues">EnvironmentValues</a></li>
</ul> </li>
<li> <p><span id="ENavigation_D"> ENavigation Models </span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#DynamicNavigationDestinationLink">DynamicNavigationDestinationLink</a></li>
</ul> </li>
<li> <p><span id="Preferences_D"> Preferences </span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#LocalizedStringKey">LocalizedStringKey</a></li>
</ul> </li>
<li> <p><span id="Transactions_D"> Transactions </span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Transaction">Transaction</a></li>
</ul> </li>
</ul>
<h3><span id="Gestures_D">Gestures</span></h3>
<ul>
<li> <p><span id="BasicGestures_D"> Basic Gestures </span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#TapGesture">TapGesture</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#LongPressGesture">LongPressGesture</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#DragGesture">DragGesture</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#MagnificationGesture">MagnificationGesture</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#RotationGesture">RotationGesture</a></li>
</ul> </li>
<li> <p><span id="Combined_D"> Combined Gestures </span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#SequenceGesture">SequenceGesture</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#SimultaneousGesture">SimultaneousGesture</a></li>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#ExclusiveGesture">ExclusiveGesture</a></li>
</ul> </li>
<li> <p><span id="Custom_D"> Custom Gestures </span></p>
<ul>
<li><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#AnyGesture">AnyGesture</a></li>
</ul> </li>
</ul>
<h2 id="Basic View">Basic View</h2>
<h4 id="Text">Text</h4>
<p><code>Text</code> is used to display one or more lines of text content with the same effect as <code>UILabel</code>, but it is even better.</p>
<p>If you want to create <code>Text</code>, just create it with <code>Text("SwiftUI")</code>; With chained syntax, you can also add multiple attributes to the text, such as fonts, colors, shadows, spacing between top left and right, and so on.</p>
<p>Example:</p>
<pre><code class="language-swift">
Text("SwiftUI")
.foregroundColor(.orange)
.bold()
.font(.system(.largeTitle))
.fontWeight(.medium)
.italic()
.shadow(color: .black, radius: 1, x: 0, y: 2)
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Text.png">
</details>
<blockquote>
<p>HStack and VStack controls are used to host multiple views, as mentioned later.</p>
</blockquote>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Text_D">🔝</a></p>
<h4 id="TextField"> TextField </h4>
<p><code>TextField</code> is used to add a normal input box, which is often used as a text input.</p>
<p>Example:</p>
<pre><code class="language-swift">
TextField(self.$name, placeholder: self.nameText, onEditingChanged: { changed in
print("onEditing: \(changed)")
}) {
print("userName: \(self.name)")
self.endEditing(true)
}}
.padding(10)
.frame(height: 50)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20))
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Field.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Text_D">🔝</a></p>
<h4 id="SecureField"> SecureField </h4>
<p><code>SecureField </code> is generally used as a password input. It is used in the same way as <code>TextField</code>. The example and the running effect are the same as <code>TextField</code>.</p>
<h4 id="Image"> Image </h4>
<p>The <code>Image</code> control is used to display images, example:</p>
<pre><code class="language-swift">
Image("icon")
.resizable()
.frame(width: 100,
height: 100,
alignment: .center)
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Image.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Text_D">🔝</a></p>
<h4 id="WebImage"> WebImage </h4>
<p><code>webImage</code> is used to download the web image, use the <code>URLSession</code> to download the original <code>Image</code> after successful download; you can also use <a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/(https://github.com/onevcat/Kingfisher)">Kingfisher</a> in the <code>downloadWebImage </code> function .</p>
<p>Example:</p>
<pre><code class="language-swift">
var body: some View {
Image(uiImage: self.uiImage ?? placeholderImage)
.resizable()
.onAppear(perform: downloadWebImage)
.frame(width: 80,
height: 80,
alignment: .center)
.onTapGesture {
print("Tap ")
}
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/WebImage.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Text_D">🔝</a></p>
<h4 id="Button"> Button </h4>
<p><code>Button</code> is used to respond to click events.</p>
<p>Example:</p>
<pre><code class="language-swift">
Button(action: {
print("Tap")
}) {
Text("I'm a Button")
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Button.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Button_D">🔝</a></p>
<h4 id="PullDownButton"> PullDownButton </h4>
<p>Waiting for release.</p>
<h4 id="ItemBasedPopUpButton"> ItemBasedPopUpButton </h4>
<p>Waiting for release.</p>
<h4 id="NavigationButton"> NavigationButton </h4>
<p><code>NavigationButtonPage </code> is used to push to the next navigation page.</p>
<p>Example:</p>
<pre><code class="language-swift">
NavigationLink(destination: NavigationButtonPage()) {
Text("NavigationButton").bold()
.foregroundColor(.orange)
.font(.largeTitle)
}
.navigationBarTitle(Text("Page"))
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/NavigationButton.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Button_D">🔝</a></p>
<h4 id="PresentationButton" style="color:red"> PresentationButton is deprecated</h4>
<p><code>PresentationButton</code> <del>is used to pop up a page.</del> has deprecated, please use <code>NavigationLink</code></p>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Button_D">🔝</a></p>
<h4 id="EditButton"> EditButton </h4>
<p><code>EditButton</code> is used to trigger the editing state, just use the <code>navigationBarItems</code> setting when using it.</p>
<p>Example:</p>
<pre><code class="language-swift">
navigationBarItems(trailing: EditButton())
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/EditButton.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Button_D">🔝</a></p>
<h4 id="PasteButton"> PasteButton </h4>
<p>Waiting for release.</p>
<h4 id="Picker"> Picker </h4>
<p><code>Picker</code> can customize the selector of the data source.</p>
<p>Example:</p>
<pre><code class="language-swift">
Picker(selection: $leftIndex, label: Text("Picker")) {
ForEach(0..<leftSource.count) {
Text(self.leftSource[$0]).tag($0)
}
}.frame(width: UIScreen.main.bounds.width/2)
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Picker.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Picker_D">🔝</a></p>
<h4 id="DatePicker"> DatePicker </h4>
<p><code>DatePicker</code> is used to select the absolute date of the control.</p>
<p>Example:</p>
<pre><code class="language-swift">
DatePicker(selection: $server.date,
in: server.spaceDate,
displayedComponents: .date, label: {
Text("")
})
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/DatePicker.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Picker_D">🔝</a></p>
<h4 id="Toggle"> Toggle </h4>
<p><code>Toggle</code> is used to switch the selected state, for example:</p>
<pre><code class="language-swift">
Toggle(isOn: $isOn) {
Text("State: \(self.isOn == true ? "Open":"open")")
}.padding(20)
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Toggle.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Picker_D">🔝</a></p>
<h4 id="Slider"> Slider </h4>
<p><code>Slider </code> A control for selecting values from a finite range of values, example:</p>
<pre><code class="language-swift">
Slider(value: $data.rating)
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Slider.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Picker_D">🔝</a></p>
<h4 id="Stepper"> Stepper </h4>
<p><code>Stepper </code> is used to increase or decrease the value, example:</p>
<pre><code class="language-swift">
Stepper(value: $value, step: 2, onEditingChanged: { c in
print(c)
}) {
Text("Stepper Value: \(self.value)")
}.padding(50)
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Stepper.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Picker_D">🔝</a></p>
<h4 id="SegmentedControl" style="color:red">SegmentedControl is deprecated</h4>
<p><code>SegmentedControl </code> is used for segmentation condition selection, example:</p>
<pre><code class="language-swift">
SegmentedControl(selection: $currentIndex) {
ForEach(0..<items.count) { index in
Text(self.items[index]).tag(index)
}
}.tapAction {
print("currentIndex: \(self.currentIndex)")
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/SegmentedControl.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Picker_D">🔝</a></p>
<h4 id="WebView"> WebView </h4>
<p><code>WebView</code> is used to display an open web page, example:</p>
<pre><code class="language-swift">
struct WebViewPage : UIViewRepresentable {
func makeUIView(context: Context) -> WKWebView {
return WKWebView()
}
func updateUIView(_ uiView: WKWebView, context: Context) {
let req = URLRequest(url: URL(string: "https://www.apple.com")!)
uiView.load(req)
}
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/WebView.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Special_D">🔝</a></p>
<h4 id="UIViewController"> UIViewController </h4>
<p><code>UIViewController</code> is used to display the <strong>UIViewController</strong> that opens <strong>UIKit</strong> in <strong>SwiftUI</strong> and opens the <code>SwiftUI</code> View in <strong>UIViewController</strong>.</p>
<p>Example:</p>
<p>First define:</p>
<pre><code class="language-swift">
struct ControllerPage<T: UIViewController> : UIViewControllerRepresentable {
typealias UIViewControllerType = UIViewController
func makeUIViewController(context: UIViewControllerRepresentableContext<ControllerPage>) -> UIViewController {
return T()
}
func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<ControllerPage>) {
debugPrint("\(#function):\(type(of: T.self))")
}
}
</code></pre>
<p>Then use this:</p>
<pre><code class="language-swift">
NavigationButton(destination: ControllerPage<UIKitController>()) {
PageRow(title: "UIViewController",subTitle: "Open UIViewController")
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/UIViewController.png">
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/UIViewController2.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Special_D">🔝</a></p>
<h3>Layout</h3>
<h4 id="HStack"> HStack </h4>
<p><code>HStack</code> is used to arrange the subviews on a horizontal line.</p>
<p>Example:</p>
<pre><code class="language-swift">
HStack {
Text("made in China.")
Divider() // Just add a line.
Text("the People's Republic Of China.")
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/HStack.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Layout_D">🔝</a></p>
<h4 id="VStack"> VStack </h4>
<p><code>VStack</code> is used to arrange the subviews on a vertical line.</p>
<p>Example:</p>
<pre><code class="language-swift">
VStack {
Text("made in China.")
Divider() // Just add a line.
Text("the People's Republic Of China.")
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/VStack.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Layout_D">🔝</a></p>
<h4 id="ZStack"> ZStack </h4>
<p><code>ZStack</code> is used to override the subview, aligned on two axes.</p>
<p>Example:</p>
<pre><code class="language-swift">
ZStack {
Text("made in China.")
Divider() // Just add a line.
Text("the People's Republic Of China.")
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/ZStack.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Layout_D">🔝</a></p>
<h4 id="List"> List </h4>
<p><code>List</code> list container to display a list of data.</p>
<p>Examples:</p>
<pre><code class="language-swift">
List(0..<5) { item in
Text("Hello World !")
}.navigationBarTitle(Text("List"), displayMode: .large)
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/List.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Layout_D">🔝</a></p>
<h4 id="ScrollView"> ScrollView </h4>
<p><code>ScrollView</code> is a scroll view container.</p>
<p>Example:</p>
<pre><code class="language-swift">
ScrollView {
Text("SwiftUI").padding(20)
Divider()
Image("icon").resizable()
.frame(width: 300, height: 300, alignment: .center)
Divider()
Text("Views and ... user interface.")
}
.border(Color.gray.gradient, width: 1)
.cornerRadius(10)
.padding(10)
.navigationBarTitle(Text("ScrollView"))
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/ScrollView.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Layout_D">🔝</a></p>
<h4 id="ForEach"> ForEach </h4>
<p><code>ForEach</code> is used to present a view based on a collection of existing data.</p>
<p>Example:</p>
<pre><code class="language-swift">
let data = (0..<5)
var body: some View {
ForEach(data) { e in
Text("Hello \(e)")
.bold()
.font(.system(size: 25, design: .monospaced))
.padding(5)
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/ForEach.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Layout_D">🔝</a></p>
<h4 id="Group"> Group </h4>
<p><code>Group</code> is used to aggregate multiple views, and the properties set on the Group will be applied to each child view.</p>
<p>Example:</p>
<pre><code class="language-swift">
Group {
Text("Hello World !")
Text("Hello World !")
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Group.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Layout_D">🔝</a></p>
<h4 id="GroupBox"> GroupBox </h4>
<p>Waiting for release.</p>
<h4 id="Section"> Section </h4>
<p><code>Section</code> is used to create the <strong>header/footer</strong> view content, which is generally used in conjunction with the <code>List</code> component.</p>
<p>Example:</p>
<pre><code class="language-swift">
Section(header: Text("I'm header"), footer: Text("I'm footer")) {
ForEach(0..<3) {
Text("Hello \($0)")
}
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Section.png">
</details>
<h4 id="Form"> Form </h4>
<p><code>Form</code> A container for grouping controls used for data entry, such as in settings or inspectors.</p>
<p>Example:</p>
<pre><code class="language-swift">
Form {
TextField("First Name", text: $firstName)
TextField("Last Name", text: $lastName)
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Form.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Layout_D">🔝</a></p>
<h4 id="NavigationView"> NavigationView </h4>
<p><code>NavigationView</code> is used to create a view container that contains the top navigation bar.</p>
<p>Example:</p>
<pre><code class="language-swift">
NavigationView {
Text("🧚♂️🧚♀️🧜♂️🧜♀️🧞♂️🧞♀️").blur(radius: 5)
Text("Swifter Swifter")
.bold()
.foregroundColor(.orange)
.font(.largeTitle)
}
.navigationBarTitle(Text("NavigationView"))
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/NavigationView.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Layout_D">🔝</a></p>
<h4 id="TabView"> TabView </h4>
<p><code>TabView</code> is used to create a view container that contains the bottom ** TabBar**.</p>
<p>Example:</p>
<pre><code class="language-swift">
TabView(selection: $index) {
ForEach(0..<imgs.count) { item in
TabItemPage(index: item)
.tabItem{
Image(self.imgs[item])
Text("\(item)")
}
.tag(item)
}
}
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/TabView.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Layout_D">🔝</a></p>
<h4 id="HSplitView"> HSplitView </h4>
<p>Waiting for release.</p>
<h4 id="VSplitView"> VSplitView </h4>
<p>Waiting for release.</p>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Layout_D">🔝</a></p>
<h4 id="Alert"> Alert </h4>
<p><code>Alert</code> is used to display a bullet reminder that needs to be associated with a trigger event.</p>
<p>Example:</p>
<pre><code class="language-swift">
alert(isPresented: $showAlert, content: {
Alert(title: Text("确定要支付这100000000美元吗?"),
message: Text("请谨慎操作\n一旦确认,钱款将立即转入对方账户"),
primaryButton: .destructive(Text("确认")) { print("转出中...") },
secondaryButton: .cancel())
}).navigationBarTitle(Text("Alert"))
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/AlertPage.jpg">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Alert_D">🔝</a></p>
<h4 id="ActionSheet"> ActionSheet </h4>
<p><code>ActionSheet</code> is used to pop up a selection box.</p>
<p>Example:</p>
<pre><code class="language-swift">
ActionSheet(title: Text("Title"),
message: Text("Message"),
buttons:
[.default(Text("Default"), onTrigger: {
print("Default")
self.showSheet = false
}),.destructive(Text("destructive"), onTrigger: {
print("destructive")
self.showSheet = false
}),.cancel({
print("Cancel")
self.showSheet = false
})])
</code></pre>
<p>usage:</p>
<pre><code class="language-swift">
.actionSheet(isPresented: $showSheet, content: {sheet})
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/ActionSheet.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Alert_D">🔝</a></p>
<h4 id="Modal"> Modal </h4>
<p><code>Modal</code> is used to pop up a view.</p>
<p>Example:</p>
<pre><code class="language-swift">
Modal(Text("Modal View"),onDismiss: {
print("View Dismiss !")
})
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Modal.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Alert_D">🔝</a></p>
<h4 id="Popover"> Popover </h4>
<p><code>Popover</code> is used to pop up a view, see the results below.</p>
<p>Example:</p>
<pre><code class="language-swift">
.popover(isPresented: $showPop, content: {
ImagePage()
})
</code></pre>
<details close>
<summary>View running results</summary>
<img width="80%" src="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/images/example/Popover.png">
</details>
<p><a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/#Alert_D">🔝</a></p>
<h2>📎 About</h2>
<ul>
<li>The code involved in the above example is in this repository code. It is recommended to download and run the view.</li>
<li>If you have better usage and suggestions about SwiftUI, look forward to sharing it!</li>
<li>If there are omissions and errors in the examples in this article, please create a <a href="https://github.com/Jinxiansen/SwiftUI/issues/new"><strong>Issue</strong></a> !</li>
</ul>
<h2>✉️ Contacts</h2>
<p>email : <a href="mailto:hi@jinxiansen.com">hi@jinxiansen.com</a></p>
<p>微博 : <a href="http://weibo.com/3205872327">@晋先森</a></p>
<h2>📄 License</h2>
<p>SwiftUI is released under the <a href="https://raw.githubusercontent.com/Jinxiansen/SwiftUI/master/LICENSE">MIT license</a>. See LICENSE for details.</p>
+ ninxsoft/LowProfile
+ 2023-10-11T01:41:07Z
+ tag:github.com,2023-10-11:/ninxsoft/LowProfile
+
+ <p>A Mac utility to help inspect Apple Configuration Profile payloads.</p><hr><img align="left" width="128" height="128" src="https://raw.githubusercontent.com/ninxsoft/LowProfile/main/README%20Resources/App%20Icon.png">
<h1>Low Profile</h1>
<p><img src="https://img.shields.io/github/v/release/ninxsoft/LowProfile?display_name=tag&label=Latest%20Release&sort=semver" alt="Latest Release"> <img src="https://img.shields.io/github/downloads/ninxsoft/LowProfile/total?label=Downloads" alt="Downloads"> <a href="https://github.com/ninxsoft/LowProfile/actions/workflows/linting.yml"><img src="https://github.com/ninxsoft/LowProfile/actions/workflows/linting.yml/badge.svg?sanitize=true" alt="Linting"></a> <a href="https://github.com/ninxsoft/LowProfile/actions/workflows/unit_tests.yml"><img src="https://github.com/ninxsoft/LowProfile/actions/workflows/unit_tests.yml/badge.svg?sanitize=true" alt="Unit Tests"></a> <a href="https://github.com/ninxsoft/LowProfile/actions/workflows/build.yml"><img src="https://github.com/ninxsoft/LowProfile/actions/workflows/build.yml/badge.svg?sanitize=true" alt="Build"></a></p>
<p>A Mac utility to help inspect Apple Configuration Profile <a href="https://developer.apple.com/documentation/devicemanagement/profile-specific_payload_keys">payloads</a>:</p>
<p><img src="https://raw.githubusercontent.com/ninxsoft/LowProfile/main/README%20Resources/Example.png" alt="Example"></p>
<ul>
<li><input type="checkbox" checked disabled> Want to see what is inside the Configuration Profiles that are installed on your Mac?</li>
<li><input type="checkbox" checked disabled> Curious to know what a Configuration Profile will enforce / change on a device before actually installing one?</li>
<li><input type="checkbox" checked disabled> Tired of having to manually un-sign Configuration Profiles, only to have to flex your XML parsing skills to find out what is inside?</li>
<li><input type="checkbox" checked disabled> Maybe you just want to qualify that your MDM vendor is creating Configuration Profiles the way you expect?</li>
</ul>
<p>If the answer is yes to any of the above, then <strong>Low Profile</strong> is the app for <strong>you!</strong></p>
<!-- markdownlint-disable no-trailing-punctuation -->
<h2><img src="https://raw.githubusercontent.com/ninxsoft/LowProfile/main/README%20Resources/Slack.png" alt="Slack"> Check out <a href="https://macadmins.slack.com/archives/C0590AY05U3">#low-profile</a> on the <a href="https://macadmins.slack.com">Mac Admins Slack</a> to discuss all things Low Profile!</h2>
<!-- markdownlint-enable no-trailing-punctuation -->
<h2>Features</h2>
<ul>
<li><input type="checkbox" checked disabled> <p>Displays details for all Apple <a href="https://developer.apple.com/documentation/devicemanagement/profile-specific_payload_keys">supported payloads</a>:</p>
<ul>
<li> <p>Description + Payload Type</p> </li>
<li> <p>Supported Platforms (iOS, iPadOS, macOS, tvOS, watchOS)</p> </li>
<li> <p>Payload-specific information (ie. Identifier, UUID, Display Name, Organisation, etc.)</p> </li>
<li> <p>Payload Availability</p> </li>
<li> <p>Example Property List</p> </li>
<li> <p>Properties:</p>
<ul>
<li>Payload Properties (supported and in the payload)</li>
<li>Available Properties (supported and not in the payload)</li>
<li>Unknown Properties (unknown and in the payload)</li>
</ul> <p><img src="https://raw.githubusercontent.com/ninxsoft/LowProfile/main/README%20Resources/Payload.png" alt="Payload"></p> </li>
</ul> </li>
<li><input type="checkbox" checked disabled> <p>Displays Property List keys for all payloads:</p> <p><img src="https://raw.githubusercontent.com/ninxsoft/LowProfile/main/README%20Resources/Property%20List.png" alt="Property List"></p> </li>
<li><input type="checkbox" checked disabled> <p>Displays nested payloads for Managed Preferences:</p> <p><img src="https://raw.githubusercontent.com/ninxsoft/LowProfile/main/README%20Resources/Managed%20Preferences.png" alt="Certificate"></p> </li>
<li><input type="checkbox" checked disabled> <p>Displays details for custom 3rd-party payloads:</p>
<ul>
<li>Including certificate data</li>
<li>Including custom arrays and dictionaries</li>
</ul> <p><img src="https://raw.githubusercontent.com/ninxsoft/LowProfile/main/README%20Resources/Custom.png" alt="Custom"></p> </li>
<li><input type="checkbox" checked disabled> <p>Displays certificate information for signed Configuration Profiles:</p> <p><img src="https://raw.githubusercontent.com/ninxsoft/LowProfile/main/README%20Resources/Certificate.png" alt="Certificate"></p> </li>
<li><input type="checkbox" checked disabled> <p>Detect issues with deprecated and duplicated property keys:</p> <p><img src="https://raw.githubusercontent.com/ninxsoft/LowProfile/main/README%20Resources/Issues.png" alt="Issues"></p> </li>
</ul>
<h2>Build Requirements</h2>
<ul>
<li>Swift <strong>5.8</strong></li>
<li>Runs on <strong>macOS Ventura 13</strong> and later.</li>
</ul>
<h2>Download</h2>
<ul>
<li>Grab the latest version of <strong>Low Profile</strong> from the <a href="https://github.com/ninxsoft/LowProfile/releases">releases page</a>.</li>
<li>Alternatively, install via <a href="https://brew.sh">Homebrew</a> by running <code>brew install low-profile</code></li>
<li><strong>Note:</strong> Version <strong>4.0</strong> requires <strong>macOS Ventura 13</strong> or later.
<ul>
<li>If you need to run <strong>Low Profile</strong> on an older operating system you can still use version <strong>3.0.1</strong>.</li>
</ul> </li>
</ul>
<h2>Credits / Thank You</h2>
<ul>
<li>Project created and maintained by Nindi Gill (<a href="https://github.com/ninxsoft">ninxsoft</a>).</li>
<li>Documentation and icons sourced from <a href="https://developer.apple.com/documentation/devicemanagement">here</a> and <a href="https://support.apple.com/en-au/guide/mdm/welcome/web">here</a>.</li>
<li>Filippo Maguolo (<a href="https://github.com/filom">filom</a>) for <a href="https://github.com/filom/ASN1Decoder">AS1NDecoder</a>, used in reading certificate data.</li>
<li>J.P. Illanes (<a href="https://github.com/raspu">raspu</a>) for <a href="https://github.com/raspu/Highlightr">Highlightr</a>, used to syntax highlight property lists.</li>
<li>The Sparkle Project (<a href="https://github.com/sparkle-project">sparkle-project</a>) for <a href="https://github.com/sparkle-project/Sparkle">Sparkle</a>, used to auto update Low Profile.</li>
<li>JP Simard (<a href="https://github.com/jpsim">jpsim</a>) for <a href="https://github.com/jpsim/Yams">Yams</a>, used to import YAML.</li>
<li>Marcus Ransom (<a href="https://twitter.com/marcusransom">@marcusransom</a>) for the awesome app name.</li>
<li>James Smith (<a href="https://github.com/smithjw">smithjw</a>) for the shiny new app icon.</li>
</ul>
<h2>License</h2>
<blockquote>
<p>Copyright © 2023 Nindi Gill</p>
<p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>
<p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>
</blockquote>
\ No newline at end of file
diff --git a/swig/daily/index.xml b/swig/daily/index.xml
index 665a8442632..715143cf356 100644
--- a/swig/daily/index.xml
+++ b/swig/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SWIG Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:07Z
+ 2023-10-11T01:41:03Z
Daily Trending of SWIG in GitHub
\ No newline at end of file
diff --git a/systemverilog/daily/index.xml b/systemverilog/daily/index.xml
index 01e6db3599b..99902116eff 100644
--- a/systemverilog/daily/index.xml
+++ b/systemverilog/daily/index.xml
@@ -1,7 +1,7 @@
GitHub SystemVerilog Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:34Z
+ 2023-10-11T01:41:24Z
Daily Trending of SystemVerilog in GitHub
\ No newline at end of file
diff --git a/talon/daily/index.xml b/talon/daily/index.xml
index ce32fa97b5e..225905b6e8d 100644
--- a/talon/daily/index.xml
+++ b/talon/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Talon Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:29Z
+ 2023-10-11T01:41:19Z
Daily Trending of Talon in GitHub
\ No newline at end of file
diff --git a/tcl/daily/index.xml b/tcl/daily/index.xml
index b9ef35e7b0b..e35ea70930b 100644
--- a/tcl/daily/index.xml
+++ b/tcl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Tcl Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:32Z
+ 2023-10-11T01:41:21Z
Daily Trending of Tcl in GitHub
\ No newline at end of file
diff --git a/tcsh/daily/index.xml b/tcsh/daily/index.xml
index 64d2cf193af..5e7ac02e98f 100644
--- a/tcsh/daily/index.xml
+++ b/tcsh/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Tcsh Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:30Z
+ 2023-10-11T01:41:20Z
Daily Trending of Tcsh in GitHub
\ No newline at end of file
diff --git a/tea/daily/index.xml b/tea/daily/index.xml
index 3dec1d96c49..7f631d6373f 100644
--- a/tea/daily/index.xml
+++ b/tea/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Tea Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:38Z
+ 2023-10-11T01:41:26Z
Daily Trending of Tea in GitHub
\ No newline at end of file
diff --git a/terra/daily/index.xml b/terra/daily/index.xml
index 8420375158e..1036f0d1927 100644
--- a/terra/daily/index.xml
+++ b/terra/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Terra Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:36Z
+ 2023-10-11T01:41:27Z
Daily Trending of Terra in GitHub
\ No newline at end of file
diff --git a/tex/daily/index.xml b/tex/daily/index.xml
new file mode 100644
index 00000000000..7ee4951f9fd
--- /dev/null
+++ b/tex/daily/index.xml
@@ -0,0 +1,7 @@
+
+ GitHub TeX Daily Trending
+ http://mshibanami.github.io/GitHubTrendingRSS
+ 2023-10-11T01:41:31Z
+ Daily Trending of TeX in GitHub
+
+
\ No newline at end of file
diff --git a/texinfo/daily/index.xml b/texinfo/daily/index.xml
index b6b66757825..4f7a16494d2 100644
--- a/texinfo/daily/index.xml
+++ b/texinfo/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Texinfo Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:37Z
+ 2023-10-11T01:41:25Z
Daily Trending of Texinfo in GitHub
\ No newline at end of file
diff --git a/text/daily/index.xml b/text/daily/index.xml
index 0544789766a..e33d6501d06 100644
--- a/text/daily/index.xml
+++ b/text/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Text Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:51Z
+ 2023-10-11T01:41:41Z
Daily Trending of Text in GitHub
\ No newline at end of file
diff --git a/textile/daily/index.xml b/textile/daily/index.xml
index 718670de22e..807bf139111 100644
--- a/textile/daily/index.xml
+++ b/textile/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Textile Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:50Z
+ 2023-10-11T01:41:40Z
Daily Trending of Textile in GitHub
\ No newline at end of file
diff --git a/textmate-properties/daily/index.xml b/textmate-properties/daily/index.xml
index b1af80cae85..8b8958ac13a 100644
--- a/textmate-properties/daily/index.xml
+++ b/textmate-properties/daily/index.xml
@@ -1,7 +1,7 @@
GitHub TextMate Properties Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:50Z
+ 2023-10-11T01:41:39Z
Daily Trending of TextMate Properties in GitHub
\ No newline at end of file
diff --git a/thrift/daily/index.xml b/thrift/daily/index.xml
index 390d650c11a..ecb669f727d 100644
--- a/thrift/daily/index.xml
+++ b/thrift/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Thrift Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:52Z
+ 2023-10-11T01:41:42Z
Daily Trending of Thrift in GitHub
\ No newline at end of file
diff --git a/ti-program/daily/index.xml b/ti-program/daily/index.xml
index f26a3954b52..c109649b750 100644
--- a/ti-program/daily/index.xml
+++ b/ti-program/daily/index.xml
@@ -1,7 +1,7 @@
GitHub TI Program Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:55Z
+ 2023-10-11T01:41:45Z
Daily Trending of TI Program in GitHub
\ No newline at end of file
diff --git a/tla/daily/index.xml b/tla/daily/index.xml
index c9b39b61763..5c2e81da468 100644
--- a/tla/daily/index.xml
+++ b/tla/daily/index.xml
@@ -1,7 +1,7 @@
GitHub TLA Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:54Z
+ 2023-10-11T01:41:44Z
Daily Trending of TLA in GitHub
\ No newline at end of file
diff --git a/toml/daily/index.xml b/toml/daily/index.xml
index 75901bf1e80..ce6987de172 100644
--- a/toml/daily/index.xml
+++ b/toml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub TOML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:55Z
+ 2023-10-11T01:41:46Z
Daily Trending of TOML in GitHub
\ No newline at end of file
diff --git a/tsql/daily/index.xml b/tsql/daily/index.xml
index de9d6ecb871..31f71b79839 100644
--- a/tsql/daily/index.xml
+++ b/tsql/daily/index.xml
@@ -1,7 +1,7 @@
GitHub TSQL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:00Z
+ 2023-10-11T01:41:49Z
Daily Trending of TSQL in GitHub
\ No newline at end of file
diff --git a/tsv/daily/index.xml b/tsv/daily/index.xml
index 882b3b27c8b..aab6c401ef9 100644
--- a/tsv/daily/index.xml
+++ b/tsv/daily/index.xml
@@ -1,7 +1,7 @@
GitHub TSV Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:59Z
+ 2023-10-11T01:41:47Z
Daily Trending of TSV in GitHub
\ No newline at end of file
diff --git a/tsx/daily/index.xml b/tsx/daily/index.xml
index 5d69ff8d64f..5f5e6c1f56a 100644
--- a/tsx/daily/index.xml
+++ b/tsx/daily/index.xml
@@ -1,7 +1,7 @@
GitHub TSX Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:01Z
+ 2023-10-11T01:41:50Z
Daily Trending of TSX in GitHub
\ No newline at end of file
diff --git a/turing/daily/index.xml b/turing/daily/index.xml
index 4bdd37725db..31a7c0bbe4d 100644
--- a/turing/daily/index.xml
+++ b/turing/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Turing Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:41:58Z
+ 2023-10-11T01:41:48Z
Daily Trending of Turing in GitHub
\ No newline at end of file
diff --git a/turtle/daily/index.xml b/turtle/daily/index.xml
index e42043e606e..c160c2f8998 100644
--- a/turtle/daily/index.xml
+++ b/turtle/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Turtle Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:03Z
+ 2023-10-11T01:41:51Z
Daily Trending of Turtle in GitHub
\ No newline at end of file
diff --git a/twig/daily/index.xml b/twig/daily/index.xml
index f93f9f597ed..2f733c5c2cc 100644
--- a/twig/daily/index.xml
+++ b/twig/daily/index.xml
@@ -1,14 +1,7 @@
GitHub Twig Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:05Z
+ 2023-10-11T01:41:53Z
Daily Trending of Twig in GitHub
-
- web-auth/symfony-webauthn-demo
- 2023-10-10T01:42:05Z
- tag:github.com,2023-10-10:/web-auth/symfony-webauthn-demo
-
- <p>Demo Application using Symfony 6, Tailwind, FrankenPHP, AssetMapper and Webauthn</p><hr>
-
\ No newline at end of file
diff --git a/txl/daily/index.xml b/txl/daily/index.xml
index fc94b17d162..223e4c2e082 100644
--- a/txl/daily/index.xml
+++ b/txl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub TXL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:04Z
+ 2023-10-11T01:41:54Z
Daily Trending of TXL in GitHub
\ No newline at end of file
diff --git a/type-language/daily/index.xml b/type-language/daily/index.xml
index 48084a57e55..a0a19da2009 100644
--- a/type-language/daily/index.xml
+++ b/type-language/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Type Language Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:02Z
+ 2023-10-11T01:41:52Z
Daily Trending of Type Language in GitHub
\ No newline at end of file
diff --git a/typescript/daily/index.xml b/typescript/daily/index.xml
index 700e63ab2c9..19dc4c88468 100644
--- a/typescript/daily/index.xml
+++ b/typescript/daily/index.xml
@@ -1,28 +1,28 @@
GitHub TypeScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:12Z
+ 2023-10-11T01:42:00Z
Daily Trending of TypeScript in GitHub
- piyushgarg-dev/review-app
- 2023-10-10T01:42:12Z
- tag:github.com,2023-10-10:/piyushgarg-dev/review-app
-
- <p>Frontend Review Management Application | https://youtu.be/JD3NQsB3TQI</p><hr><h1>Review App</h1>
<p><img src="https://github.com/priyankeshh/review-app/assets/102135464/ce5d8d2b-c130-4a31-b6c1-200d6a6d862e" alt="image"></p>
<p>Review App is a web application built using <a href="https://nextjs.org/">Next.js</a>, bootstrapped with <a href="https://github.com/vercel/next.js/tree/canary/packages/create-next-app"><code>create-next-app</code></a>. It simplifies the process of adding a review system to your website. Instead of creating a whole new backend for the review system, you can create a review application on Review App and easily integrate it into your website.</p>
<p>With Review App, you can gather valuable feedback and reviews from your website's users. Whether you run an e-commerce site, a blog, or any other online platform, adding a review feature can help you build trust and improve user engagement.</p>
<h2>Table of Contents</h2>
<ul>
<li><a href="https://raw.githubusercontent.com/piyushgarg-dev/review-app/main/#getting-started">Getting Started</a></li>
<li><a href="https://raw.githubusercontent.com/piyushgarg-dev/review-app/main/#key-features">Key Features</a></li>
<li><a href="https://raw.githubusercontent.com/piyushgarg-dev/review-app/main/#how-it-works">How It Works</a></li>
<li><a href="https://raw.githubusercontent.com/piyushgarg-dev/review-app/main/#contributing">Contributing</a></li>
<li><a href="https://raw.githubusercontent.com/piyushgarg-dev/review-app/main/#license">License</a></li>
</ul>
<h2>Getting Started</h2>
<p>To run the project locally and start using Review App, follow these steps:</p>
<ol>
<li>Clone the repository:</li>
</ol>
<pre><code class="language-bash">git clone https://github.com/yourusername/review-app.git
</code></pre>
<ol start="2">
<li>Navigate to the project directory:</li>
</ol>
<pre><code class="language-bash">cd review-app
</code></pre>
<ol start="3">
<li>Install dependencies:</li>
</ol>
<pre><code class="language-bash">npm install
# or
yarn install
# or
pnpm install
</code></pre>
<ol start="4">
<li>Start the development server:</li>
</ol>
<pre><code class="language-bash">npm run dev
# or
yarn dev
# or
pnpm dev
</code></pre>
<p>Open <a href="http://localhost:3000">http://localhost:3000</a> in your browser to see the Review App in action. You can start customizing and integrating it into your website by modifying <code>pages/index.tsx</code>.</p>
<p>For more details on API routes, check out <a href="https://nextjs.org/docs/api-routes/introduction">the API documentation</a> and edit the routes in <code>pages/api</code>.</p>
<h2>Key Features</h2>
<ul>
<li> <p><strong>Easy Integration</strong>: Quickly add a review system to your website without the need for complex backend development.</p> </li>
<li> <p><strong>User-Friendly Interface</strong>: The Review App provides an intuitive interface for users to submit reviews and ratings.</p> </li>
<li> <p><strong>Customization</strong>: Customize the look and feel of the review widget to match your website's design.</p> </li>
<li> <p><strong>Moderation</strong>: Review submissions can be moderated to ensure quality and prevent spam.</p> </li>
<li> <p><strong>Analytics</strong>: Gain insights into user feedback with built-in analytics and reporting features.</p> </li>
<li> <p><strong>Scalable</strong>: Designed to handle a growing number of reviews, making it suitable for websites of all sizes.</p> </li>
<li> <p><strong>Responsive</strong>: Review App is responsive and works seamlessly on various devices and screen sizes.</p> </li>
</ul>
<h2>How It Works</h2>
<ol>
<li> <p><strong>Create an Application</strong>: Sign up and create a review application for your website on Review App.</p> </li>
<li> <p><strong>Customize Widget</strong>: Customize the review widget's appearance to match your website's branding.</p> </li>
<li> <p><strong>Integration</strong>: Integrate the provided code snippet into your website's pages where you want the review widget to appear.</p> </li>
<li> <p><strong>Gather Reviews</strong>: Users visiting your website can easily submit reviews and ratings through the widget.</p> </li>
<li> <p><strong>Moderate Reviews</strong>: Review submissions can be moderated through the Review App dashboard.</p> </li>
<li> <p><strong>Analytics and Insights</strong>: Gain valuable insights from user reviews with built-in analytics and reporting.</p> </li>
</ol>
<h2>Contributing</h2>
<p>We welcome contributions from the community to enhance Review App further. If you're interested in contributing, please read our <a href="https://raw.githubusercontent.com/piyushgarg-dev/review-app/main/CONTRIBUTING.md">Contributing Guidelines</a> for detailed information on how to get started.</p>
<h2>License</h2>
<p>This project is licensed under the <a href="https://github.com/piyushgarg-dev/review-app/raw/main/LICENCE">GNU General Public Licence v3.0</a>.</p>
+ th-ch/youtube-music
+ 2023-10-11T01:42:00Z
+ tag:github.com,2023-10-11:/th-ch/youtube-music
+
+ <p>YouTube Music Desktop App bundled with custom plugins (and built-in ad blocker / downloader)</p><hr><h1>YouTube Music</h1>
<div align="center">
<p><a href="https://github.com/th-ch/youtube-music/releases/"><img src="https://img.shields.io/github/release/th-ch/youtube-music.svg?style=for-the-badge&logo=youtube-music" alt="GitHub release"></a> <a href="https://github.com/th-ch/youtube-music/raw/master/LICENSE"><img src="https://img.shields.io/github/license/th-ch/youtube-music.svg?style=for-the-badge" alt="GitHub license"></a> <a href="https://github.com/th-ch/youtube-music/raw/master/.eslintrc.js"><img src="https://img.shields.io/badge/code_style-eslint-5ed9c7.svg?style=for-the-badge" alt="eslint code style"></a> <a href="https://GitHub.com/th-ch/youtube-music/releases/"><img src="https://img.shields.io/github/actions/workflow/status/th-ch/youtube-music/build.yml?branch=master&style=for-the-badge&logo=youtube-music" alt="Build status"></a> <a href="https://snyk.io/test/github/th-ch/youtube-music"><img src="https://img.shields.io/snyk/vulnerabilities/github/th-ch/youtube-music?style=for-the-badge" alt="Known Vulnerabilities"></a> <a href="https://GitHub.com/th-ch/youtube-music/releases/"><img src="https://img.shields.io/github/downloads/th-ch/youtube-music/total?style=for-the-badge&logo=youtube-music" alt="GitHub All Releases"></a> <a href="https://aur.archlinux.org/packages/youtube-music-bin"><img src="https://img.shields.io/aur/version/youtube-music-bin?color=blueviolet&style=for-the-badge&logo=youtube-music" alt="AUR"></a></p>
</div>
<p><img src="https://raw.githubusercontent.com/th-ch/youtube-music/master/web/screenshot.jpg" alt="Screenshot" title="Screenshot"></p>
<div align="center">
<a href="https://github.com/th-ch/youtube-music/releases/latest"> <img src="https://raw.githubusercontent.com/th-ch/youtube-music/master/web/youtube-music.svg?sanitize=true" width="400" height="100"> </a>
</div>
<p><strong>Electron wrapper around YouTube Music featuring:</strong></p>
<ul>
<li>Native look & feel, aims at keeping the original interface</li>
<li>Framework for custom plugins: change YouTube Music to your needs (style, content, features), enable/disable plugins in one click</li>
</ul>
<h2>Download</h2>
<p>You can check out the <a href="https://github.com/th-ch/youtube-music/releases/latest">latest release</a> to quickly find the latest version.</p>
<h3>Arch Linux</h3>
<p>Install the <code>youtube-music-bin</code> package from the AUR. For AUR installation instructions, take a look at this <a href="https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages">wiki page</a>.</p>
<h3>MacOS</h3>
<p>If you get an error "is damaged and can’t be opened." when launching the app, run the following in the Terminal:</p>
<pre><code class="language-bash">xattr -cr /Applications/YouTube\ Music.app
</code></pre>
<h3>Windows</h3>
<p>You can use the <a href="https://scoop.sh">Scoop package manager</a> to install the <code>youtube-music</code> package from the <a href="https://github.com/ScoopInstaller/Extras"><code>extras</code> bucket</a>.</p>
<pre><code class="language-bash">scoop bucket add extras
scoop install extras/youtube-music
</code></pre>
<p>Alternately you can use <a href="https://learn.microsoft.com/en-us/windows/package-manager/winget/">Winget</a>, Windows 11s official CLI package manager to install the <code>th-ch.YouTubeMusic</code> package.</p>
<p><em>Note: Microsoft Defender SmartScreen might block the installation since it is from an "unknown publisher". This is also true for the manual installation when trying to run the executable(.exe) after a manual download here on github (same file).</em></p>
<pre><code class="language-bash">winget install th-ch.YouTubeMusic
</code></pre>
<h4>How to install without a network connection? (in Windows)</h4>
<ul>
<li>Download the <code>*.nsis.7z</code> file for <em>your device architecture</em> in <a href="https://github.com/th-ch/youtube-music/releases/latest">release page</a>.
<ul>
<li><code>x64</code> for 64-bit Windows</li>
<li><code>ia32</code> for 32-bit Windows</li>
<li><code>arm64</code> for ARM64 Windows</li>
</ul> </li>
<li>Download installer in release page. (<code>*-Setup.exe</code>)</li>
<li>Place them in the <strong>same directory</strong>.</li>
<li>Run the installer.</li>
</ul>
<h2>Available plugins:</h2>
<ul>
<li> <p><strong>Ad Blocker</strong>: Block all ads and tracking out of the box</p> </li>
<li> <p><strong>Audio Compressor</strong>: Apply compression to audio (lowers the volume of the loudest parts of the signal and raises the volume of the softest parts)</p> </li>
<li> <p><strong>Blur Nav Bar</strong>: makes navigation bar transparent and blurry</p> </li>
<li> <p><strong>Bypass age restrictions</strong>: bypass YouTube's age verification</p> </li>
<li> <p><strong>Captions selector</strong>: Enable captions</p> </li>
<li> <p><strong>Compact sidebar</strong>: Always set the sidebar in compact mode</p> </li>
<li> <p><strong>Crossfade</strong>: Crossfade between songs</p> </li>
<li> <p><strong>Disable Autoplay</strong>: Makes every song start in "paused" mode</p> </li>
<li> <p><a href="https://discord.com/"><strong>Discord</strong></a>: Show your friends what you listen to with <a href="https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png">Rich Presence</a></p> </li>
<li> <p><strong>Downloader</strong>: downloads MP3 <a href="https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png">directly from the interface</a> <a href="https://github.com/ytdl-org/youtube-dl">(youtube-dl)</a></p> </li>
<li> <p><strong>Exponential Volume</strong>: Makes the volume slider <a href="https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/">exponential</a> so it's easier to select lower volumes.</p> </li>
<li> <p><strong>In-App Menu</strong>: <a href="https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png">gives bars a fancy, dark look</a></p>
<blockquote>
<p>(see <a href="https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709">this post</a> if you have problem accessing the menu after enabling this plugin and hide-menu option)</p>
</blockquote> </li>
<li> <p><a href="https://www.last.fm/"><strong>Last.fm</strong></a>: Scrobbles support</p> </li>
<li> <p><strong>Lyrics Genius</strong>: Adds lyrics support for most songs</p> </li>
<li> <p><strong>Navigation</strong>: Next/Back navigation arrows directly integrated in the interface, like in your favorite browser</p> </li>
<li> <p><strong>No Google Login</strong>: Remove Google login buttons and links from the interface</p> </li>
<li> <p><strong>Notifications</strong>: Display a notification when a song starts playing (<a href="https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png">interactive notifications</a> are available on windows)</p> </li>
<li> <p><strong>Picture in picture</strong>: allows to switch the app to picture-in-picture mode</p> </li>
<li> <p><strong>Playback Speed</strong>: Listen fast, listen slow! <a href="https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png">Adds a slider that controls song speed</a></p> </li>
<li> <p><strong>Precise Volume</strong>: Control the volume precisely using mousewheel/hotkeys, with a custom hud and customizable volume steps</p> </li>
<li> <p><strong>Quality Changer</strong>: Allows changing the video quality with a <a href="https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png">button</a> on the video overlay</p> </li>
<li> <p><strong>Shortcuts</strong>: Allows setting global hotkeys for playback (play/pause/next/previous) + disable <a href="https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png">media osd</a> by overriding media keys + enable Ctrl/CMD + F to search + enable linux mpris support for mediakeys + <a href="https://github.com/Araxeus/youtube-music/raw/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50">custom hotkeys</a> for <a href="https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902">advanced users</a></p> </li>
<li> <p><strong>Skip-Silences</strong> - Automatically skip silenced sections</p> </li>
<li> <p><a href="https://github.com/ajayyy/SponsorBlock"><strong>SponsorBlock</strong></a>: Automatically Skips non-music parts like intro/outro or parts of music videos where the song isn't playing</p> </li>
<li> <p><strong>Taskbar Media Control</strong>: Control playback from your <a href="https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png">Windows taskbar</a></p> </li>
<li> <p><strong>Touchbar</strong>: Custom TouchBar layout for macOS</p> </li>
<li> <p><strong>Tuna-OBS</strong>: Integration with <a href="https://obsproject.com/">OBS</a>'s plugin <a href="https://obsproject.com/forum/resources/tuna.843/">Tuna</a></p> </li>
<li> <p><strong>Video Toggle</strong>: Adds a <a href="https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png">button</a> to switch between Video/Song mode. can also optionally remove the whole video tab</p> </li>
<li> <p><strong>Visualizer</strong>: Different music visualizers</p> </li>
</ul>
<hr>
<ul>
<li><strong>Auto confirm when paused</strong> (Always Enabled): disable the <a href="https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png">"Continue Watching?"</a> popup that pause music after a certain time</li>
</ul>
<blockquote>
<p>If <code>Hide Menu</code> option is on - you can show the menu with the <kbd>alt</kbd> key (or <kbd>`</kbd> [backtick] if using the in-app-menu plugin)</p>
</blockquote>
<h2>Themes</h2>
<p>You can load CSS files to change the look of the application (Options > Visual Tweaks > Themes).</p>
<p>Some predefined themes are available in <a href="https://github.com/kerichdev/themes-for-ytmdesktop-player">https://github.com/kerichdev/themes-for-ytmdesktop-player</a>.</p>
<h2>Dev</h2>
<pre><code class="language-bash">git clone https://github.com/th-ch/youtube-music
cd youtube-music
npm ci
npm run start
</code></pre>
<h2>Build your own plugins</h2>
<p>Using plugins, you can:</p>
<ul>
<li>manipulate the app - the <code>BrowserWindow</code> from electron is passed to the plugin handler</li>
<li>change the front by manipulating the HTML/CSS</li>
</ul>
<h3>Creating a plugin</h3>
<p>Create a folder in <code>plugins/YOUR-PLUGIN-NAME</code>:</p>
<ul>
<li>if you need to manipulate the BrowserWindow, create a file with the following template:</li>
</ul>
<pre><code class="language-typescript">// file: back.ts
export default (win: Electron.BrowserWindow, config: ConfigType<'YOUR-PLUGIN-NAME'>) => {
// something
};
</code></pre>
<p>then, register the plugin in <code>index.ts</code>:</p>
<pre><code class="language-typescript">import yourPlugin from './plugins/YOUR-PLUGIN-NAME/back';
// ...
const mainPlugins = {
// ...
'YOUR-PLUGIN-NAME': yourPlugin,
};
</code></pre>
<ul>
<li>if you need to change the front, create a file with the following template:</li>
</ul>
<pre><code class="language-typescript">// file: front.ts
export default (config: ConfigType<'YOUR-PLUGIN-NAME'>) => {
// This function will be called as a preload script
// So you can use front features like `document.querySelector`
};
</code></pre>
<p>then, register the plugin in <code>preload.ts</code>:</p>
<pre><code class="language-typescript">import yourPlugin from './plugins/YOUR-PLUGIN-NAME/front';
const rendererPlugins: PluginMapper<'renderer'> = {
// ...
'YOUR-PLUGIN-NAME': yourPlugin,
};
</code></pre>
<h3>Common use cases</h3>
<ul>
<li>injecting custom CSS: create a <code>style.css</code> file in the same folder then:</li>
</ul>
<pre><code class="language-typescript">import path from 'node:path';
import { injectCSS } from '../utils';
// back.ts
export default (win: Electron.BrowserWindow) => {
injectCSS(win.webContents, path.join(__dirname, 'style.css'));
};
</code></pre>
<ul>
<li>changing the HTML:</li>
</ul>
<pre><code class="language-typescript">// front.ts
export default () => {
// Remove the login button
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
};
</code></pre>
<ul>
<li>communicating between the front and back: can be done using the ipcMain module from electron. See <code>utils.js</code> file and example in <code>navigation</code> plugin.</li>
</ul>
<h2>Build</h2>
<ol>
<li>Clone the repo</li>
<li>Run <code>npm i</code> to install dependencies</li>
<li>Run <code>npm run build:OS</code></li>
</ol>
<ul>
<li><code>npm run dist:win</code> - Windows</li>
<li><code>npm run dist:linux</code> - Linux</li>
<li><code>npm run dist:mac</code> - MacOS</li>
</ul>
<p>Builds the app for macOS, Linux, and Windows, using <a href="https://github.com/electron-userland/electron-builder">electron-builder</a>.</p>
<h2>Tests</h2>
<pre><code class="language-bash">npm run test
</code></pre>
<p>Uses <a href="https://playwright.dev/">Playwright</a> to test the app.</p>
<h2>License</h2>
<p>MIT © <a href="https://github.com/th-ch/youtube-music">th-ch</a></p>
- Vanessa219/vditor
- 2023-10-10T01:42:12Z
- tag:github.com,2023-10-10:/Vanessa219/vditor
-
- <p>♏ 一款浏览器端的 Markdown 编辑器,支持所见即所得(富文本)、即时渲染(类似 Typora)和分屏预览模式。An In-browser Markdown editor, support WYSIWYG (Rich Text), Instant Rendering (Typora-like) and Split View modes.</p><hr><p align="center"> <img alt="Vditor" src="https://b3log.org/images/brand/vditor-128.png"> <br> 易于使用的 Markdown 编辑器,为适配不同的应用场景而生 <br><br> <a title="MIT" target="_blank" href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-orange.svg?style=flat-square"></a> <a title="npm bundle size" target="_blank" href="https://www.npmjs.com/package/vditor"><img alt="npm bundle size" src="https://img.shields.io/bundlephobia/minzip/vditor?style=flat-square&color=blueviolet"></a> <a title="Version" target="_blank" href="https://www.npmjs.com/package/vditor"><img src="https://img.shields.io/npm/v/vditor.svg?style=flat-square"></a><br> <a title="Downloads" target="_blank" href="https://www.npmjs.com/package/vditor"><img src="https://img.shields.io/npm/dt/vditor.svg?style=flat-square&color=97ca00"></a> <a title="jsdelivr" target="_blank" href="https://www.jsdelivr.com/package/npm/vditor"><img src="https://data.jsdelivr.com/v1/package/npm/vditor/badge"></a> <a title="Hits" target="_blank" href="https://github.com/88250/hits"><img src="https://hits.b3log.org/Vanessa219/vditor.svg?sanitize=true"></a> <br><br> <a title="GitHub Watchers" target="_blank" href="https://github.com/Vanessa219/vditor/watchers"><img src="https://img.shields.io/github/watchers/Vanessa219/vditor.svg?label=Watchers&style=social"></a> <a title="GitHub Stars" target="_blank" href="https://github.com/Vanessa219/vditor/stargazers"><img src="https://img.shields.io/github/stars/Vanessa219/vditor.svg?label=Stars&style=social"></a> <a title="GitHub Forks" target="_blank" href="https://github.com/Vanessa219/vditor/network/members"><img src="https://img.shields.io/github/forks/Vanessa219/vditor.svg?label=Forks&style=social"></a> <a title="Author GitHub Followers" target="_blank" href="https://github.com/vanessa219"><img src="https://img.shields.io/github/followers/vanessa219.svg?label=Followers&style=social"></a> </p>
<p align="center"> <a href="https://github.com/Vanessa219/vditor/raw/master/README_en_US.md">English</a> | <a href="https://b3log.org/vditor/demo/index.html">Demo</a> </p>
<h2>💡 简介</h2>
<p><a href="https://b3log.org/vditor">Vditor</a> 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript 以及 Vue、React、Angular 和 Svelte 等框架。</p>
<p>欢迎到 <a href="https://ld246.com/tag/vditor">Vditor 官方讨论区</a>了解更多。同时也欢迎关注 B3log 开源社区微信公众号 <code>B3log开源</code>:</p>
<p><img src="https://b3logfile.com/file/2020/08/b3logos-032af045.jpg" alt="b3logos.jpg"></p>
<h2>🗺️ 背景</h2>
<p>随着 Markdown 排版方式的普及,越来越多的应用开始集成 Markdown 编辑器。目前主流可集成的 Markdown 编辑器现状如下:</p>
<ul>
<li>有的仅支持分屏预览,即编辑区和预览区分离</li>
<li>有的同时支持所见即所得和分屏预览,但所见即所得模式下不能完整支持 Markdown 语法排版</li>
<li>几乎没有类似 Typora 的即时渲染</li>
</ul>
<p>而这三点恰好对应了三种应用场景:</p>
<ul>
<li>分屏预览:适配传统的 Markdown 使用场景,适合大屏下编辑排版</li>
<li>所见即所得:对不熟悉 Markdown 的用户友好,熟悉 Markdown 的用户也可以无缝使用</li>
<li>即时渲染:理论上这是最为优雅的 Markdown 编辑方式,让熟悉 Markdown 的用户能够更专注于内容创作</li>
</ul>
<p>所以,一个能够<strong>适配应用场景</strong>的 Markdown 编辑器至关重要,它需要考虑到:</p>
<ul>
<li>传统 Markdown 用户的使用场景,提供分屏预览</li>
<li>富文本编辑用户的使用场景,提供所见即所得</li>
<li>高阶 Markdown 用户的使用场景,提供即时渲染</li>
</ul>
<p>Vditor 在这些方面做了努力,希望能为现代化的通用 Markdown 编辑领域做出一些贡献。</p>
<h2>✨ 特性</h2>
<ul>
<li>支持三种编辑模式:所见即所得(wysiwyg)、即时渲染(ir)、分屏预览(sv)</li>
<li>支持大纲、数学公式、脑图、图表、流程图、甘特图、时序图、五线谱、<a href="https://ld246.com/article/1589813914768">多媒体</a>、语音阅读、标题锚点、代码高亮及复制、graphviz 渲染、<a href="https://plantuml.com">plantuml</a>UML图</li>
<li>导出、图片懒加载、任务列表、多平台预览、多主题切换、复制到微信公众号/知乎功能</li>
<li>实现 CommonMark 和 GFM 规范,可对 Markdown 进行格式化和语法树查看,并支持<a href="https://ld246.com/article/1549638745630#options-preview-markdown">10+项</a>配置</li>
<li>工具栏包含 36+ 项操作,除支持扩展外还可对每一项中的<a href="https://ld246.com/article/1582778815353">快捷键</a>、提示、提示位置、图标、点击事件、类名、子工具栏进行自定义</li>
<li>表情/at/话题等自动补全扩展</li>
<li>可使用拖拽、剪切板粘贴上传,显示实时上传进度,支持 CORS 跨域上传</li>
<li>实时保存内容,防止意外丢失</li>
<li>录音支持,用户可直接发布语音</li>
<li>粘贴 HTML 自动转换为 Markdown,如粘贴中包含外链图片可通过指定接口上传到服务器</li>
<li>支持主窗口大小拖拽、字符计数</li>
<li>多主题支持,内置黑白绿三套主题</li>
<li>多语言支持,内置中、英、韩文本地化</li>
<li>支持主流浏览器,对移动端友好</li>
</ul>
<p><img src="https://b3logfile.com/file/2020/07/editor-b304aa97.png" alt="editor.png"></p>
<p><img src="https://b3logfile.com/file/2020/05/preview-80846f66.png" alt="preview.png"></p>
<h2>🔮 编辑模式</h2>
<h3>所见即所得(WYSIWYG)</h3>
<p><em>所见即所得</em>模式对不熟悉 Markdown 的用户较为友好,熟悉 Markdown 的话也可以无缝使用。</p>
<p><img src="https://b3logfile.com/file/2020/07/wysiwyg-4f216b9b.gif" alt="vditor-wysiwyg"></p>
<h3>即时渲染(IR)</h3>
<p><em>即时渲染</em>模式对熟悉 Typora 的用户应该不会感到陌生,理论上这是最优雅的 Markdown 编辑方式。</p>
<p><img src="https://b3logfile.com/file/2020/07/ir-67cd956c.gif" alt="vditor-ir"></p>
<h3>分屏预览(SV)</h3>
<p>传统的<em>分屏预览</em>模式适合大屏下的 Markdown 编辑。</p>
<p><img src="https://b3logfile.com/file/2020/07/sv-595dcb28.gif" alt="vditor-sv"></p>
<h2>🍱 语法支持</h2>
<ul>
<li>所有 CommonMark 语法:分隔线、ATX 标题、Setext 标题、缩进代码块、围栏代码块、HTML 块、链接引用定义、段落、块引用、列表、反斜杠转义、HTML 实体、行级代码、强调、加粗、链接、图片、行级 HTML、硬换行、软换行和纯文本。</li>
<li>所有 GFM 语法:表格、任务列表项、删除线、自动链接、XSS 过滤</li>
<li>常用 Markdown 扩展语法:脚注、ToC、自定义标题 ID</li>
<li>图表语法
<ul>
<li>流程图、时序图、甘特图,通过 Mermaid 支持</li>
<li>Graphviz</li>
<li>折线图、饼图、脑图等,通过 ECharts 支持</li>
</ul> </li>
<li>五线谱:通过 abc.js 支持</li>
<li>数学公式:数学公式块、行级数学公式,通过 MathJax 和 KaTeX 支持</li>
<li>YAML Front Matter</li>
<li>中文语境优化
<ul>
<li>中西文之间插入空格</li>
<li>术语拼写修正</li>
<li>中文后跟英文逗号句号等标点替换为中文对应标点</li>
</ul> </li>
</ul>
<p>以上大部分特性可以通过开关配置是否启用,开发者可根据自己的应用场景选择搭配。</p>
<h2>🗃 案例</h2>
<ul>
<li><a href="https://github.com/88250/symphony">Sym</a> 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台</li>
<li><a href="https://github.com/88250/solo">Solo</a> & <a href="https://github.com/88250/pipe">Pipe</a> B3log 分布式社区的博客端节点,欢迎加入下一代社区网络</li>
<li><a href="https://tditor.com">Tditor</a> 基于React、Vditor、Springboot, 一款打造极致文字创作体验的在线Markdown编辑平台</li>
<li><a href="https://github.com/nicejade/markdown-online-editor">Arya</a> 基于 Vue、Vditor,所构建的在线 Markdown 编辑器</li>
<li><a href="https://github.com/Vanessa219/vditor/network/dependents?package_id=UGFja2FnZS0zMTY2Mzg4MzE%3D">更多案例</a></li>
</ul>
<h2>🛠️ 使用文档</h2>
<h3>CommonJS</h3>
<ul>
<li>安装依赖</li>
</ul>
<pre><code class="language-shell">npm install vditor --save
</code></pre>
<ul>
<li>在代码中引入并初始化对象,可参考 <a href="https://github.com/Vanessa219/vditor/raw/master/demo/index.js">index.js</a></li>
</ul>
<pre><code class="language-ts">import Vditor from 'vditor'
import "~vditor/src/assets/less/index"
const vditor = new Vditor(id, {options...})
</code></pre>
<h3>HTML script</h3>
<ul>
<li>在 HTML 中插入 CSS 和 JavaScript,可参考 <a href="https://b3log.org/vditor/demo/index.html">demo</a></li>
</ul>
<pre><code class="language-html"><!-- ⚠️生产环境请指定版本号,如 https://unpkg.com/vditor@x.x.x/dist... -->
<link rel="stylesheet" href="https://unpkg.com/vditor/dist/index.css" />
<script src="https://unpkg.com/vditor/dist/index.min.js"></script>
</code></pre>
<h3>示例代码</h3>
<ul>
<li><a href="https://b3log.org/vditor/demo/index.html">官方示例</a> / <a href="https://github.com/Vanessa219/b3log-index/tree/master/src/vditor">示例源码</a></li>
<li><a href="https://github.com/Vanessa219/vditor/raw/master/demo/index.js">CommonJS Editor</a></li>
<li><a href="https://github.com/Vanessa219/vditor/raw/master/demo/render.js">CommonJS Render</a></li>
<li><a href="https://github.com/HerbertHe/svelte-vditor-demo">在Svelte中使用</a></li>
</ul>
<h3>主题</h3>
<h4>编辑器主题</h4>
<p>编辑器所展现的外观。内置classic,dark 2 套主题。</p>
<ul>
<li>编辑器初始化时可通过 <code>options.theme</code> 设置内置主题</li>
<li>初始化完成后可通过 <code>setTheme</code> 更新编辑器主题</li>
<li>可通过修改 <a href="https://github.com/Vanessa219/vditor/raw/master/src/assets/less/index.less">index.less</a> 中的变量对主题颜色进行定制</li>
<li>可参考现有结构和类名在原有基础上进行修改</li>
</ul>
<h4>内容主题</h4>
<p>Markdown 输出的 HTML 所展现的外观。内置 ant-design, light,dark,wechat 4 套主题。支持内容主题扩展接口。</p>
<ul>
<li>需在显示元素上添加 <code>class="vditor-reset"</code></li>
<li>编辑器初始化时可通过 <code>options.preview.theme</code> 设置内置或自己开发的主题列表</li>
<li>内容渲染初始化时可通过 <code>IPreviewOptions.theme</code> 设置内置或自己开发的主题</li>
<li>初始化完成后可通过 <code>setTheme</code> 或 <code>setContentTheme</code> 更新内容主题</li>
</ul>
<h4>代码主题</h4>
<p>代码块所展现的外观。内置 github 等 36 套主题。</p>
<ul>
<li>编辑器初始化时可通过 <code>options.preview.hljs</code> 对代码块样式、行号、是否启用进行设置</li>
<li>内容渲染初始化时可通过 <code>IPreviewOptions.hljs</code> 对代码块样式、行号、是否启用进行设置</li>
<li>初始化完成后可通过 <code>setTheme</code> 或 <code>setCodeTheme</code> 更新代码主题</li>
</ul>
<h3>API</h3>
<h4>id</h4>
<p>可填入元素 <code>id</code> 或元素自身 <code>HTMLElement</code></p>
<p>⚠️:当填入元素自身的 <code>HTMLElement</code> 时需设置 <code>options.cache.id</code> 或将 <code>options.cache.enable</code> 设置为 <code>false</code></p>
<h4>options</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>i18n</td>
<td>多语言,参见 ITips</td>
<td>-</td>
</tr>
<tr>
<td>undoDelay</td>
<td>历史记录间隔</td>
<td>-</td>
</tr>
<tr>
<td>after</td>
<td>编辑器异步渲染完成后的回调方法</td>
<td>-</td>
</tr>
<tr>
<td>height</td>
<td>编辑器总高度</td>
<td>'auto'</td>
</tr>
<tr>
<td>minHeight</td>
<td>编辑区域最小高度</td>
<td>-</td>
</tr>
<tr>
<td>width</td>
<td>编辑器总宽度,支持 %</td>
<td>'auto'</td>
</tr>
<tr>
<td>placeholder</td>
<td>输入区域为空时的提示</td>
<td>''</td>
</tr>
<tr>
<td>lang</td>
<td>语言种类:en_US, fr_FR, pt_BR, ja_JP, ko_KR, ru_RU, sv_SE, zh_CN, zh_TW</td>
<td>'zh_CN'</td>
</tr>
<tr>
<td>input(value: string)</td>
<td>输入后触发</td>
<td>-</td>
</tr>
<tr>
<td>focus(value: string)</td>
<td>聚焦后触发</td>
<td>-</td>
</tr>
<tr>
<td>blur(value: string)</td>
<td>失焦后触发</td>
<td>-</td>
</tr>
<tr>
<td>keydown(event: KeyboardEvent)</td>
<td>按下后触发</td>
<td>-</td>
</tr>
<tr>
<td>esc(value: string)</td>
<td><kbd>esc</kbd> 按下后触发</td>
<td>-</td>
</tr>
<tr>
<td>ctrlEnter(value: string)</td>
<td><kbd>⌘/ctrl+enter</kbd> 按下后触发</td>
<td>-</td>
</tr>
<tr>
<td>select(value: string)</td>
<td>编辑器中选中文字后触发</td>
<td>-</td>
</tr>
<tr>
<td>tab</td>
<td><kbd>tab</kbd> 键操作字符串,支持 <code>\t</code> 及任意字符串</td>
<td>-</td>
</tr>
<tr>
<td>typewriterMode</td>
<td>是否启用打字机模式</td>
<td>false</td>
</tr>
<tr>
<td>cdn</td>
<td>配置自建 CDN 地址</td>
<td><code>https://unpkg.com/vditor@${VDITOR_VERSION}</code></td>
</tr>
<tr>
<td>mode</td>
<td>可选模式:sv, ir, wysiwyg</td>
<td>'ir'</td>
</tr>
<tr>
<td>debugger</td>
<td>是否显示日志</td>
<td>false</td>
</tr>
<tr>
<td>value</td>
<td>编辑器初始化值</td>
<td>''</td>
</tr>
<tr>
<td>theme</td>
<td>主题:classic, dark</td>
<td>'classic'</td>
</tr>
<tr>
<td>icon</td>
<td>图标风格:ant, material</td>
<td>'ant'</td>
</tr>
</tbody>
</table>
<h4>options.toolbar</h4>
<ul>
<li>工具栏,可使用 name 进行简写: <code>toolbar: ['emoji', 'br', 'bold', '|', 'line']</code> 。默认值参见 <a href="https://github.com/Vanessa219/vditor/raw/master/src/ts/util/Options.ts">src/ts/util/Options.ts</a></li>
<li>name 可枚举为: <code>emoji</code> , <code>headings</code> , <code>bold</code> , <code>italic</code> , <code>strike</code> , <code>|</code> , <code>line</code> , <code>quote</code> , <code>list</code> , <code>ordered-list</code> , <code>check</code> ,<code>outdent</code> ,<code>indent</code> , <code>code</code> , <code>inline-code</code> , <code>insert-after</code> , <code>insert-before</code> ,<code>undo</code> , <code>redo</code> , <code>upload</code> , <code>link</code> , <code>table</code> , <code>record</code> , <code>edit-mode</code> , <code>both</code> , <code>preview</code> , <code>fullscreen</code> , <code>outline</code> , <code>code-theme</code> , <code>content-theme</code> , <code>export</code>, <code>devtools</code> , <code>info</code> , <code>help</code> , <code>br</code></li>
<li>当 <code>name</code> 不在枚举中时,可以添加自定义按钮,格式如下:</li>
</ul>
<pre><code class="language-js">new Vditor('vditor', {
toolbar: [
{
hotkey: '⇧⌘S',
name: 'sponsor',
tipPosition: 's',
tip: '成为赞助者',
className: 'right',
icon: '<svg t="1589994565028" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2808" width="32" height="32"><path d="M506.6 423.6m-29.8 0a29.8 29.8 0 1 0 59.6 0 29.8 29.8 0 1 0-59.6 0Z" fill="#0F0F0F" p-id="2809"></path><path d="M717.8 114.5c-83.5 0-158.4 65.4-211.2 122-52.7-56.6-127.7-122-211.2-122-159.5 0-273.9 129.3-273.9 288.9C21.5 562.9 429.3 913 506.6 913s485.1-350.1 485.1-509.7c0.1-159.5-114.4-288.8-273.9-288.8z" fill="#FAFCFB" p-id="2810"></path><path d="M506.6 926c-22 0-61-20.1-116-59.6-51.5-37-109.9-86.4-164.6-139-65.4-63-217.5-220.6-217.5-324 0-81.4 28.6-157.1 80.6-213.1 53.2-57.2 126.4-88.8 206.3-88.8 40 0 81.8 14.1 124.2 41.9 28.1 18.4 56.6 42.8 86.9 74.2 30.3-31.5 58.9-55.8 86.9-74.2 42.5-27.8 84.3-41.9 124.2-41.9 79.9 0 153.2 31.5 206.3 88.8 52 56 80.6 131.7 80.6 213.1 0 103.4-152.1 261-217.5 324-54.6 52.6-113.1 102-164.6 139-54.8 39.5-93.8 59.6-115.8 59.6zM295.4 127.5c-72.6 0-139.1 28.6-187.3 80.4-47.5 51.2-73.7 120.6-73.7 195.4 0 64.8 78.3 178.9 209.6 305.3 53.8 51.8 111.2 100.3 161.7 136.6 56.1 40.4 88.9 54.8 100.9 54.8s44.7-14.4 100.9-54.8c50.5-36.3 108-84.9 161.7-136.6 131.2-126.4 209.6-240.5 209.6-305.3 0-74.9-26.2-144.2-73.7-195.4-48.2-51.9-114.7-80.4-187.3-80.4-61.8 0-127.8 38.5-201.7 117.9-2.5 2.6-5.9 4.1-9.5 4.1s-7.1-1.5-9.5-4.1C423.2 166 357.2 127.5 295.4 127.5z" fill="#141414" p-id="2811"></path><path d="M353.9 415.6m-33.8 0a33.8 33.8 0 1 0 67.6 0 33.8 33.8 0 1 0-67.6 0Z" fill="#0F0F0F" p-id="2812"></path><path d="M659.3 415.6m-33.8 0a33.8 33.8 0 1 0 67.6 0 33.8 33.8 0 1 0-67.6 0Z" fill="#0F0F0F" p-id="2813"></path><path d="M411.6 538.5c0 52.3 42.8 95 95 95 52.3 0 95-42.8 95-95v-31.7h-190v31.7z" fill="#5B5143" p-id="2814"></path><path d="M506.6 646.5c-59.6 0-108-48.5-108-108v-31.7c0-7.2 5.8-13 13-13h190.1c7.2 0 13 5.8 13 13v31.7c0 59.5-48.5 108-108.1 108z m-82-126.7v18.7c0 45.2 36.8 82 82 82s82-36.8 82-82v-18.7h-164z" fill="#141414" p-id="2815"></path><path d="M450.4 578.9a54.7 27.5 0 1 0 109.4 0 54.7 27.5 0 1 0-109.4 0Z" fill="#EA64F9" p-id="2816"></path><path d="M256 502.7a32.1 27.5 0 1 0 64.2 0 32.1 27.5 0 1 0-64.2 0Z" fill="#EFAFF9" p-id="2817"></path><path d="M703.3 502.7a32.1 27.5 0 1 0 64.2 0 32.1 27.5 0 1 0-64.2 0Z" fill="#EFAFF9" p-id="2818"></path></svg>',
click () {alert('捐赠地址:https://ld246.com/sponsor')},
}],
})
</code></pre>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>name</td>
<td>唯一标示</td>
<td>-</td>
</tr>
<tr>
<td>icon</td>
<td>svg 图标</td>
<td>-</td>
</tr>
<tr>
<td>tip</td>
<td>提示</td>
<td>-</td>
</tr>
<tr>
<td>tipPosition</td>
<td>提示位置:'n', 'ne', 'nw', 's', 'se', 'sw', 'w', 'e'</td>
<td>-</td>
</tr>
<tr>
<td>hotkey</td>
<td>快捷键,格式为<kbd>⇧⌘</kbd>/<kbd>⌘</kbd>/<kbd>⌥⌘</kbd></td>
<td>-</td>
</tr>
<tr>
<td>suffix</td>
<td>插入编辑器中的后缀</td>
<td>-</td>
</tr>
<tr>
<td>prefix</td>
<td>插入编辑器中的前缀</td>
<td>-</td>
</tr>
<tr>
<td>click(event: Event, vditor: IVditor)</td>
<td>自定义按钮点击时触发的事件</td>
<td>-</td>
</tr>
<tr>
<td>className</td>
<td>样式名</td>
<td>''</td>
</tr>
<tr>
<td>toolbar?: Array<options.toolbar></td>
<td>子菜单</td>
<td>-</td>
</tr>
</tbody>
</table>
<h4>options.toolbarConfig</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>hide</td>
<td>是否隐藏工具栏</td>
<td>false</td>
</tr>
<tr>
<td>pin</td>
<td>是否固定工具栏</td>
<td>false</td>
</tr>
</tbody>
</table>
<h4>options.counter</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>enable</td>
<td>是否启用计数器</td>
<td>false</td>
</tr>
<tr>
<td>after(length: number, counter: options.counter): void</td>
<td>字数统计回调</td>
<td>-</td>
</tr>
<tr>
<td>max</td>
<td>允许输入的最大值</td>
<td>-</td>
</tr>
<tr>
<td>type</td>
<td>统计类型:'markdown', 'text'</td>
<td>'markdown'</td>
</tr>
</tbody>
</table>
<h4>options.cache</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>enable</td>
<td>是否使用 localStorage 进行缓存</td>
<td>true</td>
</tr>
<tr>
<td>id</td>
<td>缓存 key,第一个参数为元素且启用缓存时<strong>必填</strong></td>
<td>-</td>
</tr>
<tr>
<td>after(html: string): string</td>
<td>缓存后的回调</td>
<td>-</td>
</tr>
</tbody>
</table>
<h4>options.comment</h4>
<p>⚠️:仅支持 wysiwyg 模式</p>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>enable</td>
<td>是否启用评论模式</td>
<td>false</td>
</tr>
<tr>
<td>add(id: string, text: string, commentsData: ICommentsData[])</td>
<td>添加评论回调</td>
<td>-</td>
</tr>
<tr>
<td>remove(ids: string[])</td>
<td>删除评论回调</td>
<td>-</td>
</tr>
<tr>
<td>scroll(top: number)</td>
<td>滚动回调</td>
<td>-</td>
</tr>
<tr>
<td>adjustTop(commentsData: ICommentsData[])</td>
<td>文档修改时,适配评论高度</td>
<td>-</td>
</tr>
</tbody>
</table>
<h4>options.preview</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>delay</td>
<td>预览 debounce 毫秒间隔</td>
<td>1000</td>
</tr>
<tr>
<td>maxWidth</td>
<td>预览区域最大宽度</td>
<td>800</td>
</tr>
<tr>
<td>mode</td>
<td>显示模式:both, editor</td>
<td>'both'</td>
</tr>
<tr>
<td>url</td>
<td>md 解析请求</td>
<td>-</td>
</tr>
<tr>
<td>parse(element: HTMLElement)</td>
<td>预览回调</td>
<td>-</td>
</tr>
<tr>
<td>transform(html: string): string</td>
<td>渲染之前回调</td>
<td>-</td>
</tr>
</tbody>
</table>
<h4>options.preview.hljs</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>defaultLang</td>
<td>未指定语言时默认使用该语言</td>
<td>''</td>
</tr>
<tr>
<td>enable</td>
<td>是否启用代码高亮</td>
<td>true</td>
</tr>
<tr>
<td>style</td>
<td>可选值参见<a href="https://xyproto.github.io/splash/docs/longer/all.html">Chroma</a></td>
<td><code>github</code></td>
</tr>
<tr>
<td>lineNumber</td>
<td>是否启用行号</td>
<td>false</td>
</tr>
<tr>
<td>langs</td>
<td>自定义指定语言</td>
<td><a href="https://github.com/Vanessa219/vditor/raw/53ca8f9a0e511b37b5dae7c6b15eb933e9e02ccd/src/ts/constants.ts#L20">CODE_LANGUAGES</a></td>
</tr>
</tbody>
</table>
<h4>options.preview.markdown</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>autoSpace</td>
<td>自动空格</td>
<td>false</td>
</tr>
<tr>
<td>gfmAutoLink</td>
<td>自动链接</td>
<td>true</td>
</tr>
<tr>
<td>fixTermTypo</td>
<td>自动矫正术语</td>
<td>false</td>
</tr>
<tr>
<td>toc</td>
<td>插入目录</td>
<td>false</td>
</tr>
<tr>
<td>footnotes</td>
<td>脚注</td>
<td>true</td>
</tr>
<tr>
<td>codeBlockPreview</td>
<td>wysiwyg 和 ir 模式下是否对代码块进行渲染</td>
<td>true</td>
</tr>
<tr>
<td>mathBlockPreview</td>
<td>wysiwyg 和 ir 模式下是否对数学公式进行渲染</td>
<td>true</td>
</tr>
<tr>
<td>paragraphBeginningSpace</td>
<td>段落开头空两个</td>
<td>false</td>
</tr>
<tr>
<td>sanitize</td>
<td>是否启用过滤 XSS</td>
<td>true</td>
</tr>
<tr>
<td>listStyle</td>
<td>为列表添加 data-style 属性</td>
<td>false</td>
</tr>
<tr>
<td>linkBase</td>
<td>链接相对路径前缀</td>
<td>''</td>
</tr>
<tr>
<td>linkPrefix</td>
<td>链接强制前缀</td>
<td>''</td>
</tr>
<tr>
<td>mark</td>
<td>启用 mark 标记</td>
<td>false</td>
</tr>
</tbody>
</table>
<h4>options.preview.theme</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>current</td>
<td>当前主题</td>
<td>"light"</td>
</tr>
<tr>
<td>list</td>
<td>可选主题列表</td>
<td>{ "ant-design": "Ant Design", dark: "Dark", light: "Light", wechat: "WeChat" }</td>
</tr>
<tr>
<td>path</td>
<td>主题样式地址</td>
<td><code>https://unpkg.com/vditor@${VDITOR_VERSION}/dist/css/content-theme</code></td>
</tr>
</tbody>
</table>
<h4>options.preview.math</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>inlineDigit</td>
<td>内联数学公式起始 $ 后是否允许数字</td>
<td>false</td>
</tr>
<tr>
<td>macros</td>
<td>使用 MathJax 渲染时传入的宏定义</td>
<td>{}</td>
</tr>
<tr>
<td>engine</td>
<td>数学公式渲染引擎:KaTeX, MathJax</td>
<td>'KaTeX'</td>
</tr>
<tr>
<td>mathJaxOptions</td>
<td>数学公式渲染引擎为 MathJax 时的参数</td>
<td>-</td>
</tr>
</tbody>
</table>
<h4>options.preview.actions?: Array<IPreviewAction | IPreviewActionCustom></h4>
<p>默认值为 ["desktop", "tablet", "mobile", "mp-wechat", "zhihu"]。 可从默认值中挑选进行配置,也可使用以下字段进行自定制开发。</p>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>key</td>
<td>按钮唯一标识,不能为空</td>
<td>-</td>
</tr>
<tr>
<td>text</td>
<td>按钮文字</td>
<td>-</td>
</tr>
<tr>
<td>tooltip</td>
<td>提示</td>
<td>-</td>
</tr>
<tr>
<td>className</td>
<td>按钮类名</td>
<td>-</td>
</tr>
<tr>
<td>click(key: string)</td>
<td>按钮点击回调事件</td>
<td>-</td>
</tr>
</tbody>
</table>
<h4>options.image</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>isPreview</td>
<td>是否预览图片</td>
<td>true</td>
</tr>
<tr>
<td>preview(bom: Element) => void</td>
<td>图片预览处理</td>
<td>-</td>
</tr>
</tbody>
</table>
<h4>options.link</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>isOpen</td>
<td>是否打开链接地址</td>
<td>true</td>
</tr>
<tr>
<td>click(bom: Element) => void</td>
<td>点击链接事件</td>
<td>-</td>
</tr>
</tbody>
</table>
<h4>options.hint</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>parse</td>
<td>是否进行 md 解析</td>
<td>true</td>
</tr>
<tr>
<td>delay</td>
<td>提示 debounce 毫秒间隔</td>
<td>200</td>
</tr>
<tr>
<td>emoji</td>
<td>默认表情,可从<a href="https://github.com/88250/lute/raw/master/parse/emoji_map.go">lute/emoji_map</a> 中选取,也可自定义</td>
<td>{ '+1': '👍', '-1': '👎', 'heart': '❤️', 'cold_sweat': '😰' }</td>
</tr>
<tr>
<td>emojiTail</td>
<td>常用表情提示</td>
<td>-</td>
</tr>
<tr>
<td>emojiPath</td>
<td>表情图片地址</td>
<td><code>https://unpkg.com/vditor@${VDITOR_VERSION}/dist/images/emoji</code></td>
</tr>
<tr>
<td>extend: IHintExtend[]</td>
<td>对 @/话题等关键字自动补全的扩展</td>
<td>[]</td>
</tr>
</tbody>
</table>
<pre><code class="language-ts">interface IHintData {
html: string;
value: string;
}
interface IHintExtend {
key: string;
hint?(value: string): IHintData[] | Promise<IHintData[]>;
}
</code></pre>
<h4>options.upload</h4>
<ul>
<li>文件上传的数据结构如下。后端返回的数据结构不一致时,可使用 <code>format</code> 进行转换。</li>
</ul>
<pre><code class="language-js">// POST data
xhr.send(formData); // formData = FormData.append("file[]", File)
// return data
{
"msg": "",
"code": 0,
"data": {
"errFiles": ['filename', 'filename2'],
"succMap": {
"filename3": "filepath3",
"filename3": "filepath3"
}
}
}
</code></pre>
<ul>
<li>为了防止站外图片失效, <code>linkToImgUrl</code> 可将剪贴板中的站外图片地址传到服务器端进行保存处理,其数据结构如下:</li>
</ul>
<pre><code class="language-js">// POST data
xhr.send(JSON.stringify({url: src})); // src 为站外图片地址
// return data
{
msg: '',
code: 0,
data : {
originalURL: '',
url: ''
}
}
</code></pre>
<ul>
<li><code>success</code>,<code>format</code>,<code>error</code> 不会同时触发,具体调用情况如下:</li>
</ul>
<pre><code class="language-js">if (xhr.status === 200) {
if (vditor.options.upload.success) {
vditor.options.upload.success(editorElement, xhr.responseText);
} else {
let responseText = xhr.responseText;
if (vditor.options.upload.format) {
responseText = vditor.options.upload.format(files as File [], xhr.responseText);
}
genUploadedLabel(responseText, vditor);
}
} else {
if (vditor.options.upload.error) {
vditor.options.upload.error(xhr.responseText);
} else {
vditor.tip.show(xhr.responseText);
}
}
</code></pre>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>url</td>
<td>上传 url,为空则不会触发上传相关事件</td>
<td>''</td>
</tr>
<tr>
<td>max</td>
<td>上传文件最大 Byte</td>
<td>10 * 1024 * 1024</td>
</tr>
<tr>
<td>linkToImgUrl</td>
<td>剪切板中包含图片地址时,使用此 url 重新上传</td>
<td>''</td>
</tr>
<tr>
<td>linkToImgCallback(responseText: string)</td>
<td>图片地址上传回调</td>
<td>-</td>
</tr>
<tr>
<td>linkToImgFormat(responseText: string): string</td>
<td>对图片地址上传的返回值进行格式化</td>
<td>-</td>
</tr>
<tr>
<td>success(editor: HTMLPreElement, msg: string)</td>
<td>上传成功回调</td>
<td>-</td>
</tr>
<tr>
<td>error(msg: string)</td>
<td>上传失败回调</td>
<td>-</td>
</tr>
<tr>
<td>token</td>
<td>CORS 上传验证,头为 X-Upload-Token</td>
<td>-</td>
</tr>
<tr>
<td>withCredentials</td>
<td>跨站点访问控制</td>
<td>false</td>
</tr>
<tr>
<td>headers</td>
<td>请求头设置</td>
<td>-</td>
</tr>
<tr>
<td>filename(name: string): string</td>
<td>文件名安全处理</td>
<td>name => name.replace(/\W/g, '')</td>
</tr>
<tr>
<td>accept</td>
<td>文件上传类型,同<a href="https://www.w3schools.com/tags/att_input_accept.asp">input accept</a></td>
<td>-</td>
</tr>
<tr>
<td>validate(files: File[]) => string | boolean</td>
<td>校验,成功时返回 true 否则返回错误信息</td>
<td>-</td>
</tr>
<tr>
<td>handler(files: File[]) => string | null | Promise
<string>
| Promise
<null></null>
</string></td>
<td>自定义上传,当发生错误时返回错误信息</td>
<td>-</td>
</tr>
<tr>
<td>format(files: File[], responseText: string): string</td>
<td>对服务端返回的数据进行转换,以满足内置的数据结构</td>
<td>-</td>
</tr>
<tr>
<td>file(files: File[]): File[] | Promise<File[]></td>
<td>将上传的文件处理后再返回</td>
<td>-</td>
</tr>
<tr>
<td>setHeaders(): { [key: string]: string }</td>
<td>上传前使用返回值设置头</td>
<td>-</td>
</tr>
<tr>
<td>extraData: { [key: string]: string | Blob }</td>
<td>为 FormData 添加额外的参数</td>
<td>-</td>
</tr>
<tr>
<td>multiple</td>
<td>上传文件是否为多个</td>
<td>true</td>
</tr>
<tr>
<td>fieldName</td>
<td>上传字段名称</td>
<td>'file[]'</td>
</tr>
</tbody>
</table>
<h4>options.resize</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>enable</td>
<td>是否支持大小拖拽</td>
<td>false</td>
</tr>
<tr>
<td>position</td>
<td>拖拽栏位置:'top', 'bottom'</td>
<td>'bottom'</td>
</tr>
<tr>
<td>after(height: number)</td>
<td>拖拽结束的回调</td>
<td>-</td>
</tr>
</tbody>
</table>
<h4>options.classes</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>preview</td>
<td>预览元素上的 className</td>
<td>''</td>
</tr>
</tbody>
</table>
<h4>options.fullscreen</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>index</td>
<td>全屏层级</td>
<td>90</td>
</tr>
</tbody>
</table>
<h4>options.outline</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>enable</td>
<td>初始化是否展现大纲</td>
<td>false</td>
</tr>
<tr>
<td>position</td>
<td>大纲位置:'left', 'right'</td>
<td>'left'</td>
</tr>
</tbody>
</table>
<h4>methods</h4>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>exportJSON(markdown: string)</td>
<td>根据 Markdown 获取对应 JSON</td>
</tr>
<tr>
<td>getValue()</td>
<td>获取 Markdown 内容</td>
</tr>
<tr>
<td>getHTML()</td>
<td>获取 HTML 内容</td>
</tr>
<tr>
<td>insertValue(value: string, render = true)</td>
<td>在焦点处插入内容,并默认进行 Markdown 渲染</td>
</tr>
<tr>
<td>focus()</td>
<td>聚焦到编辑器</td>
</tr>
<tr>
<td>blur()</td>
<td>让编辑器失焦</td>
</tr>
<tr>
<td>disabled()</td>
<td>禁用编辑器</td>
</tr>
<tr>
<td>enable()</td>
<td>解除编辑器禁用</td>
</tr>
<tr>
<td>getSelection(): string</td>
<td>返回选中的字符串</td>
</tr>
<tr>
<td>setValue(markdown: string, clearStack = false)</td>
<td>设置编辑器内容且选中清空历史栈</td>
</tr>
<tr>
<td>clearStack()</td>
<td>清空撤销和重做记录栈</td>
</tr>
<tr>
<td>renderPreview(value?: string)</td>
<td>设置预览区域内容</td>
</tr>
<tr>
<td>getCursorPosition():{top: number, left: number}</td>
<td>获取焦点位置</td>
</tr>
<tr>
<td>deleteValue()</td>
<td>删除选中内容</td>
</tr>
<tr>
<td>updateValue(value: string)</td>
<td>更新选中内容</td>
</tr>
<tr>
<td>isUploading()</td>
<td>上传是否还在进行中</td>
</tr>
<tr>
<td>clearCache()</td>
<td>清除缓存</td>
</tr>
<tr>
<td>disabledCache()</td>
<td>禁用缓存</td>
</tr>
<tr>
<td>enableCache()</td>
<td>启用缓存</td>
</tr>
<tr>
<td>html2md(value: string)</td>
<td>HTML 转 md</td>
</tr>
<tr>
<td>tip(text: string, time: number)</td>
<td>消息提示。time 为 0 将一直显示</td>
</tr>
<tr>
<td>setPreviewMode(mode: "both" | "editor")</td>
<td>设置预览模式</td>
</tr>
<tr>
<td>setTheme(theme: "dark" | "classic", contentTheme?: string, codeTheme?: string, contentThemePath?: string)</td>
<td>设置主题、内容主题及代码块风格</td>
</tr>
<tr>
<td>getCurrentMode(): string</td>
<td>获取编辑器当前编辑模式</td>
</tr>
<tr>
<td>destroy()</td>
<td>销毁编辑器</td>
</tr>
<tr>
<td>getCommentIds(): {id: string, top: number}[]</td>
<td>获取所有评论</td>
</tr>
<tr>
<td>hlCommentIds(ids: string[])</td>
<td>高亮评论</td>
</tr>
<tr>
<td>unHlCommentIds(ids: string[])</td>
<td>取消评论高亮</td>
</tr>
<tr>
<td>removeCommentIds(removeIds: string[])</td>
<td>删除评论</td>
</tr>
</tbody>
</table>
<h4>static methods</h4>
<ul>
<li>不需要进行编辑操作时,仅需引入 <a href="https://unpkg.com/vditor/dist/"><code>method.min.js</code></a> 后如下直接调用</li>
</ul>
<pre><code class="language-js">Vditor.mermaidRender(document)
</code></pre>
<pre><code class="language-js">import VditorPreview from 'vditor/dist/method.min'
VditorPreview.mermaidRender(document)
</code></pre>
<ul>
<li>需要对页面中的 Markdown 进行渲染时可直接调用 <code>preview</code> 方法,参数如下:</li>
</ul>
<pre><code class="language-ts">previewElement: HTMLDivElement, // 使用该元素进行渲染
markdown: string, // 需要渲染的 markdown 原文
options?: IPreviewOptions {
mode: "dark" | "light";
anchor?: number; // 为标题添加锚点 0:不渲染;1:渲染于标题前;2:渲染于标题后,默认 0
customEmoji?: { [key: string]: string }; // 自定义 emoji,默认为 {}
lang?: (keyof II18nLang); // 语言,默认为 'zh_CN'
emojiPath?: string; // 表情图片路径
hljs?: IHljs; // 参见 options.preview.hljs
speech?: { // 对选中后的内容进行阅读
enable?: boolean,
};
math?: IMath; // 数学公式渲染配置
cdn?: string; // 自建 CDN 地址
transform?(html: string): string; // 在渲染前进行的回调方法
after?(); // 渲染完成后的回调
lazyLoadImage?: string; // 设置为 Loading 图片地址后将启用图片的懒加载
markdown?: options.preview.markdown;
theme?: options.preview.theme;
renderers?: ILuteRender; // 自定义渲染 https://ld246.com/article/1588412297062
}
</code></pre>
<ul>
<li>⚠️ <code>method.min.js</code> 和 <code>index.min.js</code> 不可同时引入</li>
</ul>
<table>
<thead>
<tr>
<th></th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>previewImage(oldImgElement: HTMLImageElement, lang: keyof II18n = "zh_CN", theme = "classic")</td>
<td>点击图片预览</td>
</tr>
<tr>
<td>mermaidRender(element: HTMLElement, cdn = options.cdn, theme = options.theme)</td>
<td>流程图/时序图/甘特图</td>
</tr>
<tr>
<td>flowchartRender(element: HTMLElement, cdn = options.cdn)</td>
<td>flowchart 渲染</td>
</tr>
<tr>
<td>codeRender(element: HTMLElement)</td>
<td>为 element 中的代码块添加复制按钮</td>
</tr>
<tr>
<td>chartRender(element: (HTMLElement | Document) = document, cdn = options.cdn, theme = options.theme)</td>
<td>图表渲染</td>
</tr>
<tr>
<td>mindmapRender(element: (HTMLElement | Document) = document, cdn = options.cdn, theme = options.theme)</td>
<td>脑图渲染</td>
</tr>
<tr>
<td>plantumlRender(element: (HTMLElement | Document) = document, cdn = options.cdn)</td>
<td>plantuml 渲染</td>
</tr>
<tr>
<td>abcRender(element: (HTMLElement | Document) = document, cdn = options.cdn)</td>
<td>五线谱渲染</td>
</tr>
<tr>
<td>md2html(mdText: string, options?: IPreviewOptions): Promise<string></td>
<td>Markdown 文本转换为 HTML,该方法需使用<a href="https://ld246.com/article/1546828434083?r=Vanessa#toc_h3_1">异步编程</a></td>
</tr>
<tr>
<td>preview(previewElement: HTMLDivElement, markdown: string, options?: IPreviewOptions)</td>
<td>页面 Markdown 文章渲染</td>
</tr>
<tr>
<td>highlightRender(hljsOption?: IHljs, element?: HTMLElement | Document, cdn = options.cdn)</td>
<td>为 element 中的代码块进行高亮渲染</td>
</tr>
<tr>
<td>mediaRender(element: HTMLElement)</td>
<td>为<a href="https://ld246.com/article/1589813914768">特定链接</a>分别渲染为视频、音频、嵌入的 iframe</td>
</tr>
<tr>
<td>mathRender(element: HTMLElement, options?: {cdn?: string, math?: IMath})</td>
<td>对数学公式进行渲染</td>
</tr>
<tr>
<td>speechRender(element: HTMLElement, lang?: (keyof II18nLang))</td>
<td>对选中的文字进行阅读</td>
</tr>
<tr>
<td>graphvizRender(element: HTMLElement, cdn?: string)</td>
<td>对 graphviz 进行渲染</td>
</tr>
<tr>
<td>outlineRender(contentElement: HTMLElement, targetElement: Element)</td>
<td>对大纲进行渲染</td>
</tr>
<tr>
<td>lazyLoadImageRender(element: (HTMLElement | Document) = document)</td>
<td>对启用懒加载的图片进行渲染</td>
</tr>
<tr>
<td>setCodeTheme(codeTheme: string, cdn = options.cdn)</td>
<td>设置代码主题,codeTheme 参见 options.preview.hljs.style</td>
</tr>
<tr>
<td>setContentTheme(contentTheme: string, path: string)</td>
<td>设置内容主题,contentTheme 参见 options.preview.theme.list</td>
</tr>
</tbody>
</table>
<h2>🏗 开发文档</h2>
<h3>原理相关</h3>
<ul>
<li><a href="https://ld246.com/article/1579414663700">关于所见即所得 Markdown 编辑器的讨论</a></li>
<li><a href="https://ld246.com/article/1577370404903">Vditor 实现 Markdown 所见即所得</a></li>
<li><a href="https://ld246.com/article/1567047822949">Lute 一款对中文语境优化的 Markdown 引擎,支持 Go 和 JavaScript</a></li>
</ul>
<h3>环境</h3>
<ol>
<li>安装 <a href="https://nodejs.org/">node</a> LTS 版本</li>
<li><a href="https://github.com/Vanessa219/vditor/archive/master.zip">下载</a>最新代码并解压</li>
<li>根目录运行 <code>npm install</code></li>
<li><code>npm run start</code> 启动本地服务器,打开 <a href="http://localhost:9000">http://localhost:9000</a></li>
<li>修改代码</li>
<li><code>npm run build</code> 打包代码到 dist 目录</li>
</ol>
<h3>CDN 切换</h3>
<p>由于使用了按需加载的机制,默认 CDN 为 <a href="https://unpkg.com/vditor">https://unpkg.com/vditor</a>@版本号</p>
<p>如果代码有修改或需要使用自建 CDN 的话,可按以下步骤进行操作:</p>
<ul>
<li>初始化时,需对 <code>options</code> 及 <code>IPreviewOptions</code> 中的 <code>cdn</code>,<code>emojiPath</code>, <code>themes</code> 进行配置</li>
<li><code>highlightRender</code> , <code>mathRender</code> , <code>abcRender</code> , <code>chartRender</code> , <code>mermaidRender</code>, <code>flowchartRender</code>,<code>mindmapRender</code>,<code>graphvizRender</code>,<code>setCodeTheme</code>,<code>setContentTheme</code> 方法中需添加 cdn 参数</li>
<li>将 build 成功的 dist 目录或 <a href="https://www.jsdelivr.com/package/npm/vditor?path=dist">jsDelivr</a> 中的 dist 目录拷贝至正确的位置</li>
</ul>
<h3>升级</h3>
<p>版本升级时请<strong>仔细阅读</strong> <a href="https://github.com/Vanessa219/vditor/raw/master/CHANGELOG.md">CHANGELOG</a> 中的<strong>升级</strong>部分</p>
<h2>Ⓜ️ Markdown 使用指南</h2>
<ul>
<li><a href="https://ld246.com/article/1583129520165">基础语法</a></li>
<li><a href="https://ld246.com/article/1583305480675">扩展语法</a></li>
<li><a href="https://ld246.com/article/1583308420519">速查手册</a></li>
</ul>
<h2>🏘️ 社区</h2>
<ul>
<li><a href="https://b3log.org/vditor">官网</a></li>
<li><a href="https://ld246.com/tag/vditor">讨论区</a></li>
<li><a href="https://github.com/Vanessa219/vditor/issues/new">报告问题</a></li>
</ul>
<h2>📄 授权</h2>
<p>Vditor 使用 <a href="https://opensource.org/licenses/MIT">MIT</a> 开源协议。</p>
<h2>🙏 鸣谢</h2>
<ul>
<li><a href="https://github.com/88250/lute">Lute</a>:🎼 一款结构化的 Markdown 引擎,支持 Go 和 JavaScript</li>
<li><a href="https://github.com/highlightjs/highlight.js">highlight.js</a>:JavaScript syntax highlighter</li>
<li><a href="https://github.com/knsv/mermaid">mermaid</a>:Generation of diagram and flowchart from text in a similar manner as Markdown</li>
<li><a href="https://github.com/apache/incubator-echarts">incubator-echarts</a>:A powerful, interactive charting and visualization library for browser</li>
<li><a href="https://github.com/paulrosen/abcjs">abcjs</a>:JavaScript library for rendering standard music notation in a browser</li>
</ul>
<h2>📽️ 历史</h2>
<p>我们在开发 <a href="https://github.com/88250/symphony">Sym</a> 的初期是直接使用 WYSIWYG 富文本编辑器的。那时候基于 HTML 的编辑器非常流行,项目中引用起来也很方便,也符合用户当时的使用习惯。</p>
<p>后来,Markdown 的崛起逐步改变了大家的排版方式。再加上我们其他几个项目都是面向程序员用户的,所以迁移到 md 上也是大势所趋。我们选择了 <a href="https://github.com/codemirror/CodeMirror">CodeMirror</a>,这是一款优秀的编辑器,它对开发者提供了丰富的编程接口,对各种浏览器的兼容性也比较好。</p>
<p>再后来,随着我们项目业务需求方面的沉淀,使用 CodeMirror 有时候会感到比较“笨重”。比如要实现 @自动完成用户名列表、插入 Emoji、上传文件等就需要比较深入的二次开发,而这些业务需求恰恰是很多项目场景共有且必备的。</p>
<p>终于,我们决定开始在 Sym 中自己实现编辑器。随着几个版本的迭代,Sym 的编辑器也日趋成熟。在我们运营的社区<a href="https://ld246.com">链滴</a>上陆续有人问我们是否能将编辑器单独抽离出来提供给大家使用。与此同时,我们的前端主程 <a href="https://ld246.com/member/Vanessa">V</a> 同学对于维护分散在各个项目中的编辑器也感到有点力不从心,外加对 TypeScript 的好感,所以就决定使用 ts 来实现一个全新的浏览器端 md 编辑器。</p>
<p>于是,Vditor 就这样诞生了。</p>
+ bndkt/sharemystack
+ 2023-10-11T01:42:00Z
+ tag:github.com,2023-10-11:/bndkt/sharemystack
+
+ <p>Share your stack with the world!</p><hr><h1>Share My Stack</h1>
<p><img src="https://sharemystack.com/images/banner.webp" alt="Share My Stack Screenshots"></p>
<p><strong>Curate your personal productivity stack or your favorite development stack. Share it within the app or on social media. Discover what other people are using and get inspired to try out new tools.</strong></p>
<p>This is the original repository of the app Share My Stack, which you can download from the App Store today:</p>
<p><a href="https://apps.apple.com/us/app/share-my-stack/id6450111644"><img src="https://developer.apple.com/assets/elements/badges/download-on-the-app-store.svg?sanitize=true" alt="Download on the App Store"></a></p>
<p>Share My Stack is also launching on Product Hunt today, please check it out:</p>
<p><a href="https://www.producthunt.com/posts/share-my-stack?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-share-my-stack" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=415351&theme=light" alt="Share My Stack - Share your stack with the world | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54"></a></p>
<p>To find out more about Share My Stack, check out <a href="https://sharemystack.com">https://sharemystack.com</a></p>
<blockquote>
<p>[!NOTE] This app (and all code in this repo) was created by Benedikt Müller (<a href="https://x.com/bndkt">@bndkt</a>, <a href="https://bndkt.com">bndkt.com</a>). I'm making this repo accessible for educational purposes and as inspiration, but without license. I'm <strong>available for freelance work</strong> in React and React Native projects, please reach out to me at <a href="https://raw.githubusercontent.com/bndkt/sharemystack/main/hello@bndkt.com">hello@bndkt.com</a>.</p>
</blockquote>
<h2>This repo includes:</h2>
<ul>
<li><a href="https://raw.githubusercontent.com/bndkt/sharemystack/main/apps/app">apps/app</a>: The app itself (React Native)</li>
<li><a href="https://raw.githubusercontent.com/bndkt/sharemystack/main/apps/content">apps/content</a>: Sanity Studio (to edit editorial content shown in the app)</li>
<li><a href="https://raw.githubusercontent.com/bndkt/sharemystack/main/apps/video">apps/video</a>: A Remotion project (to generate mockups and videos for marketing)</li>
<li><a href="https://raw.githubusercontent.com/bndkt/sharemystack/main/apps/web">apps/web</a>: The landing page (Remix)</li>
<li><a href="https://raw.githubusercontent.com/bndkt/sharemystack/main/assets">assets</a>: Static data for the app (categories, tools, icons)</li>
<li><a href="https://raw.githubusercontent.com/bndkt/sharemystack/main/packages/seed-data-action">packages/seed-data-action</a>: A custom GitHub actions to seed the static data into Supabase</li>
<li><a href="https://raw.githubusercontent.com/bndkt/sharemystack/main/.github/workflows">.github/workflows</a>: GitHub actions for CI and to deploy to Expo (build the mobile app) and Cloudflare (website)</li>
</ul>
<h2>Built with</h2>
<ul>
<li><a href="https://github.com/expo/expo/">Expo SDK 50</a></li>
<li><a href="https://github.com/expo/expo/tree/main/packages/expo-router">Expo Router 3</a></li>
<li><a href="https://github.com/facebook/react-native">React Native 0.72</a></li>
<li><a href="https://github.com/tamagui/tamagui">Tamagui</a></li>
<li><a href="https://github.com/supabase/supabase-js">Supabase</a></li>
<li><a href="https://github.com/gorhom/react-native-bottom-sheet">React Native Bottom Sheet 5</a></li>
<li><a href="https://github.com/Nozbe/WatermelonDB">WatermelonDB</a></li>
<li><a href="https://github.com/remix-run">Remix 2</a></li>
<li><a href="https://github.com/remotion-dev/remotion">Remotion 4</a></li>
</ul>
<h2>Planned technical enhancements</h2>
<ul>
<li><input type="checkbox" disabled> iOS App Clips (using <a href="https://github.com/bndkt/react-native-app-clip">react-native-app-clip</a>)</li>
<li><input type="checkbox" disabled> iOS Widgets/Live Activities (using <a href="https://github.com/bndkt/react-native-widget-extension">react-native-widget-extension</a>)</li>
<li><input type="checkbox" disabled> iOS Handoff (using <a href="https://github.com/expo/expo/tree/main/packages/expo-router">Expo Router</a>)</li>
<li><input type="checkbox" disabled> Web App powered by React Native Web (using <a href="https://github.com/expo/expo/tree/main/packages/expo-router">Expo Router</a>)</li>
</ul>
- piyushgarg-dev/review-app-api
- 2023-10-10T01:42:12Z
- tag:github.com,2023-10-10:/piyushgarg-dev/review-app-api
-
- <p>Backend Review Management Application | https://youtu.be/JD3NQsB3TQI</p><hr><h1>Review App - Backend Repo</h1>
<p>This repository contains the backend code for the Review App project.</p>
<p><a href="https://postimg.cc/9rmSKmhw"><img src="https://i.postimg.cc/pXzH9rcC/Screenshot-86.png" alt="Screenshot-86.png"></a></p>
<h5>This project is divided into two repositories:</h5>
<ol>
<li><a href="https://github.com/piyushgarg-dev/review-app">Review App Frontend</a></li>
<li>Review App Backend (You are here)</li>
</ol>
<p>Go to <a href="https://github.com/piyushgarg-dev/review-app">this repository</a> to know more about the project.</p>
<h2>Environment Setup :</h2>
<ol>
<li> <p>Pre-requisites :</p> <p>a. Clone the Repo : <code>git clone https://github.com/piyushgarg-dev/review-app-api.git</code> b. Move to backend foler : <code>cd review-app-api</code> c. Install and Setup Docker d. Run Docker in background<br> e. Run this command to run "docker-compose.yml" file in detach mode : <code>docker compose up -d</code> f. Setup Backend by running command : <code>yarn</code></p> </li>
<li> <p>Create a <code>.env.local</code> file in the project's root directory</p> </li>
<li> <p>The <code>.env.local</code> file should consist of :</p> <p><code>DATABASE_URL=postgresql://postgres:password@localhost:5432/review JWT_SECRET=superman123</code></p> </li>
<li> <p>Run Migrations by running command : <code>yarn migrate:latest</code></p> </li>
<li> <p>Run Backend server by running command : <code>yarn local</code></p> </li>
</ol>
<p>CONGRATULATIONS! your backend starts running on <a href="http://localhost:8000/local/graphql">http://localhost:8000/local/graphql</a></p>
<h2>Communication Channels</h2>
<p>If you have any questions, need clarifications, or want to discuss ideas, feel free to reach out through the following channels:</p>
<ul>
<li><a href="https://discord.com/invite/YuUjtrufmT">Discord Server</a></li>
<li><a href="https://twitter.com/piyushgarg_dev">X(formerly Twitter)</a></li>
</ul>
<p>We appreciate your contributions and look forward to working with you to make this project even better!</p>
<h2>Best Contributors</h2>
<div align="center">
<a href="https://github.com/piyushgarg-dev/review-app-api/graphs/contributors"> <img src="https://contrib.rocks/image?repo=piyushgarg-dev/review-app-api&anon=1"> </a>
</div>
+ NativeScript/NativeScript
+ 2023-10-11T01:42:00Z
+ tag:github.com,2023-10-11:/NativeScript/NativeScript
+
+ <p>⚡ Empowering JavaScript with native platform APIs. ✨ Best of all worlds (TypeScript, Swift, Objective C, Kotlin, Java). Use what you love ❤️ Angular, Capacitor, Ionic, React, Solid, Svelte, Vue with: SwiftUI, Jetpack Compose, Flutter and you name it compatible.</p><hr><p><a href="https://nativescript.org"><img src="https://raw.githubusercontent.com/NativeScript/NativeScript/main/tools/graphics/cover.png" alt="NativeScript"></a></p>
<p> </p>
<p><a href="https://github.com/NativeScript/NativeScript/actions/workflows/apps_automated.yml"><img src="https://github.com/NativeScript/NativeScript/actions/workflows/apps_automated.yml/badge.svg?sanitize=true" alt="Automated Tests Passing"></a> <a href="https://github.com/NativeScript/NativeScript/raw/main/LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg?sanitize=true" alt="License"></a> <a href="https://www.npmjs.com/@nativescript/core"><img src="https://badge.fury.io/js/%40nativescript%2Fcore.svg?sanitize=true" alt="NPM Version"></a> <a href="https://nativescript.org/discord"><img src="https://badgen.net/badge/icon/discord?icon=discord&label" alt="Discord"></a> <a href="https://app.fossa.com/projects/git%2Bgithub.com%2FNativeScript%2FNativeScript?ref=badge_shield"><img src="https://app.fossa.com/api/projects/git%2Bgithub.com%2FNativeScript%2FNativeScript.svg?type=shield" alt="FOSSA Status"></a> <a href="https://nativescript.org"><img src="https://img.shields.io/badge/website-nativescript.org-purple.svg?sanitize=true" alt="website"></a> <a href="https://good-labs.github.io/greater-good-affirmation"><img src="https://good-labs.github.io/greater-good-affirmation/assets/images/badge.svg?sanitize=true" alt="https://good-labs.github.io/greater-good-affirmation/assets/images/badge.svg"></a> <a href="https://opencollective.com/NativeScript"><img src="https://img.shields.io/badge/sponsor-Open%20Collective-blue.svg?sanitize=true" alt="support"></a></p>
<p></p>
<p><a href="http://www.nativescript.org">NativeScript</a> empowers you to access native APIs from JavaScript directly. Currently iOS and Android runtimes are provided for rich mobile development across a variety of diverse use cases.</p>
<p><a href="https://app.fossa.com/projects/git%2Bgithub.com%2FNativeScript%2FNativeScript?ref=badge_large"><img src="https://app.fossa.com/api/projects/git%2Bgithub.com%2FNativeScript%2FNativeScript.svg?type=large" alt="FOSSA Status"></a></p>
<h2>Contribute</h2>
<ol>
<li> <p><a href="https://docs.nativescript.org/environment-setup.html">Setup your local development environment</a></p> </li>
<li> <p>Clone to contribute:</p> </li>
</ol>
<pre><code class="language-bash">$ git clone https://github.com/NativeScript/NativeScript.git
$ cd NativeScript
# setup workspace for development
$ npm run setup
# list all available commands to run
$ npm start
</code></pre>
<p>We love you and your pull requests 🤗. Please follow our <a href="https://github.com/NativeScript/NativeScript/raw/main/tools/notes/CONTRIBUTING.md">contributing guide</a> and see <a href="https://github.com/NativeScript/management/raw/master/nativescript-governance.md">our code of governance</a> to become as involved as you want to be.</p>
<h2>@nativescript/*</h2>
<ul>
<li><a href="https://github.com/NativeScript/NativeScript/tree/main/packages/core">@nativescript/core</a> Core iOS/Android for NativeScript.</li>
<li><a href="https://www.npmjs.com/package/@nativescript/types">@nativescript/types</a> Types for both iOS/Android below wrapped up as a convenience. <em>Most commonly used.</em></li>
<li><a href="https://github.com/NativeScript/NativeScript/tree/main/packages/types-ios">@nativescript/types-ios</a> Types for iOS.</li>
<li><a href="https://github.com/NativeScript/NativeScript/tree/main/packages/types-android">@nativescript/types-android</a> Types for Android.</li>
<li><a href="https://github.com/NativeScript/NativeScript/tree/main/packages/types-minimal">@nativescript/types-minimal</a> A very minimal set of types for only the latest Android and iOS sdks. Most commonly used to optimize Web-based IDE's which auto load all type declarations from node_modules.</li>
<li><a href="https://github.com/NativeScript/NativeScript/tree/main/packages/ui-mobile-base">@nativescript/ui-mobile-base</a> UI mobile base native classes used by core.</li>
<li><a href="https://github.com/NativeScript/NativeScript/tree/main/packages/webpack5">@nativescript/webpack</a> Webpack build utilities and configs used by NativeScript apps.</li>
</ul>
<h2>Quick Links</h2>
<ul>
<li><a href="https://nativescript.org">NativeScript Home</a></li>
<li><a href="https://docs.nativescript.org/tutorial/">NativeScript Tutorials</a></li>
<li><a href="https://docs.nativescript.org/">NativeScript documentation</a></li>
<li>JavaScript starter: <a href="https://nativescript.new/javascript">https://nativescript.new/javascript</a></li>
<li>TypeScript starter: <a href="https://nativescript.new/typescript">https://nativescript.new/typescript</a></li>
<li>Angular starter: <a href="https://nativescript.new/angular">https://nativescript.new/angular</a></li>
<li>Vue starter: <a href="https://nativescript.new/vue">https://nativescript.new/vue</a></li>
<li>Svelte starter: <a href="https://nativescript.new/svelte">https://nativescript.new/svelte</a></li>
<li>React starter: <a href="https://nativescript.new/react">https://nativescript.new/react</a></li>
<li><a href="http://twitter.com/NativeScript">NativeScript on Twitter</a></li>
<li><a href="https://nativescript.org/discord">NativeScript on Discord</a></li>
<li><a href="http://stackoverflow.com/questions/tagged/nativescript">NativeScript on Stack Overflow</a></li>
</ul>
<h2>Other source repos</h2>
<p>Outside the source centralized in this repo, NativeScript consists of a few other source repos. Here are the major ones:</p>
<ul>
<li><a href="https://github.com/NativeScript/ns-v8ios-runtime">iOS Runtime</a> NativeScript iOS Runtime: Empowers JavaScript code to be executed on iOS devices written in a mix of C++, Objective-C, and Swift.</li>
<li><a href="https://github.com/NativeScript/android-runtime">Android Runtime</a> NativeScript Android Runtim: Empowers JavaScript code to be executed on Android devices written in a mix of C++, Java and Kotlin.</li>
<li><a href="https://raw.githubusercontent.com/github.com/NativeScript/nativescript-cli">CLI</a> NativeScript command-line interface empowering you to create, build, and run apps using NativeScript.</li>
<li><a href="https://raw.githubusercontent.com/github.com/NativeScript/docs-new">Docs</a> NativeScript documentation available at <a href="http://docs.nativescript.org/">http://docs.nativescript.org/</a> written in Markdown.</li>
<li><a href="https://github.com/NativeScript/plugins">Plugins</a> A <a href="https://docs.nativescript.org/plugins/plugin-workspace-guide.html">plugin workspace</a> with several useful plugins.</li>
<li><a href="https://github.com/NativeScript/firebase">Firebase</a> Modular Firebase 🔥 implementation for supported platforms.</li>
<li><a href="https://github.com/NativeScript/mlkit">ML Kit</a> Google's <a href="https://developers.google.com/ml-kit">ML Kit SDKs for supported platforms</a>.</li>
<li><a href="https://github.com/NativeScript/payments">Payments</a> In-App Purchase, Subscriptions, Google Pay and Apple Pay.</li>
<li><a href="https://github.com/NativeScript/artwork">Artwork</a> Want to use our logo or colors? Feel free to use any of our ready-to-use media material.</li>
</ul>
<h3 align="center">Made with ❤️</h3>
\ No newline at end of file
diff --git a/unified-parallel-c/daily/index.xml b/unified-parallel-c/daily/index.xml
index f890235b8fb..b66f9ed2f7e 100644
--- a/unified-parallel-c/daily/index.xml
+++ b/unified-parallel-c/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Unified Parallel C Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:07Z
+ 2023-10-11T01:41:55Z
Daily Trending of Unified Parallel C in GitHub
\ No newline at end of file
diff --git a/unity3d-asset/daily/index.xml b/unity3d-asset/daily/index.xml
index 9ef2be9d85b..6348337f80e 100644
--- a/unity3d-asset/daily/index.xml
+++ b/unity3d-asset/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Unity3D Asset Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:06Z
+ 2023-10-11T01:41:56Z
Daily Trending of Unity3D Asset in GitHub
\ No newline at end of file
diff --git a/unix-assembly/daily/index.xml b/unix-assembly/daily/index.xml
index c6601f04928..b00220a36ff 100644
--- a/unix-assembly/daily/index.xml
+++ b/unix-assembly/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Unix Assembly Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:25Z
+ 2023-10-11T01:42:15Z
Daily Trending of Unix Assembly in GitHub
\ No newline at end of file
diff --git a/unknown/daily/index.xml b/unknown/daily/index.xml
index 24900232e3d..e8db396084f 100644
--- a/unknown/daily/index.xml
+++ b/unknown/daily/index.xml
@@ -1,21 +1,28 @@
GitHub Unknown Languages Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:23:49Z
+ 2023-10-11T01:23:29Z
Daily Trending of Unknown Languages in GitHub
- github/how-engineering-communicates
- 2023-10-10T01:23:49Z
- tag:github.com,2023-10-10:/github/how-engineering-communicates
-
- <p>A community version of the "common API" for how the GitHub Engineering organization communicates</p><hr>
+ jackaduma/awesome_LLMs_interview_notes
+ 2023-10-11T01:23:29Z
+ tag:github.com,2023-10-11:/jackaduma/awesome_LLMs_interview_notes
+
+ <p>LLMs interview notes and answers:该仓库主要记录大模型(LLMs)算法工程师相关的面试题和参考答案</p><hr>
- grananqvist/Awesome-Quant-Machine-Learning-Trading
- 2023-10-10T01:23:49Z
- tag:github.com,2023-10-10:/grananqvist/Awesome-Quant-Machine-Learning-Trading
-
- <p>Quant/Algorithm trading resources with an emphasis on Machine Learning</p><hr>
+ CyberSecurityUP/Guide-CEH-Practical-Master
+ 2023-10-11T01:23:29Z
+ tag:github.com,2023-10-11:/CyberSecurityUP/Guide-CEH-Practical-Master
+
+ <p></p><hr>
+
+
+ chao325/MaoTai_GUIT
+ 2023-10-11T01:23:29Z
+ tag:github.com,2023-10-11:/chao325/MaoTai_GUIT
+
+ <p>JD京东抢购、京东抢茅台Windows端、开箱即用无需配置环境。开发在即(开源协议采用Apache License)抢茅台外挂,茅台脚本</p><hr>
\ No newline at end of file
diff --git a/uno/daily/index.xml b/uno/daily/index.xml
index 4199b524dc6..360daa924c0 100644
--- a/uno/daily/index.xml
+++ b/uno/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Uno Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:28Z
+ 2023-10-11T01:42:16Z
Daily Trending of Uno in GitHub
\ No newline at end of file
diff --git a/unrealscript/daily/index.xml b/unrealscript/daily/index.xml
index a7ed10db7e3..6807a69d805 100644
--- a/unrealscript/daily/index.xml
+++ b/unrealscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub UnrealScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:26Z
+ 2023-10-11T01:42:17Z
Daily Trending of UnrealScript in GitHub
\ No newline at end of file
diff --git a/urweb/daily/index.xml b/urweb/daily/index.xml
index 4eaf6e871ca..a0203111236 100644
--- a/urweb/daily/index.xml
+++ b/urweb/daily/index.xml
@@ -1,7 +1,7 @@
GitHub UrWeb Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:27Z
+ 2023-10-11T01:42:14Z
Daily Trending of UrWeb in GitHub
\ No newline at end of file
diff --git a/v/daily/index.xml b/v/daily/index.xml
index a5dab504763..949382935ae 100644
--- a/v/daily/index.xml
+++ b/v/daily/index.xml
@@ -1,7 +1,7 @@
GitHub V Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:31Z
+ 2023-10-11T01:42:19Z
Daily Trending of V in GitHub
\ No newline at end of file
diff --git a/vala/daily/index.xml b/vala/daily/index.xml
index f4ce5f18cc5..56ef7a01fa3 100644
--- a/vala/daily/index.xml
+++ b/vala/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Vala Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:32Z
+ 2023-10-11T01:42:21Z
Daily Trending of Vala in GitHub
\ No newline at end of file
diff --git a/valve-data-format/daily/index.xml b/valve-data-format/daily/index.xml
index 154686618a7..6e3ce330753 100644
--- a/valve-data-format/daily/index.xml
+++ b/valve-data-format/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Valve Data Format Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:29Z
+ 2023-10-11T01:42:18Z
Daily Trending of Valve Data Format in GitHub
\ No newline at end of file
diff --git a/vba/daily/index.xml b/vba/daily/index.xml
index a25cc5d30f6..23b748cb898 100644
--- a/vba/daily/index.xml
+++ b/vba/daily/index.xml
@@ -1,7 +1,7 @@
GitHub VBA Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:30Z
+ 2023-10-11T01:42:20Z
Daily Trending of VBA in GitHub
\ No newline at end of file
diff --git a/vbscript/daily/index.xml b/vbscript/daily/index.xml
index 90a54e9c8db..6359fb29279 100644
--- a/vbscript/daily/index.xml
+++ b/vbscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub VBScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:36Z
+ 2023-10-11T01:42:25Z
Daily Trending of VBScript in GitHub
\ No newline at end of file
diff --git a/vcl/daily/index.xml b/vcl/daily/index.xml
index e3dc1df0c4e..0909008afab 100644
--- a/vcl/daily/index.xml
+++ b/vcl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub VCL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:34Z
+ 2023-10-11T01:42:23Z
Daily Trending of VCL in GitHub
\ No newline at end of file
diff --git a/verilog/daily/index.xml b/verilog/daily/index.xml
index 674d05e7b28..26d1572bf03 100644
--- a/verilog/daily/index.xml
+++ b/verilog/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Verilog Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:38Z
+ 2023-10-11T01:42:26Z
Daily Trending of Verilog in GitHub
\ No newline at end of file
diff --git a/vhdl/daily/index.xml b/vhdl/daily/index.xml
index 63e33c1838c..fd6916d64ec 100644
--- a/vhdl/daily/index.xml
+++ b/vhdl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub VHDL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:42Z
+ 2023-10-11T01:42:28Z
Daily Trending of VHDL in GitHub
\ No newline at end of file
diff --git a/vim-help-file/daily/index.xml b/vim-help-file/daily/index.xml
index 0d4ca6a68f2..b9f16cb5984 100644
--- a/vim-help-file/daily/index.xml
+++ b/vim-help-file/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Vim Help File Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:41Z
+ 2023-10-11T01:42:29Z
Daily Trending of Vim Help File in GitHub
\ No newline at end of file
diff --git a/vim-script/daily/index.xml b/vim-script/daily/index.xml
index 756110158c7..946641c96d2 100644
--- a/vim-script/daily/index.xml
+++ b/vim-script/daily/index.xml
@@ -1,7 +1,21 @@
GitHub Vim Script Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:46Z
+ 2023-10-11T01:42:33Z
Daily Trending of Vim Script in GitHub
+
+ burmajam/dotfiles
+ 2023-10-11T01:42:33Z
+ tag:github.com,2023-10-11:/burmajam/dotfiles
+
+ <p>Mine dotfiles</p><hr>
+
+
+ instant-markdown/vim-instant-markdown
+ 2023-10-11T01:42:33Z
+ tag:github.com,2023-10-11:/instant-markdown/vim-instant-markdown
+
+ <p>Instant Markdown previews from Vim</p><hr>
+
\ No newline at end of file
diff --git a/vim-snippet/daily/index.xml b/vim-snippet/daily/index.xml
index 69794a4846e..9a4426b0843 100644
--- a/vim-snippet/daily/index.xml
+++ b/vim-snippet/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Vim Snippet Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:40Z
+ 2023-10-11T01:42:30Z
Daily Trending of Vim Snippet in GitHub
\ No newline at end of file
diff --git a/visual-basic-.net/daily/index.xml b/visual-basic-.net/daily/index.xml
index 7b154dd873c..969869611f9 100644
--- a/visual-basic-.net/daily/index.xml
+++ b/visual-basic-.net/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Visual Basic .NET Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:49Z
+ 2023-10-11T01:42:35Z
Daily Trending of Visual Basic .NET in GitHub
\ No newline at end of file
diff --git a/volt/daily/index.xml b/volt/daily/index.xml
index 169c41d5422..c99704e85e4 100644
--- a/volt/daily/index.xml
+++ b/volt/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Volt Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:48Z
+ 2023-10-11T01:42:36Z
Daily Trending of Volt in GitHub
\ No newline at end of file
diff --git a/vue/daily/index.xml b/vue/daily/index.xml
index 349fc87b3d1..1ac66fcae42 100644
--- a/vue/daily/index.xml
+++ b/vue/daily/index.xml
@@ -1,7 +1,14 @@
GitHub Vue Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:56Z
+ 2023-10-11T01:42:43Z
Daily Trending of Vue in GitHub
+
+ Wizarrrr/wizarr
+ 2023-10-11T01:42:43Z
+ tag:github.com,2023-10-11:/Wizarrrr/wizarr
+
+ <p>Wizarr is an advanced user invitation and management system for Jellyfin, Plex, Emby etc.</p><hr>
+
\ No newline at end of file
diff --git a/vyper/daily/index.xml b/vyper/daily/index.xml
index 81fd8701287..6ca8f29413b 100644
--- a/vyper/daily/index.xml
+++ b/vyper/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Vyper Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:53Z
+ 2023-10-11T01:42:38Z
Daily Trending of Vyper in GitHub
\ No newline at end of file
diff --git a/wavefront-material/daily/index.xml b/wavefront-material/daily/index.xml
index c2b57ed620d..dfad6849ef1 100644
--- a/wavefront-material/daily/index.xml
+++ b/wavefront-material/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Wavefront Material Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:51Z
+ 2023-10-11T01:42:39Z
Daily Trending of Wavefront Material in GitHub
\ No newline at end of file
diff --git a/wavefront-object/daily/index.xml b/wavefront-object/daily/index.xml
index cd078892017..51837bc9011 100644
--- a/wavefront-object/daily/index.xml
+++ b/wavefront-object/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Wavefront Object Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:52Z
+ 2023-10-11T01:42:40Z
Daily Trending of Wavefront Object in GitHub
\ No newline at end of file
diff --git a/wdl/daily/index.xml b/wdl/daily/index.xml
index a81c8dc9f17..a59883fa204 100644
--- a/wdl/daily/index.xml
+++ b/wdl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub WDL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:42:59Z
+ 2023-10-11T01:42:45Z
Daily Trending of WDL in GitHub
\ No newline at end of file
diff --git a/web-ontology-language/daily/index.xml b/web-ontology-language/daily/index.xml
index 0f40bf3193b..ee2b679558c 100644
--- a/web-ontology-language/daily/index.xml
+++ b/web-ontology-language/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Web Ontology Language Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:00Z
+ 2023-10-11T01:42:44Z
Daily Trending of Web Ontology Language in GitHub
\ No newline at end of file
diff --git a/webassembly/daily/index.xml b/webassembly/daily/index.xml
index 7945c6abd1e..c6281910fc7 100644
--- a/webassembly/daily/index.xml
+++ b/webassembly/daily/index.xml
@@ -1,7 +1,7 @@
GitHub WebAssembly Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:01Z
+ 2023-10-11T01:42:47Z
Daily Trending of WebAssembly in GitHub
\ No newline at end of file
diff --git a/webidl/daily/index.xml b/webidl/daily/index.xml
index 8d3c109b5fa..db444d32d77 100644
--- a/webidl/daily/index.xml
+++ b/webidl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub WebIDL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:03Z
+ 2023-10-11T01:42:49Z
Daily Trending of WebIDL in GitHub
\ No newline at end of file
diff --git a/webvtt/daily/index.xml b/webvtt/daily/index.xml
index 07089008abc..5e6f289af4c 100644
--- a/webvtt/daily/index.xml
+++ b/webvtt/daily/index.xml
@@ -1,7 +1,7 @@
GitHub WebVTT Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:05Z
+ 2023-10-11T01:42:48Z
Daily Trending of WebVTT in GitHub
\ No newline at end of file
diff --git a/wget-config/daily/index.xml b/wget-config/daily/index.xml
index 20e4a8a153c..3fba2529bca 100644
--- a/wget-config/daily/index.xml
+++ b/wget-config/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Wget Config Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:04Z
+ 2023-10-11T01:42:51Z
Daily Trending of Wget Config in GitHub
\ No newline at end of file
diff --git a/wikitext/daily/index.xml b/wikitext/daily/index.xml
index 1ae5d30797b..3d9cbae00d2 100644
--- a/wikitext/daily/index.xml
+++ b/wikitext/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Wikitext Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:09Z
+ 2023-10-11T01:42:53Z
Daily Trending of Wikitext in GitHub
\ No newline at end of file
diff --git a/windows-registry-entries/daily/index.xml b/windows-registry-entries/daily/index.xml
index 29abe98fc7d..2ca0c2becad 100644
--- a/windows-registry-entries/daily/index.xml
+++ b/windows-registry-entries/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Windows Registry Entries Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:06Z
+ 2023-10-11T01:42:54Z
Daily Trending of Windows Registry Entries in GitHub
\ No newline at end of file
diff --git a/wisp/daily/index.xml b/wisp/daily/index.xml
index 34ee45ae58b..2e936b7703c 100644
--- a/wisp/daily/index.xml
+++ b/wisp/daily/index.xml
@@ -1,7 +1,7 @@
GitHub wisp Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:11Z
+ 2023-10-11T01:42:58Z
Daily Trending of wisp in GitHub
\ No newline at end of file
diff --git a/witcher-script/daily/index.xml b/witcher-script/daily/index.xml
index 3abaab44ea5..6cd2498ee6e 100644
--- a/witcher-script/daily/index.xml
+++ b/witcher-script/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Witcher Script Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:13Z
+ 2023-10-11T01:42:57Z
Daily Trending of Witcher Script in GitHub
\ No newline at end of file
diff --git a/wollok/daily/index.xml b/wollok/daily/index.xml
index 3e4ba7bf2d4..67f112e104a 100644
--- a/wollok/daily/index.xml
+++ b/wollok/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Wollok Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:10Z
+ 2023-10-11T01:42:56Z
Daily Trending of Wollok in GitHub
\ No newline at end of file
diff --git a/world-of-warcraft-addon-data/daily/index.xml b/world-of-warcraft-addon-data/daily/index.xml
index fe665fd825d..488acc2fa0f 100644
--- a/world-of-warcraft-addon-data/daily/index.xml
+++ b/world-of-warcraft-addon-data/daily/index.xml
@@ -1,7 +1,7 @@
GitHub World of Warcraft Addon Data Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:12Z
+ 2023-10-11T01:42:58Z
Daily Trending of World of Warcraft Addon Data in GitHub
\ No newline at end of file
diff --git a/x-bitmap/daily/index.xml b/x-bitmap/daily/index.xml
index c8bda46b6d9..5027a5668fa 100644
--- a/x-bitmap/daily/index.xml
+++ b/x-bitmap/daily/index.xml
@@ -1,7 +1,7 @@
GitHub X BitMap Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:15Z
+ 2023-10-11T01:43:02Z
Daily Trending of X BitMap in GitHub
\ No newline at end of file
diff --git a/x-font-directory-index/daily/index.xml b/x-font-directory-index/daily/index.xml
index a7dd196f888..d6de68eb4f9 100644
--- a/x-font-directory-index/daily/index.xml
+++ b/x-font-directory-index/daily/index.xml
@@ -1,7 +1,7 @@
GitHub X Font Directory Index Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:17Z
+ 2023-10-11T01:43:01Z
Daily Trending of X Font Directory Index in GitHub
\ No newline at end of file
diff --git a/x-pixmap/daily/index.xml b/x-pixmap/daily/index.xml
index 8c397b5082e..80cb4eb0283 100644
--- a/x-pixmap/daily/index.xml
+++ b/x-pixmap/daily/index.xml
@@ -1,7 +1,7 @@
GitHub X PixMap Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:14Z
+ 2023-10-11T01:43:01Z
Daily Trending of X PixMap in GitHub
\ No newline at end of file
diff --git a/x10/daily/index.xml b/x10/daily/index.xml
index f983c189a2e..ba3ac31afea 100644
--- a/x10/daily/index.xml
+++ b/x10/daily/index.xml
@@ -1,7 +1,7 @@
GitHub X10 Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:19Z
+ 2023-10-11T01:43:05Z
Daily Trending of X10 in GitHub
\ No newline at end of file
diff --git a/xbase/daily/index.xml b/xbase/daily/index.xml
index b4c9655030b..58882906c52 100644
--- a/xbase/daily/index.xml
+++ b/xbase/daily/index.xml
@@ -1,7 +1,7 @@
GitHub xBase Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:20Z
+ 2023-10-11T01:43:05Z
Daily Trending of xBase in GitHub
\ No newline at end of file
diff --git a/xc/daily/index.xml b/xc/daily/index.xml
index 99c89a4d371..0d33f9f1589 100644
--- a/xc/daily/index.xml
+++ b/xc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub XC Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:22Z
+ 2023-10-11T01:43:04Z
Daily Trending of XC in GitHub
\ No newline at end of file
diff --git a/xcompose/daily/index.xml b/xcompose/daily/index.xml
index 88129b5c230..1350524c14a 100644
--- a/xcompose/daily/index.xml
+++ b/xcompose/daily/index.xml
@@ -1,7 +1,7 @@
GitHub XCompose Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:21Z
+ 2023-10-11T01:43:06Z
Daily Trending of XCompose in GitHub
\ No newline at end of file
diff --git a/xml-property-list/daily/index.xml b/xml-property-list/daily/index.xml
index eed94500672..591d6f5f2be 100644
--- a/xml-property-list/daily/index.xml
+++ b/xml-property-list/daily/index.xml
@@ -1,7 +1,7 @@
GitHub XML Property List Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:23Z
+ 2023-10-11T01:43:08Z
Daily Trending of XML Property List in GitHub
\ No newline at end of file
diff --git a/xml/daily/index.xml b/xml/daily/index.xml
index be3cf4a6545..f94f269e456 100644
--- a/xml/daily/index.xml
+++ b/xml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub XML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:25Z
+ 2023-10-11T01:43:10Z
Daily Trending of XML in GitHub
\ No newline at end of file
diff --git a/xojo/daily/index.xml b/xojo/daily/index.xml
index 133f0dcbfdc..fb1a0287f68 100644
--- a/xojo/daily/index.xml
+++ b/xojo/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Xojo Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:24Z
+ 2023-10-11T01:43:10Z
Daily Trending of Xojo in GitHub
\ No newline at end of file
diff --git a/xonsh/daily/index.xml b/xonsh/daily/index.xml
index 2f18222cb12..634c14c6045 100644
--- a/xonsh/daily/index.xml
+++ b/xonsh/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Xonsh Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:26Z
+ 2023-10-11T01:43:08Z
Daily Trending of Xonsh in GitHub
\ No newline at end of file
diff --git a/xpages/daily/index.xml b/xpages/daily/index.xml
index 74ab919e27e..e0099fd7f7c 100644
--- a/xpages/daily/index.xml
+++ b/xpages/daily/index.xml
@@ -1,7 +1,7 @@
GitHub XPages Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:27Z
+ 2023-10-11T01:43:12Z
Daily Trending of XPages in GitHub
\ No newline at end of file
diff --git a/xproc/daily/index.xml b/xproc/daily/index.xml
index 8b0667cd4c1..8367fe274e2 100644
--- a/xproc/daily/index.xml
+++ b/xproc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub XProc Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:29Z
+ 2023-10-11T01:43:12Z
Daily Trending of XProc in GitHub
\ No newline at end of file
diff --git a/xquery/daily/index.xml b/xquery/daily/index.xml
index af6623e772b..e39bfa3c19c 100644
--- a/xquery/daily/index.xml
+++ b/xquery/daily/index.xml
@@ -1,7 +1,7 @@
GitHub XQuery Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:30Z
+ 2023-10-11T01:43:13Z
Daily Trending of XQuery in GitHub
\ No newline at end of file
diff --git a/xs/daily/index.xml b/xs/daily/index.xml
index 31632855118..dc46c2e47a7 100644
--- a/xs/daily/index.xml
+++ b/xs/daily/index.xml
@@ -1,7 +1,7 @@
GitHub XS Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:29Z
+ 2023-10-11T01:43:14Z
Daily Trending of XS in GitHub
\ No newline at end of file
diff --git a/xslt/daily/index.xml b/xslt/daily/index.xml
index 464f1296395..6c83c1014c8 100644
--- a/xslt/daily/index.xml
+++ b/xslt/daily/index.xml
@@ -1,7 +1,7 @@
GitHub XSLT Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:36Z
+ 2023-10-11T01:43:18Z
Daily Trending of XSLT in GitHub
\ No newline at end of file
diff --git a/xtend/daily/index.xml b/xtend/daily/index.xml
index 1b3c176aa77..2c2af8f7aac 100644
--- a/xtend/daily/index.xml
+++ b/xtend/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Xtend Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:32Z
+ 2023-10-11T01:43:15Z
Daily Trending of Xtend in GitHub
\ No newline at end of file
diff --git a/yacc/daily/index.xml b/yacc/daily/index.xml
index bcc5cc9a627..440be98c32c 100644
--- a/yacc/daily/index.xml
+++ b/yacc/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Yacc Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:33Z
+ 2023-10-11T01:43:16Z
Daily Trending of Yacc in GitHub
\ No newline at end of file
diff --git a/yaml/daily/index.xml b/yaml/daily/index.xml
index 195094b45ef..ecd86160137 100644
--- a/yaml/daily/index.xml
+++ b/yaml/daily/index.xml
@@ -1,7 +1,7 @@
GitHub YAML Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:34Z
+ 2023-10-11T01:43:18Z
Daily Trending of YAML in GitHub
\ No newline at end of file
diff --git a/yang/daily/index.xml b/yang/daily/index.xml
index 9636d97a165..4247466403c 100644
--- a/yang/daily/index.xml
+++ b/yang/daily/index.xml
@@ -1,7 +1,7 @@
GitHub YANG Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:39Z
+ 2023-10-11T01:43:20Z
Daily Trending of YANG in GitHub
\ No newline at end of file
diff --git a/yara/daily/index.xml b/yara/daily/index.xml
index 02c26443587..7138423df66 100644
--- a/yara/daily/index.xml
+++ b/yara/daily/index.xml
@@ -1,7 +1,7 @@
GitHub YARA Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:42Z
+ 2023-10-11T01:43:23Z
Daily Trending of YARA in GitHub
\ No newline at end of file
diff --git a/yasnippet/daily/index.xml b/yasnippet/daily/index.xml
index 37c6e2d6a1f..9d2e769f800 100644
--- a/yasnippet/daily/index.xml
+++ b/yasnippet/daily/index.xml
@@ -1,7 +1,7 @@
GitHub YASnippet Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:40Z
+ 2023-10-11T01:43:21Z
Daily Trending of YASnippet in GitHub
\ No newline at end of file
diff --git a/zap/daily/index.xml b/zap/daily/index.xml
index ae919af4fcd..f07d5fd2558 100644
--- a/zap/daily/index.xml
+++ b/zap/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ZAP Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:44Z
+ 2023-10-11T01:43:24Z
Daily Trending of ZAP in GitHub
\ No newline at end of file
diff --git a/zeek/daily/index.xml b/zeek/daily/index.xml
index bbad8a8d684..43d4f189de0 100644
--- a/zeek/daily/index.xml
+++ b/zeek/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Zeek Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:45Z
+ 2023-10-11T01:43:27Z
Daily Trending of Zeek in GitHub
\ No newline at end of file
diff --git a/zenscript/daily/index.xml b/zenscript/daily/index.xml
index 14a8c9e305c..5f6fcbd116a 100644
--- a/zenscript/daily/index.xml
+++ b/zenscript/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ZenScript Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:46Z
+ 2023-10-11T01:43:26Z
Daily Trending of ZenScript in GitHub
\ No newline at end of file
diff --git a/zephir/daily/index.xml b/zephir/daily/index.xml
index 88295c54db5..a39e85e351f 100644
--- a/zephir/daily/index.xml
+++ b/zephir/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Zephir Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:43Z
+ 2023-10-11T01:43:25Z
Daily Trending of Zephir in GitHub
\ No newline at end of file
diff --git a/zig/daily/index.xml b/zig/daily/index.xml
index e9b78d1b481..f06f99630d0 100644
--- a/zig/daily/index.xml
+++ b/zig/daily/index.xml
@@ -1,14 +1,14 @@
GitHub Zig Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:50Z
+ 2023-10-11T01:43:31Z
Daily Trending of Zig in GitHub
- tr1ckydev/chameleon
- 2023-10-10T01:43:50Z
- tag:github.com,2023-10-10:/tr1ckydev/chameleon
-
- <p>🦎 Terminal string styling for zig.</p><hr>
+ nolanderc/glsl_analyzer
+ 2023-10-11T01:43:31Z
+ tag:github.com,2023-10-11:/nolanderc/glsl_analyzer
+
+ <p>Language server for GLSL (autocomplete, goto-definition, formatter, and more)</p><hr>
\ No newline at end of file
diff --git a/zil/daily/index.xml b/zil/daily/index.xml
index 245499e6b19..8d2a468c1f0 100644
--- a/zil/daily/index.xml
+++ b/zil/daily/index.xml
@@ -1,7 +1,7 @@
GitHub ZIL Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:47Z
+ 2023-10-11T01:43:28Z
Daily Trending of ZIL in GitHub
\ No newline at end of file
diff --git a/zimpl/daily/index.xml b/zimpl/daily/index.xml
index db2b7205929..369d28587d4 100644
--- a/zimpl/daily/index.xml
+++ b/zimpl/daily/index.xml
@@ -1,7 +1,7 @@
GitHub Zimpl Daily Trending
http://mshibanami.github.io/GitHubTrendingRSS
- 2023-10-10T01:43:48Z
+ 2023-10-11T01:43:29Z
Daily Trending of Zimpl in GitHub
\ No newline at end of file